{"version":3,"sources":["node_modules/browser-pack/_prelude.js","package.json","src/style-spec/reference/v8.json","node_modules/@mapbox/gl-matrix/dist/gl-matrix.js","node_modules/@mapbox/shelf-pack/index.umd.js","node_modules/@mapbox/unitbezier/index.js","node_modules/@mapbox/whoots-js/index.umd.js","node_modules/earcut/src/earcut.js","node_modules/geojson-area/index.js","node_modules/geojson-rewind/index.js","node_modules/geojson-vt/src/clip.js","node_modules/geojson-vt/src/convert.js","node_modules/geojson-vt/src/feature.js","node_modules/geojson-vt/src/index.js","node_modules/geojson-vt/src/simplify.js","node_modules/geojson-vt/src/tile.js","node_modules/geojson-vt/src/transform.js","node_modules/geojson-vt/src/wrap.js","node_modules/grid-index/grid-index.js","node_modules/ieee754/index.js","node_modules/kdbush/src/kdbush.js","node_modules/kdbush/src/range.js","node_modules/kdbush/src/sort.js","node_modules/kdbush/src/within.js","node_modules/mapbox-gl-supported/index.js","node_modules/path-browserify/index.js","node_modules/pbf/buffer.js","node_modules/pbf/index.js","node_modules/point-geometry/index.js","node_modules/process/browser.js","node_modules/quickselect/index.js","node_modules/supercluster/index.js","node_modules/tinyqueue/index.js","node_modules/util/node_modules/inherits/inherits_browser.js","node_modules/util/support/isBufferBrowser.js","node_modules/util/util.js","node_modules/vector-tile/index.js","node_modules/vector-tile/lib/vectortile.js","node_modules/vector-tile/lib/vectortilefeature.js","node_modules/vector-tile/lib/vectortilelayer.js","node_modules/vt-pbf/index.js","node_modules/vt-pbf/lib/geojson_wrapper.js","node_modules/vt-pbf/vector-tile-pb.js","node_modules/webworkify/index.js","node_modules/wgs84/index.js","src/data/array_group.js","src/data/bucket.js","src/data/bucket/circle_bucket.js","src/data/bucket/fill_bucket.js","src/data/bucket/fill_extrusion_bucket.js","src/data/bucket/line_bucket.js","src/data/bucket/symbol_bucket.js","src/data/buffer.js","src/data/buffer_group.js","src/data/element_array_type.js","src/data/extent.js","src/data/feature_index.js","src/data/load_geometry.js","src/data/pos_array.js","src/data/program_configuration.js","src/data/raster_bounds_array.js","src/data/vertex_array_type.js","src/geo/coordinate.js","src/geo/lng_lat.js","src/geo/lng_lat_bounds.js","src/geo/transform.js","src/index.js","src/render/draw_background.js","src/render/draw_circle.js","src/render/draw_collision_debug.js","src/render/draw_debug.js","src/render/draw_fill.js","src/render/draw_fill_extrusion.js","src/render/draw_line.js","src/render/draw_raster.js","src/render/draw_symbol.js","src/render/frame_history.js","src/render/line_atlas.js","src/render/painter.js","src/render/pattern.js","src/render/shaders.js","src/render/vertex_array_object.js","src/source/canvas_source.js","src/source/geojson_source.js","src/source/geojson_worker_source.js","src/source/geojson_wrapper.js","src/source/image_source.js","src/source/load_tilejson.js","src/source/pixels_to_tile_units.js","src/source/query_features.js","src/source/raster_tile_source.js","src/source/rtl_text_plugin.js","src/source/source.js","src/source/source_cache.js","src/source/tile.js","src/source/tile_coord.js","src/source/vector_tile_source.js","src/source/vector_tile_worker_source.js","src/source/video_source.js","src/source/worker.js","src/source/worker_tile.js","src/style-spec/deref.js","src/style-spec/diff.js","src/style-spec/error/validation_error.js","src/style-spec/feature_filter/index.js","src/style-spec/function/color_spaces.js","src/style-spec/function/index.js","src/style-spec/group_by_layout.js","src/style-spec/node_modules/csscolorparser/csscolorparser.js","src/style-spec/node_modules/fast-stable-stringify/index.js","src/style-spec/node_modules/lodash._baseisequal/index.js","src/style-spec/node_modules/lodash._bindcallback/index.js","src/style-spec/node_modules/lodash._getnative/index.js","src/style-spec/node_modules/lodash.isarguments/index.js","src/style-spec/node_modules/lodash.isarray/index.js","src/style-spec/node_modules/lodash.isequal/index.js","src/style-spec/node_modules/lodash.istypedarray/index.js","src/style-spec/node_modules/lodash.keys/index.js","src/style-spec/reference/latest.js","src/style-spec/util/extend.js","src/style-spec/util/get_type.js","src/style-spec/util/parse_color.js","src/style-spec/util/ref_properties.js","src/style-spec/util/unbundle_jsonlint.js","src/style-spec/validate/validate.js","src/style-spec/validate/validate_array.js","src/style-spec/validate/validate_boolean.js","src/style-spec/validate/validate_color.js","src/style-spec/validate/validate_constants.js","src/style-spec/validate/validate_enum.js","src/style-spec/validate/validate_filter.js","src/style-spec/validate/validate_function.js","src/style-spec/validate/validate_glyphs_url.js","src/style-spec/validate/validate_layer.js","src/style-spec/validate/validate_layout_property.js","src/style-spec/validate/validate_light.js","src/style-spec/validate/validate_number.js","src/style-spec/validate/validate_object.js","src/style-spec/validate/validate_paint_property.js","src/style-spec/validate/validate_property.js","src/style-spec/validate/validate_source.js","src/style-spec/validate/validate_string.js","src/style-spec/validate_style.min.js","src/style/animation_loop.js","src/style/image_sprite.js","src/style/light.js","src/style/style.js","src/style/style_declaration.js","src/style/style_layer.js","src/style/style_layer/circle_style_layer.js","src/style/style_layer/fill_extrusion_style_layer.js","src/style/style_layer/fill_style_layer.js","src/style/style_layer/line_style_layer.js","src/style/style_layer/symbol_style_layer.js","src/style/style_layer_index.js","src/style/style_transition.js","src/style/validate_style.js","src/symbol/anchor.js","src/symbol/check_max_angle.js","src/symbol/clip_line.js","src/symbol/collision_box.js","src/symbol/collision_feature.js","src/symbol/collision_tile.js","src/symbol/get_anchors.js","src/symbol/glyph_atlas.js","src/symbol/glyph_source.js","src/symbol/mergelines.js","src/symbol/quads.js","src/symbol/resolve_text.js","src/symbol/shaping.js","src/symbol/sprite_atlas.js","src/ui/bind_handlers.js","src/ui/camera.js","src/ui/control/attribution_control.js","src/ui/control/fullscreen_control.js","src/ui/control/geolocate_control.js","src/ui/control/logo_control.js","src/ui/control/navigation_control.js","src/ui/control/scale_control.js","src/ui/handler/box_zoom.js","src/ui/handler/dblclick_zoom.js","src/ui/handler/drag_pan.js","src/ui/handler/drag_rotate.js","src/ui/handler/keyboard.js","src/ui/handler/scroll_zoom.js","src/ui/handler/touch_zoom_rotate.js","src/ui/hash.js","src/ui/map.js","src/ui/marker.js","src/ui/popup.js","src/util/actor.js","src/util/ajax.js","src/util/browser.js","src/util/browser/web_worker.js","src/util/browser/window.js","src/util/classify_rings.js","src/util/config.js","src/util/dictionary_coder.js","src/util/dispatcher.js","src/util/dom.js","src/util/evented.js","src/util/find_pole_of_inaccessibility.js","src/util/global_worker_pool.js","src/util/glyphs.js","src/util/interpolate.js","src/util/intersection_tests.js","src/util/is_char_in_unicode_block.js","src/util/lru_cache.js","src/util/mapbox.js","src/util/script_detection.js","src/util/struct_array.js","src/util/token.js","src/util/util.js","src/util/vectortile_to_geojson.js","src/util/verticalize_punctuation.js","src/util/worker_pool.js"],"names":["global","factory","exports","module","define","amd","glMatrix","this","create","out","Float32Array","transformMat3","a","m","x","y","z","create$1","transformMat4$1","w","create$2","rotate","rad","a0","a1","a2","a3","s","Math","sin","c","cos","scale$2","v","v0","v1","create$3","fromRotation$1","create$4","identity$2","invert$2","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","multiply$4","b","b0","b1","b2","b3","translate$1","scale$4","rotateX$1","rotateZ$1","perspective","fovy","aspect","near","far","f","tan","nf","ortho","left","right","bottom","top","lr","bt","mapboxBuild","vec3","vec4","transformMat4","mat2","scale","mat3","fromRotation","mat4","identity","translate","multiply","rotateX","rotateZ","invert","ShelfPack","ShelfPack$1","h","options","autoResize","shelves","freebins","stats","bins","maxId","Shelf","free","Bin","id","maxw","maxh","refcount","prototype","pack","concat","allocation","results","i","length","width","height","packOne","inPlace","push","w2","h2","j","shelf","max","resize","bin","waste","best","freebin","Infinity","getBin","ref","allocFreebin","allocShelf","h1","w1","index","splice","alloc","unref","clear","UnitBezier","p1x","p1y","p2x","p2y","cx","bx","ax","cy","by","ay","sampleCurveX","t","sampleCurveY","sampleCurveDerivativeX","solveCurveX","epsilon","t0","t1","t2","x2","abs","d2","solve","WhooTS","getURL","baseUrl","layer","url","getTileBBox","format","service","version","request","srs","join","pow","min","getMercCoords","resolution","PI","merc_x","merc_y","Object","defineProperty","value","earcut","data","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","maxX","maxY","size","eliminateHoles","earcutLinked","start","end","clockwise","last","signedArea","insertNode","equals","next","removeNode","filterPoints","again","p","steiner","area","prev","ear","pass","indexCurve","stop","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","zOrder","maxZ","nextZ","prevZ","intersects","locallyInside","isValidDiagonal","splitPolygon","len","list","queue","getLeftmost","sort","compareX","eliminateHole","hole","findHoleBridge","hx","hy","qx","mx","my","tanMin","sortLinked","q","e","tail","numMerges","pSize","qSize","inSize","leftmost","px","py","intersectsPolygon","middleInside","r","p1","p2","q1","q2","inside","Node","an","bp","sum","deviation","polygonArea","trianglesArea","flatten","result","vertices","holes","dimensions","holeIndex","d","geometry","_","type","coordinates","coords","ringArea","wgs84","RADIUS","require","ring","rewind","gj","outer","features","map","curryOuter","correct","correctRings","wind","dir","cw","reverse","geojsonArea","clip","k1","k2","axis","intersect","minAll","maxAll","clipped","feature","slices","clipPoints","clipGeometry","createFeature","tags","slice","ak","closed","bk","points","dist","newSlice","undefined","convert","tolerance","convertFeature","rings","projectedRing","geom","properties","projectPoint","project","Error","geometries","lonlats","projected","simplify","calcSize","log","calcBBox","calcRingBBox","geojsonvt","GeoJSONVT","extend","debug","console","time","z2","maxZoom","extent","tiles","tileCoords","timeEnd","indexMaxZoom","indexMaxPoints","total","wrap","buffer","intersectX","splitTile","numFeatures","numPoints","JSON","stringify","toID","intersectY","dest","src","isClippedSquare","tile","source","transform","point","createTile","solidChildren","cz","stack","solid","pop","tileTolerance","numSimplified","key","floor","tl","bl","tr","br","k3","k4","getTile","parent","z0","x0","y0","maxSqDist","sqDist","sqTolerance","first","getSqSegDist","dx","dy","tx","ty","noSimplify","transformed","addFeature","simplified","simplifiedRing","tileFeature","transformTile","k","transformPoint","round","merged","shiftFeatureCoords","offset","newFeatures","newGeometry","shiftCoords","newPoints","GridIndex","n","padding","cells","ArrayBuffer","arrayBuffer","array","Int32Array","NUM_PARAMS","subarray","keysOffset","bboxesOffset","keys","bboxes","insert","_insertReadonly","uid","x1","y1","y2","_forEachCell","_insertCell","cellIndex","query","Array","call","seenUids","_queryCell","cell","u","fn","arg1","arg2","cx1","_convertToCellCoord","cy1","cx2","cy2","toArrayBuffer","metadataLength","totalCellLength","set","read","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","write","rt","isNaN","LN2","kdbush","getX","getY","nodeSize","ArrayType","KDBush","defaultGetX","defaultGetY","ids","range","within","nextAxis","sortKD","depth","select","inc","exp","sd","sqrt","newLeft","newRight","swapItem","swap","arr","tmp","qy","r2","isSupported","isBrowser","isArraySupported","isFunctionSupported","isObjectSupported","isJSONSupported","isWorkerSupported","isUint8ClampedArraySupported","isWebGLSupportedCached","failIfMajorPerformanceCaveat","window","document","every","filter","forEach","indexOf","lastIndexOf","some","reduce","reduceRight","isArray","Function","bind","getPrototypeOf","getOwnPropertyNames","isSealed","isFrozen","isExtensible","getOwnPropertyDescriptor","defineProperties","seal","freeze","preventExtensions","isWebGLSupportedCache","isWebGLSupported","canvas","createElement","attributes","webGLContextAttributes","probablySupportsContext","supportsContext","getContext","mapboxgl","supported","antialias","alpha","stencil","normalizeArray","parts","allowAboveRoot","up","unshift","xs","res","splitPathRe","splitPath","filename","exec","resolve","resolvedPath","resolvedAbsolute","arguments","path","process","cwd","TypeError","charAt","split","normalize","isAbsolute","trailingSlash","substr","paths","relative","from","to","trim","fromParts","toParts","samePartsLength","outputParts","sep","delimiter","dirname","root","basename","ext","extname","str","Buffer","buf","Uint8Array","readUInt32LE","BufferMethods","writeUInt32LE","readInt32LE","writeInt32LE","readFloatLE","writeFloatLE","readDoubleLE","writeDoubleLE","toString","copy","_isBuffer","encodeString","lead","bytes","charCodeAt","ieee754","lastStr","lastStrEncoded","pos","val","encoding","ch","decodeURIComponent","String","fromCharCode","byteLength","isBuffer","Pbf","readVarintRemainder","pbf","writeBigVarint","realloc","maxPos","reallocForRawMessage","startPos","extraLen","ceil","writePackedVarint","writeVarint","writePackedSVarint","writeSVarint","writePackedFloat","writeFloat","writePackedDouble","writeDouble","writePackedBoolean","writeBoolean","writePackedFixed32","writeFixed32","writePackedSFixed32","writeSFixed32","writePackedFixed64","writeFixed64","writePackedSFixed64","writeSFixed64","Varint","Fixed64","Bytes","Fixed32","SHIFT_LEFT_32","SHIFT_RIGHT_32","POW_2_63","destroy","readFields","readField","readVarint","tag","skip","readMessage","readFixed32","readSFixed32","readFixed64","readSFixed64","readFloat","readDouble","readVarint64","readSVarint","num","readBoolean","Boolean","readString","readBytes","readPackedVarint","readPackedSVarint","readPackedBoolean","readPackedFloat","readPackedDouble","readPackedFixed32","readPackedSFixed32","readPackedFixed64","readPackedSFixed64","writeTag","finish","writeString","writeBytes","writeRawMessage","obj","writeMessage","writeBytesField","writeFixed32Field","writeSFixed32Field","writeFixed64Field","writeSFixed64Field","writeVarintField","writeSVarintField","writeStringField","writeFloatField","writeDoubleField","writeBooleanField","Point","clone","add","_add","sub","_sub","mult","_mult","div","_div","_rotate","matMult","_matMult","unit","_unit","perp","_perp","_round","mag","distSqr","angle","atan2","angleTo","angleWith","angleWithSep","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queueIndex","drainQueue","timeout","run","Item","noop","nextTick","args","apply","title","browser","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","binding","name","chdir","umask","partialSort","compare","defaultCompare","supercluster","SuperCluster","trees","createCluster","zoom","parentId","createPointCluster","lngX","latY","getClusterJSON","cluster","getClusterProperties","xLng","yLat","count","abbrev","cluster_id","point_count","point_count_abbreviated","lng","lat","atan","minZoom","radius","initial","props","load","timerId","clusters","now","Date","_cluster","getClusters","bbox","tree","_limitZoom","getChildren","clusterId","clusterZoom","origin","children","getLeaves","limit","leaves","_appendLeaves","_addTileFeatures","getClusterExpansionZoom","skipped","neighborIds","wx","wy","clusterProperties","_accumulate","numPoints2","TinyQueue","_down","item","_up","peek","ctor","superCtor","super_","constructor","enumerable","writable","configurable","TempCtor","arg","fill","readUInt8","inspect","opts","ctx","seen","stylize","stylizeNoColor","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","style","styles","arrayToHash","hash","idx","recurseTimes","isFunction","ret","isString","primitive","formatPrimitive","visibleKeys","isError","formatError","isRegExp","RegExp","isDate","base","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","replace","isNumber","isNull","l","hasOwnProperty","match","desc","get","line","numLinesEst","cur","ar","isNullOrUndefined","isSymbol","re","isObject","objectToString","isPrimitive","o","pad","timestamp","getHours","getMinutes","getSeconds","getDate","months","getMonth","prop","formatRegExp","objects","Number","deprecate","msg","deprecated","warned","throwDeprecation","traceDeprecation","trace","error","noDeprecation","debugs","debugEnviron","debuglog","NODE_DEBUG","toUpperCase","test","pid","bold","italic","underline","inverse","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","regexp","inherits","VectorTile","VectorTileFeature","VectorTileLayer","layers","readTile","values","_pbf","_geometry","_keys","_values","readFeature","readTag","classifyRings","polygon","ccw","polygons","types","loadGeometry","cmd","lines","cmdLen","toGeoJSON","_features","readLayer","readValueMessage","fromVectorTileJs","prepareLayer","vtpb","fromGeojsonVt","GeoJSONWrapper","preparedLayer","keycache","valuecache","encodeGeometry","keyIndex","wrapValue","valueIndex","command","zigzag","encoded","string_value","bool_value","double_value","sint_value","uint_value","FeatureWrapper","rawGeometry","newRing","coord","readTileField","writeTile","writeLayer","readValue","readValueField","float_value","int_value","writeValue","readFeatureField","writeFeature","readLayerField","GeomType","Unknown","LineString","Polygon","bundleFn","sources","cache","resolveSources","workerSources","depPath","depKey","wkey","cacheKeys","default","random","wcache","skey","scache","URL","webkitURL","mozURL","msURL","blob","Blob","bare","workerUrl","createObjectURL","worker","Worker","objectURL","FLATTENING","POLAR_RADIUS","serializePaintVertexArrays","layerData","transferables","const","paintVertexArrays","layerId","inputArray","paintVertexArray","serialize","ProgramConfiguration","Segment","vertexOffset","primitiveOffset","vertexLength","primitiveLength","ArrayGroup","programInterface","this$1","globalProperties","LayoutVertexArrayType","layoutVertexArrayType","layoutVertexArray","ElementArrayType","elementArrayType","elementArray","ElementArrayType2","elementArrayType2","elementArray2","programConfiguration","createDynamic","paintAttributes","PaintVertexArray","paintPropertyStatistics","createPaintPropertyStatistics","segments","segments2","prepareSegment","numVertices","segment","MAX_VERTEX_ARRAY_LENGTH","prepareSegment2","populatePaintArrays","featureProperties","bytesPerElement","populatePaintArray","isEmpty","BufferGroup","util","Bucket","overscaling","arrays","buffers","populate","featureIndex","getPaintPropertyStatistics","mapObject","layerIds","deserialize","input","serialized","getLayer","bucket","createBucket","i$1","list$1","addCircleVertex","extrudeX","extrudeY","emplaceBack","createVertexArrayType","createElementArrayType","EXTENT","circleInterface","components","property","multiplier","CircleBucket","super","EARCUT_MAX_RINGS","fillInterface","FillBucket","i$2","i$3","triangleSegment","triangleIndex","flattened","i$4","list$2","lineSegment","lineIndex","let","indices","addVertex","vertexArray","nx","ny","nz","FACTOR","isBoundaryEdge","fillExtrusionInterface","FillExtrusionBucket","edgeDistance","bottomRight","triangleIndices","addLineVertex","layoutVertexBuffer","extrude","linesofar","EXTRUDE_SCALE","LINE_DISTANCE_SCALE","COS_HALF_SHARP_CORNER","SHARP_CORNER_OFFSET","LINE_DISTANCE_BUFFER_BITS","MAX_LINE_DISTANCE","lineInterface","LineBucket","layout","cap","miterLimit","roundLimit","addLine","isPolygon","sharpCornerOffset","firstVertex","distance","currentVertex","prevVertex","nextVertex","prevNormal","nextNormal","offsetA","offsetB","beginCap","endCap","startOfLine","e1","e2","e3","joinNormal","cosHalfAngle","miterLength","isSharpCorner","prevSegmentLength","newPrevVertex","addCurrentVertex","middleVertex","currentJoin","direction","bevelLength","lineTurnsLeft","approxFractionalJoinNormal","addPieSliceVertex","nextSegmentLength","newCurrentVertex","normal","endLeft","endRight","ox","oy","minzoom","maxzoom","labelminzoom","labelangle","addCollisionBoxVertex","placementZoom","Anchor","getAnchors","resolveTokens","Quads","Shaping","resolveText","mergeLines","clipLine","scriptDetection","CollisionFeature","findPoleOfInaccessibility","rtlTextPlugin","shapeText","shapeIcon","WritingMode","getGlyphQuads","getIconQuads","symbolInterfaces","glyph","icon","collisionBox","SymbolBucket","collisionBoxArray","sdfIcons","iconsNeedLinear","adjustedTextSize","adjustedIconSize","fontstack","textFont","iconImage","hasText","isLayoutValueFeatureConstant","hasIcon","icons","iconDependencies","stacks","glyphDependencies","text","applyArabicShaping","sourceLayerIndex","statistics","createArrays","prepare","symbolInstances","adjustedTextMaxSize","getLayoutValue","adjustedIconMaxSize","tileSize","tilePixelRatio","compareText","horizontalAlign","verticalAlign","justify","oneEm","lineHeight","maxWidth","spacing","textOffset","textAlongLine","shapedTextOrientations","allowsVerticalWritingMode","horizontal","vertical","shapedIcon","image","iconOffset","sdf","warnOnce","pixelRatio","glyphSize","fontScale","textMaxSize","textBoxScale","textMaxBoxScale","iconBoxScale","symbolMinDistance","avoidEdges","textPadding","iconPadding","textMaxAngle","iconAlongLine","mayOverlap","symbolPlacement","textRepeatDistance","addSymbolInstance","anchor","addToBuffers","anchors","shapedText","anchorIsTooClose","poi","list$3","list$4","i$5","list$5","repeatDistance","otherAnchors","place","collisionTile","showCollisionBoxes","maxScale","aRotated","bRotated","symbolInstance","textCollisionFeature","boxStartIndex","textBoxStartIndex","boxEndIndex","textBoxEndIndex","iconCollisionFeature","iconBoxStartIndex","iconBoxEndIndex","iconWithoutText","textWithoutIcon","glyphScale","placeCollisionFeature","minScale","iconScale","insertCollisionFeature","addSymbols","glyphQuads","writingModes","iconQuads","addToDebugBuffers","quads","keepUpright","alongLine","placementAngle","symbol","anchorAngle","writingMode","tex","anchorPoint","glyphAngle","yStretch","box","placementScale","bucketIndex","writingModeString","parseInt","MAX_INSTANCES","programInterfaces","AttributeType","Int8","Uint8","Int16","Uint16","arrayType","members","itemSize","fromStructArray","gl","bindBuffer","createBuffer","bufferData","STATIC_DRAW","setVertexAttribPointers","program","member","attribIndex","vertexAttribPointer","deleteBuffer","BufferType","VERTEX","ELEMENT","VertexArrayObject","elementBuffer","elementBuffer2","paintVertexBuffer","vaos","createStructArrayType","translateDistance","topDownFeatureComparator","getLineWidth","lineWidth","lineGapWidth","queryGeometry","translateAnchor","bearing","pixelsToTileUnits","translated","translatedRing","offsetLine","newRings","zero","aToB","bToC","featureFilter","Grid","DictionaryCoder","vt","Protobuf","GeoJSONFeature","arraysIntersect","intersection","multiPolygonIntersectsBufferedMultiPoint","multiPolygonIntersectsMultiPolygon","multiPolygonIntersectsBufferedMultiLine","FeatureIndexArray","FeatureIndex","grid","rawTileData","featureIndexArray","bucketLayerIDs","setCollisionTile","styleLayers","vtLayers","sourceLayerCoder","params","additionalRadius","hasLayer","styleLayer","styleLayerDistance","getPaintValue","matching","filterMatching","matchingSymbols","queryRenderedSymbols","filterLayerIDs","previousIndex","layerIDs","sourceLayerName","decode","sourceLayer","layerID","translatedPolygon","halfWidth","lineOffset","typePrefix","circleRadius","geojsonFeature","layerResult","featureConstant","isPaintValueFeatureConstant","createBounds","bits","boundsLookup","15","16","bounds","PosArray","getPaintAttributeValue","attribute","zoomStops","normalizePaintAttribute","isColor","_paintSpecifications","uniforms","interpolationUniforms","pragmas","vertex","fragment","cacheKey","self","attributeConfig","addZoomAttribute","isPaintValueZoomConstant","addPropertyAttribute","addZoomAndPropertyAttribute","createStatic","uniformNames","addUniform","inputName","getPragmas","initialize","numStops","zoomLevels","getPaintValueStopZoomLevels","stopOffset","tName","componentNames","componentName","applyPragmas","shaderType","operation","precision","paintArray","setUniforms","uniform","uniform4fv","uniform1f","stopInterp","getPaintInterpolationT","RasterBoundsArray","alignment","Coordinate","column","row","zoomTo","_zoomTo","LngLat","toArray","LngLatBounds","sw","ne","setSouthWest","setNorthEast","_ne","_sw","sw2","ne2","getCenter","getSouthWest","getNorthEast","getNorthWest","getWest","getNorth","getSouthEast","getEast","getSouth","interp","TileCoord","glmatrix","Transform","renderWorldCopies","_renderWorldCopies","_minZoom","_maxZoom","latRange","_center","_fov","_pitch","_unmodified","prototypeAccessors","worldSize","centerPoint","_calcMatrices","rotationMatrix","pitch","clamp","fov","_zoom","zoomScale","tileZoom","zoomFraction","_constrain","center","coveringZoomLevel","roundZoom","scaleZoom","coveringTiles","actualZ","centerCoord","pointCoordinate","cornerCoords","cover","reparseOverscaled","pixelsToGLUnits","unmodified","lnglat","unproject","setLocationAtPoint","coordinateLocation","locationCoordinate","locationPoint","coordinatePoint","pointLocation","zoomedCoord","targetZ","coord0","coord1","pixelMatrixInverse","w0","z1","pixelMatrix","calculatePosMatrix","tileCoord","toCoordinate","posMatrix","Float64Array","projMatrix","_constraining","sy","sx","lngRange","cameraToCenterDistance","halfFov","groundAngle","topHalfSurfaceDistance","furthestDistance","farZ","verticalScale","workerCount","hardwareConcurrency","Map","NavigationControl","GeolocateControl","AttributionControl","ScaleControl","FullscreenControl","Popup","Marker","Style","Evented","config","setRTLTextPlugin","ACCESS_TOKEN","token","drawBackground","painter","sourceCache","color","paint","opacity","isOpaque","isOpaquePass","disable","STENCIL_TEST","setDepthSublayer","useProgram","basicFillProgramConfiguration","pattern","tileExtentPatternVAO","tileExtentBuffer","u_color","tileExtentVAO","u_opacity","setTile","uniformMatrix4fv","u_matrix","drawArrays","TRIANGLE_STRIP","drawCircles","depthMask","getBucket","uniform1i","u_scale_with_map","uniform2f","u_extrude_scale","uniform2fv","u_devicepixelratio","devicePixelRatio","translatePosMatrix","drawElements","TRIANGLES","UNSIGNED_SHORT","drawCollisionDebug","enable","enableTileClippingMask","u_scale","u_zoom","u_maxzoom","LINES","drawDebug","drawDebugTile","uniform4f","debugVAO","debugBuffer","LINE_STRIP","createTextVerticies","debugTextArray","debugTextBuffer","debugTextVAO","onePixel","translations","translation","baseline","len2","strokes","simplexFont"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","`","g","{","|","}","~","drawFill","drawFillTiles","drawFillTile","getPaintProperty","drawStrokeTile","drawFn","firstTile","setFillProgram","usePattern","u_world","drawingBufferWidth","drawingBufferHeight","programId","prevProgram","currentProgram","draw","DEPTH_TEST","texture","ExtrusionTexture","bindFramebuffer","clearColor","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","drawExtrusion","unbindFramebuffer","renderToMap","fbo","fbos","preFbos","u_height_factor","setLight","light","_lp","calculated","position","lightPos","lightMat","uniform3fv","u_lightpos","u_lightintensity","intensity","u_lightcolor","getViewportTexture","activeTexture","TEXTURE1","bindTexture","TEXTURE_2D","createTexture","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_MAG_FILTER","texImage2D","RGBA","UNSIGNED_BYTE","FRAMEBUFFER","framebufferTexture2D","COLOR_ATTACHMENT0","createFramebuffer","createRenderbuffer","depthRenderBuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","RGBA4","DEPTH_COMPONENT16","framebufferRenderbuffer","DEPTH_ATTACHMENT","bindDefaultFramebuffer","saveViewportTexture","TEXTURE0","u_texture","u_xdim","u_ydim","vao","drawLineTile","programChanged","tileRatioChanged","posA","posB","imagePosA","imagePosB","dasharray","tileRatio","lineAtlas","getDash","widthA","fromScale","widthB","toScale","u_patternscale_a","u_patternscale_b","u_sdfgamma","spriteAtlas","getPosition","u_pattern_size_a","u_pattern_size_b","u_gl_units_to_pixels","u_image","u_tex_y_a","u_tex_y_b","u_mix","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_fade","u_width","u_ratio","prevTileZoom","drawRaster","depthFunc","LESS","minTileZ","drawRasterTile","LEQUAL","getSource","registerFadeDuration","animationLoop","u_brightness_low","u_brightness_high","u_saturation_factor","saturationFactor","u_contrast_factor","contrastFactor","u_spin_weights","spinWeights","parentScaleBy","parentTL","parentTile","findLoadedParent","fade","getFadeValues","u_tl_parent","u_scale_parent","u_buffer_scale","u_fade_t","mix","u_image0","u_image1","boundsBuffer","rasterBoundsBuffer","boundsVAO","rasterBoundsVAO","contrast","saturation","fadeDuration","sinceTile","timeAdded","sinceParent","idealZ","fadeIn","childOpacity","refreshedUponExpiration","drawSymbols","drawAcrossEdges","drawLayerSymbols","isText","rotationAlignment","pitchAlignment","sprite","loaded","rotateWithMap","pitchWithMap","depthOn","prevFontstack","isSDF","setSymbolDrawState","drawTileSymbols","adjustedSize","u_rotate_with_map","u_pitch_with_map","glyphAtlas","glyphSource","getGlyphAtlas","updateTexture","u_texsize","mapMoving","rotating","zooming","iconScaled","iconTransformed","frameHistory","u_fadetexture","zoomAdjust","u_pitch","u_bearing","u_aspect_ratio","haloWidthProperty","hasHalo","gammaScale","u_font_scale","u_gamma_scale","u_is_halo","drawSymbolElements","FrameHistory","changeTimes","changeOpacities","opacities","Uint8ClampedArray","previousZoom","firstFrame","record","duration","timeSince","opacityChange","changed","texSubImage2D","ALPHA","NEAREST","LineAtlas","nextRow","positions","setSprite","addDash","stretch","oddLength","partIndex","distLeft","distRight","signedDistance","distMiddle","distEdge","dirty","REPEAT","SourceCache","shaders","circle","fill-extrusion","raster","background","Painter","reusableTextures","viewport","setup","numSublayers","maxUnderzooming","maxOverzooming","depthEpsilon","lineWidthRange","getParameter","ALIASED_LINE_WIDTH_RANGE","emptyProgramConfiguration","verbose","BLEND","blendFunc","ONE","ONE_MINUS_SRC_ALPHA","_depthMask","tileExtentArray","debugArray","rasterBoundsArray","clearStencil","stencilMask","STENCIL_BUFFER_BIT","clearDepth","_renderTileClippingMasks","colorMask","stencilOp","KEEP","REPLACE","idNext","_tileClippingMaskIDs","stencilFunc","ALWAYS","EQUAL","prepareBuffers","render","getTransition","showOverdrawInspector","depthRange","_order","renderPass","showTileBoundaries","sourceCaches","getVisibleCoordinates","currentLayer","_showOverdrawInspector","_layers","isTileClipped","renderLayer","mask","isHidden","farDepth","nearDepth","matrix","sinA","cosA","translatedMatrix","saveTileTexture","textures","getTileTexture","deleteTexture","enabled","CONSTANT_COLOR","numOverdrawSteps","blendColor","createProgram","configuration","definition","definesSource","toFixed","fragmentSource","prelude","vertexSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","attachShader","vertexShader","VERTEX_SHADER","linkProgram","numAttributes","getProgramParameter","ACTIVE_ATTRIBUTES","getActiveAttrib","getAttribLocation","numUniforms","ACTIVE_UNIFORMS","getActiveUniform","getUniformLocation","_createProgramCached","nextProgram","u_scale_a","u_scale_b","u_tile_units_to_pixels","numTiles","tileSizeAtNearestZoom","pixelX","pixelY","u_pixel_coord_upper","u_pixel_coord_lower","fillOutline","fillOutlinePattern","fillPattern","fillExtrusion","fillExtrusionPattern","extrusionTexture","linePattern","lineSDF","symbolIcon","symbolSDF","boundProgram","boundVertexBuffer","boundVertexBuffer2","boundElementBuffer","boundVertexOffset","vertexBuffer2","extVertexArrayObject","getExtension","isFreshBindRequired","freshBind","bindVertexArrayOES","numPrevAttributes","numNextAttributes","createVertexArrayOES","currentNumAttributes","disableVertexAttribArray","enableVertexAttribArray","deleteVertexArrayOES","ImageSource","CanvasSource","dispatcher","eventedParent","animate","getElementById","_hasInvalidDimensions","fire","loopID","play","_rerender","pause","cancel","_finishLoading","getCanvas","onAdd","_prepareImage","resolveURL","href","GeoJSONSource","setEventedParent","_data","workerOptions","geojsonVtOptions","superclusterOptions","clusterMaxZoom","aggregateBy","clusterRadius","dataType","_updateWorkerData","err","sourceDataType","setData","callback","send","success","workerID","_loaded","loadTile","unloadVectorData","aborted","loadVectorData","redoWhenDone","redoPlacement","abortTile","unloadTile","onRemove","broadcast","ajax","vtpbf","VectorTileWorkerSource","GeoJSONWorkerSource","actor","layerIndex","loadGeoJSON","_geoJSONIndexes","geoJSONTile","geojsonWrapper","_geojsonTileLayer","byteOffset","rawData","superclusterInstance","loadData","handleData","_indexData","indexed","getJSON","parse","removeSource","accumulated","getImage","setCoordinates","cornerZ0Coords","getCoordinatesCenter","_tileCoords","_setTile","maxInt16","buckets","state","HTMLVideoElement","ImageData","HTMLCanvasElement","urls","normalizeURL","normalizeSourceURL","tileJSON","pick","vector_layers","vectorLayers","vectorLayerIds","frame","pixelValue","sortTilesIn","coordA","coordB","mergeRenderedFeatureLayers","tileFeatures","resultFeatures","rendered","tilesIn","renderedFeatureLayers","tileIn","getRenderableIds","getTileByID","dataTiles","dataID","sourceMaxZoom","querySourceFeatures","loadTileJSON","normalizeTileURL","RasterTileSource","scheme","done","img","_refreshExpiredTiles","setExpiryData","cacheControl","expires","LINEAR_MIPMAP_NEAREST","generateMipmap","abort","pluginRequested","pluginBlobURL","evented","registerForPluginAvailability","errorCallback","pluginURL","getArrayBuffer","response","sourceTypes","vector","geojson","video","bindAll","getType","setType","coordinateToTilePoint","compareKeyZoom","isRasterType","Source","Tile","Cache","_sourceLoaded","reload","update","_sourceErrored","_source","_tiles","_cache","_timers","_cacheTimers","_isIdRenderable","getIds","hasData","_coveredTiles","reset","reloadTile","_tileLoaded","previousState","getTime","_setTileReloadTimer","getZoom","findLoadedChildren","maxCoveringZoom","retain","found","minCoveringZoom","has","getWithoutRemoving","updateCacheSize","widthInTiles","heightInTiles","approxTilesInView","commonZoomRange","setMaxSize","visibleCoords","used","addTile","parentsForFading","fromID","fadeEndTime","fadedParent","remove","keysDifference","removeTile","wrapped","cached","uses","expiryTimeout","getExpiryTimeout","_setCacheInvalidationTimer","wrappedId","clearTiles","tileResults","tileSpaceBounds","tileSpaceQueryGeometry","tileResult","CollisionTile","CollisionBoxArray","CLOCK_SKEW_RETRY_TIMEOUT","uniqueId","expirationTime","expiredRequestCount","reloadSymbolData","prior","parsedCC","parseCacheControl","isExpired","delta","edge","scanSpans","e0","ymin","ymax","scanLine","m0","m1","d0","d1","scanTriangle","ab","bc","ca","getQuadkey","quadkey","tileScale","xy","VectorTileSource","_options","reloadCallback","WorkerTile","loading","vectorTile","workerTile","transferrables","vtSource","status","xhr","VideoSource","getVideo","loop","addEventListener","readyState","Actor","StyleLayerIndex","globalRTLTextPlugin","layerIndexes","workerSourceTypes","registerWorkerSource","WorkerSource","registerRTLTextPlugin","processBidirectionalText","setLayers","mapId","getLayerIndex","updateLayers","removedIds","symbolOrder","getWorkerSource","loadWorkerSource","importScripts","loadRTLTextPlugin","recalculateLayers","recalculate","serializeBuckets","layerFamilies","familiesBySource","sourceLayerId","encode","family","visibility","symbolBuckets","deps","glyphs","gotDependency","newStacks","newIcons","deref","refProperties","derefLayers","diffSources","before","after","commands","sourcesRemoved","sourceId","operations","isEqual","addSource","diffLayerPropertyChanges","klass","pluckId","indexById","group","diffLayers","beforeLayer","afterLayer","insertBeforeLayerId","beforeOrder","afterOrder","beforeIndex","afterIndex","tracker","clean","removeLayer","addLayer","setLayoutProperty","setPaintProperty","setFilter","setLayerZoomRange","setLayerProperty","diffStyles","setStyle","setCenter","setZoom","setBearing","setPitch","setGlyphs","transition","setTransition","removeOrAddSourceCommands","beforeLayers","warn","ValidationError","message","__line__","createFilter","compile","op","compileComparisonOp","compileLogicalOp","compileNegation","compileInOp","compileHasOp","compilePropertyReference","checkType","expressions","expression","xyz2lab","t3","lab2xyz","xyz2rgb","rgb2xyz","rgbToLab","rgbColor","Xn","Yn","Zn","labToRgb","labColor","rgbToHcl","rad2deg","hclToRgb","hclColor","deg2rad","lab","forward","hcl","identityFunction","createFunction","parameters","propertySpec","isFunctionDefinition","zoomAndFeatureDependent","stops","featureDependent","zoomDependent","function","parseColor","innerFun","hashedStops","categoricalKeyType","evaluateExponentialFunction","evaluateIntervalFunction","evaluateCategoricalFunction","evaluateIdentityFunction","outputFunction","colorSpace","colorSpaces","colorspace","featureFunctions","featureFunctionStops","isFeatureConstant","isZoomConstant","coalesce","keyType","evaluated","binarySearchForIndex","interpolate","currentValue","upperValue","lowerIndex","upperIndex","currentIndex","inputLower","inputUpper","outputLower","outputUpper","evaluatedLower","evaluatedUpper","interpolateArray","interpolateNumber","ratio","difference","progress","groupByLayout","groups","clamp_css_byte","clamp_css_float","parse_css_int","parseFloat","parse_css_float","css_hue_to_rgb","m2","parseCSSColor","css_str","toLowerCase","kCSSColorTable","iv","ep","fname","transparent","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","sss","objKeys","strReg","strReplace","code","stringSearch","stringReplace","isObjectLike","arraySome","predicate","baseIsEqual","other","customizer","isLoose","stackA","stackB","baseIsEqualDeep","object","equalFunc","objIsArr","othIsArr","objTag","arrayTag","othTag","objToString","argsTag","objectTag","isTypedArray","objIsObj","othIsObj","isSameTag","equalByTag","objIsWrapped","othIsWrapped","equalArrays","equalObjects","arrLength","othLength","arrValue","othValue","boolTag","dateTag","errorTag","numberTag","regexpTag","stringTag","objProps","objLength","othProps","skipCtor","objValue","objCtor","othCtor","objectProto","bindCallback","func","thisArg","argCount","collection","accumulator","getNative","isNative","funcTag","reIsNative","fnToString","reIsHostCtor","isArguments","isArrayLikeObject","propertyIsEnumerable","isArrayLike","isLength","genTag","MAX_SAFE_INTEGER","nativeIsArray","typedArrayTags","mapTag","setTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","baseProperty","getLength","isIndex","reIsUint","shimKeys","keysIn","propsLength","allowIndexes","Ctor","isProto","skipIndexes","nativeKeys","arguments$1","parseColorString","rgba","valueOf","validateFunction","validateObject","VALIDATORS","constants","enum","valueSpec","styleSpec","$version","validate","arraySpec","validateArrayElement","arrayElementValidator","arrayElementSpec","errors","arrayIndex","constantName","unbundle","validateEnum","validateFilter","filter_operator","geometry_type","validateArray","validateNumber","validateFunctionStops","functionType","validateFunctionStop","isZoomAndPropertyFunction","previousStopDomainZoom","previousStopDomainValue","stopDomainValues","objectElementValidators","validateStopDomainValue","functionValueSpec","stopKeyType","isFinite","validateFunctionDefault","isZoomFunction","isPropertyFunction","validateString","validatePaintProperty","validateLayoutProperty","otherLayer","sourceType","layerType","validateProperty","lightSpec","rootType","transitionMatch","minimum","maximum","validateSpec","elementSpecs","elementValidators","objectKey","elementSpecKey","elementSpec","validateElement","required","propertyType","propertyKey","layerSpec","tokenMatch","tokens","source_tile","source_geojson","source_video","source_image","source_canvas","validateStyleMin","latestStyleSpec","$root","validateGlyphsURL","validateConstants","sortErrors","wrapCleanErrors","inner","paintProperty","layoutProperty","AnimationLoop","times","stopped","normalizeSpriteURL","SpritePosition","ImageSprite","retina","imgData","getImageData","toJSON","newSprite","getSpritePosition","validateStyle","StyleDeclaration","StyleTransition","TRANSITION_SUFFIX","Light","lightOptions","_specifications","lightOpts","_validate","_declarations","_transitions","_transitionOptions","getLight","getLightProperty","endsWith","getLightValue","calculate","cartesian","sphericalToCartesian","_applyLightDeclaration","declaration","globalOptions","oldTransition","spec","json","transitionOptions","delay","newTransition","instant","endTime","updateLightTransitions","emitErrors","StyleLayer","GlyphSource","SpriteAtlas","mapbox","Dispatcher","QueryFeatures","MapboxGLFunction","getWorkerPool","diff","supportedDiffOperations","ignoredDiffOperations","stylesheet","zoomHistory","_resetUpdates","isMapboxURL","_rtlTextPluginCallback","stylesheetLoaded","updateClasses","_resolve","normalizeStyleURL","event","_validateLayer","_updatedSources","_serializeLayers","_applyClasses","classes","_updatedAllPaintProps","_updatedPaintProps","all","updatePaintTransitions","paintName","updatePaintTransition","_recalculate","_updateZoomHistory","maxZoomTransitionDuration","zh","lastIntegerZoom","lastIntegerZoomTime","lastZoom","_checkLoaded","_changed","updatedIds","_updatedLayers","_removedLayers","_updatedSymbolOrder","_updateWorkerLayers","action","_reloadSource","_clearSource","setState","nextState","changes","unimplementedOps","builtIns","shouldValidate","isSourceLoaded","layerObject","removed","_updateLayer","moveLayer","newIndex","deepEqual","getFilter","getLayoutProperty","wasFeatureConstant","filterObject","metadata","_flattenRenderedFeatures","sourceResults","sourceResult","layerFeatures","queryRenderedFeatures","includedSources","sourceID","addSourceType","SourceType","workerSourceURL","_update","_remove","_updateSources","_redoPlacement","getIcons","updateSpriteAtlas","addIcons","getGlyphs","fontName","allGlyphs","remaining","getSimpleGlyphs","reference","stopZoomLevels","interpolationAmountStops","functionInterpolationT","calculateInterpolationT","getDeclarationValue","_layoutSpecifications","_paintTransitions","_paintTransitionOptions","_paintDeclarations","_layoutDeclarations","_layoutFunctions","layoutName","_updateLayoutValue","specification","validateStyleKey","declarations","_applyPaintDeclaration","classPaintDeclarations","source-layer","subclasses","LayerClass","CircleStyleLayer","FillExtrusionStyleLayer","FillStyleLayer","declaredValue","LineStyleLayer","SymbolStyleLayer","layerConfigs","layerConfig","_layerConfigs","sourceGroup","sourceLayerFamilies","interpZoomTransitioned","fakeZoomHistory","startTime","zoomTransitioned","_calculateTargetValue","oldValue","easeCubicInOut","timeFraction","emitter","checkMaxAngle","labelLength","windowSize","maxAngle","anchorDistance","recentCorners","recentAngleDelta","current","angleDelta","shift","clippedLines","clippedLine","p0","StructType","anchorPointX","anchorPointY","shaped","boxScale","alignLine","straight","straightLine","_addLineCollisionBoxes","boxSize","step","nBoxes","firstBoxOffset","boxes","segmentLength","boxDistanceToAnchor","segmentBoxDistance","boxAnchorPoint","distanceToInnerEdge","intersectionTests","ignoredGrid","reverseRotationMatrix","tempCollisionBox","edges","collisionFeature","allowOverlap","minPlacementScale","bbox0","bbox1","bbox2","bbox3","blockingBoxes","blocking","blockingAnchorPoint","getPlacementScale","rotatedCollisionBox","edgeBox","sourceLayerFeatures","rotatedQuery","ignoredFeatures","roundedScale","polygonIntersectsPolygon","anchorDiffX","anchorDiffY","s1","s2","s3","s4","collisionFreeScale","blockingMaxScale","boxMaxScale","ignorePlacement","tileExtent","angleWindowSize","isLineContinued","fixedExtraOffset","resample","placeAtMiddle","halfLabelLength","lineLength","markedDistance","segmentDist","SIZE_GROWTH_RATE","DEFAULT_SIZE","MAX_SIZE","GlyphAtlas","atlas","getRects","rects","addGlyph","bitmap","bufferedWidth","bufferedHeight","packWidth","packHeight","rect","target","prevWidth","prevHeight","dst","glyphUrl","subdomains","normalizeGlyphsURL","verticalizePunctuation","Glyphs","SimpleGlyph","advance","atlases","glyphIDs","missing","getGlyph","glyphID","lookup","onRangeLoaded","loadRange","rangeName","mergedFeatures","mergedIndex","mergeFromRight","leftKey","rightKey","rightIndex","mergeFromLeft","leftIndex","getKey","onRight","SymbolQuad","border","iconWidth","iconHeight","textLeft","textRight","textTop","textBottom","textWidth","textHeight","padT","padR","padB","padL","offsetY","offsetX","shaping","textRotate","positionedGlyphs","positionedGlyph","centerX","glyphInstances","labelMinScale","getSegmentGlyphs","otl","otr","obl","obr","instance","glyphMinScale","upsideDown","newAnchorPoint","prevScale","toLocaleUpperCase","toLocaleLowerCase","PositionedGlyph","codePoint","breakLines","lineBreakPoints","lineBreak","substring","verticalHeight","logicalInput","determineLineBreaks","shapeLines","determineAverageLineWidth","totalWidth","lineCount","calculateBadness","targetWidth","penalty","isLastBreak","raggedness","calculatePenalty","nextCodePoint","evaluateBreak","breakIndex","breakX","potentialBreaks","bestPriorBreak","bestBreakBadness","potentialBreak","breakBadness","badness","priorBreak","leastBadBreaks","lastLineBreak","potentialLineBreaks","currentX","whitespace","breakable","charAllowsIdeographicBreaking","yOffset","maxLineLength","lineStartIndex","charHasUprightVerticalOrientation","justifyLine","align","lastAdvance","lineIndent","shiftX","shiftY","PositionedIcon","10","11","12","13","32","38","40","41","43","45","47","173","183","8203","8208","8211","8231","copyBitmap","srcStride","srcX","srcY","dstStride","dstX","dstY","srcI","dstI","shelfPack","images","allocateImage","pixelWidth","pixelHeight","addImage","pixels","HTMLImageElement","isView","Uint32Array","removeImage","srcImg","repeating","allocate","srcImgWidth","dstPos","srcPos","dstImg","linear","filterVal","DOM","handlers","scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate","onMouseOut","fireMouseEvent","onMouseDown","mousePos","el","mouseDown","onMouseUp","isActive","contextMenuEvent","onMouseMove","toElement","parentNode","onTouchStart","fireTouchEvent","touches","tapped","onTouchTimeout","onTouchMove","onTouchEnd","onTouchCancel","onClick","onDblClick","preventDefault","onContextMenu","lngLat","originalEvent","touchPos","singular","curr","lngLats","getCanvasContainer","interactive","Camera","moving","_bearingSnap","bearingSnap","eventData","jumpTo","panBy","panTo","easeTo","zoomIn","zoomOut","getBearing","rotateTo","resetNorth","snapToNorth","getPitch","fitBounds","paddingOffset","lateralPadding","verticalPadding","nw","se","scaleX","scaleY","flyTo","zoomChanged","bearingChanged","pitchChanged","easing","ease","toLngLat","toPoint","startZoom","startBearing","startPitch","_normalizeBearing","around","fromPoint","pitching","smoothEasing","_smoothOutEasing","noMoveStart","_onEaseEnd","_ease","delayEndEvents","_easeToEnd","wasZooming","rho2","u1","sinh","cosh","tanh","speed","curve","rho","wMax","r0","screenSpeed","us","isEasing","_abortFn","isMoving","_finishEase","_finishFn","timed","currentBearing","_prevEase","bezier","getDefaultPosition","compact","_map","_container","classList","_updateAttributions","_updateEditLink","_updateData","_updateCompact","removeChild","_editLink","querySelector","attributions","attribution","attrib","innerHTML","offsetWidth","_fullscreen","_fullscreenchange","className","container","button","_fullscreenButton","setAttribute","_onClickFullscreen","_mapContainer","getContainer","_changeIcon","removeEventListener","_isFullscreen","toggle","exitFullscreen","mozCancelFullScreen","msExitFullscreen","webkitCancelFullScreen","requestFullscreen","mozRequestFullScreen","msRequestFullscreen","webkitRequestFullscreen","checkGeolocationSupport","supportsGeolocation","navigator","permissions","then","geolocation","defaultGeoPositionOptions","enableHighAccuracy","_setupUI","_onSuccess","longitude","latitude","_finish","_onError","_timeoutId","_geolocateButton","watchPosition","_onClickGeolocate","positionOptions","_geolocationWatchID","clearWatch","getCurrentPosition","LogoControl","_updateLogo","childNodes","_logoRequired","appendChild","mapbox_logo","copyMouseEvent","MouseEvent","buttons","bubbles","cancelable","detail","view","screenX","screenY","clientX","clientY","movementX","movementY","ctrlKey","shiftKey","altKey","metaKey","_rotateCompassArrow","_compassArrow","_onContextMenu","_zoomInButton","_createButton","_zoomOutButton","_compass","_onCompassDown","_onCompassMove","_onCompassUp","disableDrag","dispatchEvent","stopPropagation","enableDrag","ariaLabel","updateScale","clientHeight","maxMeters","getDistance","maxFeet","maxMiles","setScale","maxDistance","getRoundNum","latlng1","latlng2","lat1","lat2","acos","pow10","_onMove","BoxZoomHandler","_el","isEnabled","_enabled","_active","_onMouseDown","_onMouseMove","_onKeyDown","_onMouseUp","_startPos","_box","_fireEvent","setTransform","boxZoomBounds","keyCode","DoubleClickZoomHandler","_onDblClick","inertiaLinearity","inertiaEasing","inertiaMaxSpeed","inertiaDeceleration","DragPanHandler","_onDown","_ignoreEvent","_onTouchEnd","_pos","_inertia","_drainInertiaBuffer","_onUp","inertia","flingOffset","flingDuration","velocity","cutoff","DragRotateHandler","_pitchWithRotate","pitchWithRotate","bearingDiff","pitchDiff","mapBearing","previous","flingDiff","sign","eventButton","InstallTrigger","platform","easeOut","panStep","bearingStep","pitchStep","KeyboardHandler","zoomDir","bearingDir","pitchDir","xDir","yDir","easeOptions","ua","userAgent","firefox","safari","ScrollZoomHandler","_onWheel","_aroundCenter","deltaY","deltaMode","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_LINE","wheelDeltaY","timeDelta","_time","_type","_lastValue","_timeout","_onTimeout","targetZoom","significantScaleThreshold","significantRotateThreshold","TouchZoomRotateHandler","_onStart","disableRotation","_rotationDisabled","enableRotation","_startVec","_startScale","_startBearing","_gestureIntent","_onEnd","vec","param","scalingSignificantly","rotatingSignificantly","lastScale","firstScale","scaleOffset","scaleDuration","targetScale","Hash","addTo","_onHashChange","_updateHash","loc","location","history","replaceState","node","bindHandlers","defaultMinZoom","defaultMaxZoom","defaultOptions","attributionControl","preserveDrawingBuffer","trackResize","refreshExpiredTiles","_interactive","_failIfMajorPerformanceCaveat","_preserveDrawingBuffer","_trackResize","maxBounds","setMaxBounds","_setupContainer","_setupPainter","_onWindowOnline","_onWindowResize","_hash","_classes","setClasses","addControl","logoPosition","_onData","_onDataLoading","control","controlElement","positionContainer","_controlPositions","insertBefore","firstChild","removeControl","addClass","_classOptions","removeClass","klasses","uniqueClasses","hasClass","getClasses","_containerDimensions","_resizeCanvas","getBounds","lnglatbounds","setMinZoom","getMinZoom","setMaxZoom","getMaxZoom","isPointLike","_makeQueryGeometry","pointOrBox","isPoint","shouldTryDiff","getStyle","beforeId","_canvasContainer","_canvas","offsetHeight","canvasContainer","_contextLost","_contextRestored","controlContainer","_controlContainer","positionName","_frameId","cancelFrame","_styleDirty","_sourcesDirty","updateStyle","_render","_repaint","extension","loseContext","_showTileBoundaries","_showCollisionBoxes","repaint","_vertices","element","_offset","_onMapClick","_element","_popup","getLngLat","_lngLat","setLngLat","getElement","setPopup","popup","targetElement","contains","togglePopup","getPopup","isOpen","normalizeOffset","cornerOffset","top-left","top-right","bottom-left","bottom-right","convertedOffset","closeButton","closeOnClick","_onClickClose","_content","setText","setDOMContent","createTextNode","setHTML","html","child","frag","createDocumentFragment","temp","htmlNode","_createContent","_closeButton","_tip","offsetedPos","anchorTranslate","callbacks","callbackID","receive","targetMapId","postMessage","sourceMapId","workerSource","sameOrigin","protocol","host","XMLHttpRequest","open","setRequestHeader","onerror","onload","statusText","responseType","getResponseHeader","transparentPngUrl","Image","revokeObjectURL","onloadstart","crossOrigin","performance","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","dur","tick","context","drawImage","supportsWebp","webpImgTest","WebWorkify","workerURL","compareAreas","quickselect","calculateSignedArea","maxRings","API_URL","REQUIRE_ACCESS_TOKEN","strings","_stringToNumber","_numberToString","workerPool","actors","currentActor","workers","acquire","cb","asyncAll","targetID","release","testProp","docStyle","suppressClick","tagName","documentElement","selectProp","userSelect","transformProp","getBoundingClientRect","clientLeft","clientTop","changedTouches","_addEventListener","listener","listenerList","_removeEventListener","_listeners","_oneTimeListeners","listens","listeners","oneTimeListeners","_eventedParent","_eventedParentData","compareMax","Cell","pointToPolygonDist","SQRT2","minDistSq","distToSegmentSquared","getCentroidCell","Queue","polygonRings","outerRing","cellSize","cellQueue","bestCell","numProbes","WorkerPool","globalWorkerPool","readFontstacks","readFontstack","readGlyph","vec2","polygonA","polygonB","polygonContainsPoint","lineIntersectsLine","multiPolygon","pointIntersectsBufferedLine","multiPolygonA","multiPolygonB","multiPolygonContainsPoint","multiLine","lineIntersectsBufferedLine","lineA","lineB","lineSegmentIntersectsLineSegment","isCounterClockwise","radiusSquared","l2","unicodeBlockLookup","Latin-1 Supplement","char","Hangul Jamo","Unified Canadian Aboriginal Syllabics","Unified Canadian Aboriginal Syllabics Extended","General Punctuation","Letterlike Symbols","Number Forms","Miscellaneous Technical","Control Pictures","Optical Character Recognition","Enclosed Alphanumerics","Geometric Shapes","Miscellaneous Symbols","Miscellaneous Symbols and Arrows","CJK Radicals Supplement","Kangxi Radicals","Ideographic Description Characters","CJK Symbols and Punctuation","Hiragana","Katakana","Bopomofo","Hangul Compatibility Jamo","Kanbun","Bopomofo Extended","CJK Strokes","Katakana Phonetic Extensions","Enclosed CJK Letters and Months","CJK Compatibility","CJK Unified Ideographs Extension A","Yijing Hexagram Symbols","CJK Unified Ideographs","Yi Syllables","Yi Radicals","Hangul Jamo Extended-A","Hangul Syllables","Hangul Jamo Extended-B","Private Use Area","CJK Compatibility Ideographs","Vertical Forms","CJK Compatibility Forms","Small Form Variants","Halfwidth and Fullwidth Forms","LRUCache","order","removedData","makeAPIURL","urlObject","accessToken","apiUrlObject","parseUrl","authority","formatUrl","help","replaceTempAccessToken","urlRe","imageExtensionRe","tileURL","sourceURL","suffix","isChar","allowsIdeographicBreaking","chars","charHasNeutralVerticalOrientation","charHasRotatedVerticalOrientation","structArrayTypeCache","maxSize","usedTypes","typeSize","sizeOf","memberOffset","Struct","createGetter","createSetter","StructArrayType","StructArray","createEmplaceBack","_usedTypes","viewTypes","BYTES_PER_ELEMENT","getArrayViewName","usedTypeSizes","argNames","body","argName","createMemberComponentString","component","elementOffset","componentOffset","Int8Array","Uint8Clamped","Int16Array","Uint16Array","Int32","Uint32","Float32","Float64","structArray","_structArray","_pos1","_pos2","_pos4","_pos8","DEFAULT_CAPACITY","RESIZE_MULTIPLIER","isTransferred","capacity","_refreshViews","_trim","oldUint8Array","uint8","startIndex","endIndex","struct","source0","source1","source2","fns","dMax","iterator","warnOnceHistory","isClosedPolygon","spherical","azimuthal","polar","header","$0","$1","$2","$3","maxAge","Feature","vectorTileFeature","_vectorTileFeature","_z","_x","_y","nextCharCode","prevCharCode","canReplacePunctuation","¢","£","¥","¦","¬","¯","–","—","‘","’","“","”","…","‧","₩","、","。","〈","〉","《","》","「","」","『","』","【","】","〔","〕","〖","〗","!","(",")",",","-",".",":",";","<",">","?","[","]","_","{","|","}","⦅","⦆","。","「","」","WebWorker","active","terminate"],"mappings":"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","file":"bundle.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\":{},\">=\":{},\"<\":{},\"<=\":{},\"in\":{},\"!in\":{},\"all\":{},\"any\":{},\"none\":{},\"has\":{},\"!has\":{}}},\"geometry_type\":{\"type\":\"enum\",\"values\":{\"Point\":{},\"LineString\":{},\"Polygon\":{}}},\"function\":{\"stops\":{\"type\":\"array\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0},\"property\":{\"type\":\"string\",\"default\":\"$zoom\"},\"type\":{\"type\":\"enum\",\"values\":{\"identity\":{},\"exponential\":{},\"interval\":{},\"categorical\":{}},\"default\":\"exponential\"},\"colorSpace\":{\"type\":\"enum\",\"values\":{\"rgb\":{},\"lab\":{},\"hcl\":{}},\"default\":\"rgb\"},\"default\":{\"type\":\"*\",\"required\":false}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2},\"light\":{\"anchor\":{\"type\":\"enum\",\"default\":\"viewport\",\"values\":{\"map\":{},\"viewport\":{}},\"transition\":false},\"position\":{\"type\":\"array\",\"default\":[1.15,210,30],\"length\":3,\"value\":\"number\",\"transition\":true,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false},\"color\":{\"type\":\"color\",\"default\":\"#ffffff\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true},\"intensity\":{\"type\":\"number\",\"default\":0.5,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"transition\":true}},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_circle\",\"paint_fill-extrusion\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"default\":true},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"}]},\"fill-outline-color\":{\"type\":\"color\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-pattern\"},{\"fill-antialias\":true}]},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-translate\"]},\"fill-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true}},\"paint_fill-extrusion\":{\"fill-extrusion-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":false,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"fill-extrusion-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"fill-extrusion-pattern\"}]},\"fill-extrusion-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"fill-extrusion-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"fill-extrusion-translate\"]},\"fill-extrusion-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"fill-extrusion-height\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true},\"fill-extrusion-base\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":0,\"minimum\":0,\"units\":\"meters\",\"transition\":true,\"requires\":[\"fill-extrusion-height\"]}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"line-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[{\"!\":\"line-pattern\"}]},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"line-translate\"]},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-offset\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"line-dasharray\":{\"type\":\"array\",\"value\":\"number\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-pattern\"}]},\"line-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true}},\"paint_circle\":{\"circle-radius\":{\"type\":\"number\",\"default\":5,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-blur\":{\"type\":\"number\",\"default\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"circle-translate\"]},\"circle-pitch-scale\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\"},\"circle-stroke-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\"},\"circle-stroke-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true},\"circle-stroke-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true}},\"paint_symbol\":{\"icon-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"icon-image\"]},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"]},\"text-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"property-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"pixels\",\"requires\":[\"text-field\"]},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"values\":{\"map\":{},\"viewport\":{}},\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"]}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"degrees\"},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"zoom-function\":true,\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-saturation\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-contrast\":{\"type\":\"number\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"units\":\"milliseconds\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true,\"requires\":[{\"!\":\"background-pattern\"}]},\"background-pattern\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"zoom-function\":true,\"transition\":true},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"zoom-function\":true,\"transition\":true}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\"}}}","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.glMatrix = factory());\n}(this, (function () { 'use strict';\n\nfunction create() {\n var out = new Float32Array(3);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n return out;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction transformMat3(out, a, m) {\n var x = a[0], y = a[1], z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n\n\n\nvar vec = create();\n\nfunction create$1() {\n var out = new Float32Array(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n return out;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction scale$1(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n\n\n\n\n\n\n\nfunction normalize$1(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var len = x * x + y * y + z * z + w * w;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n }\n return out;\n}\n\n\n\nfunction transformMat4$1(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n\nvar vec$1 = create$1();\n\nfunction create$2() {\n var out = new Float32Array(4);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n\n\n\n\n\n\n\n\n\n\nfunction rotate(out, a, rad) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n return out;\n}\nfunction scale$2(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n v0 = v[0], v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n return out;\n}\n\nfunction create$3() {\n var out = new Float32Array(9);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction fromRotation$1(out, rad) {\n var s = Math.sin(rad), c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n\nfunction create$4() {\n var out = new Float32Array(16);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n\n\n\nfunction identity$2(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\nfunction invert$2(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n\n\nfunction multiply$4(out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\nfunction translate$1(out, a, v) {\n var x = v[0], y = v[1], z = v[2],\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23;\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n return out;\n}\nfunction scale$4(out, a, v) {\n var x = v[0], y = v[1], z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n\nfunction rotateX$1(out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n if (a !== out) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n\nfunction rotateZ$1(out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n if (a !== out) {\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf = 1 / (near - far);\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (2 * far * near) * nf;\n out[15] = 0;\n return out;\n}\n\nfunction ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right),\n bt = 1 / (bottom - top),\n nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n\nvar mapboxBuild = {\n vec3: {\n transformMat3: transformMat3\n },\n vec4: {\n transformMat4: transformMat4$1\n },\n mat2: {\n create: create$2,\n rotate: rotate,\n scale: scale$2\n },\n mat3: {\n create: create$3,\n fromRotation: fromRotation$1\n },\n mat4: {\n create: create$4,\n identity: identity$2,\n translate: translate$1,\n scale: scale$4,\n multiply: multiply$4,\n perspective: perspective,\n rotateX: rotateX$1,\n rotateZ: rotateZ$1,\n invert: invert$2,\n ortho: ortho\n }\n};\n\nreturn mapboxBuild;\n\n})));\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ShelfPack = factory());\n}(this, (function () {\n\n/**\n * Create a new ShelfPack bin allocator.\n *\n * Uses the Shelf Best Height Fit algorithm from\n * http://clb.demon.fi/files/RectangleBinPack.pdf\n *\n * @class ShelfPack\n * @param {number} [w=64] Initial width of the sprite\n * @param {number} [h=64] Initial width of the sprite\n * @param {Object} [options]\n * @param {boolean} [options.autoResize=false] If `true`, the sprite will automatically grow\n * @example\n * var sprite = new ShelfPack(64, 64, { autoResize: false });\n */\nfunction ShelfPack$1(w, h, options) {\n options = options || {};\n this.w = w || 64;\n this.h = h || 64;\n this.autoResize = !!options.autoResize;\n this.shelves = [];\n this.freebins = [];\n this.stats = {};\n this.bins = {};\n this.maxId = 0;\n}\n\n\n/**\n * Batch pack multiple bins into the sprite.\n *\n * @param {Object[]} bins Array of requested bins - each object should have `width`, `height` (or `w`, `h`) properties\n * @param {number} bins[].w Requested bin width\n * @param {number} bins[].h Requested bin height\n * @param {Object} [options]\n * @param {boolean} [options.inPlace=false] If `true`, the supplied bin objects will be updated inplace with `x` and `y` properties\n * @returns {Bin[]} Array of allocated Bins - each Bin is an object with `id`, `x`, `y`, `w`, `h` properties\n * @example\n * var bins = [\n * { id: 1, w: 12, h: 12 },\n * { id: 2, w: 12, h: 16 },\n * { id: 3, w: 12, h: 24 }\n * ];\n * var results = sprite.pack(bins, { inPlace: false });\n */\nShelfPack$1.prototype.pack = function(bins, options) {\n bins = [].concat(bins);\n options = options || {};\n\n var results = [],\n w, h, id, allocation;\n\n for (var i = 0; i < bins.length; i++) {\n w = bins[i].w || bins[i].width;\n h = bins[i].h || bins[i].height;\n id = bins[i].id;\n\n if (w && h) {\n allocation = this.packOne(w, h, id);\n if (!allocation) {\n continue;\n }\n if (options.inPlace) {\n bins[i].x = allocation.x;\n bins[i].y = allocation.y;\n bins[i].id = allocation.id;\n }\n results.push(allocation);\n }\n }\n\n // Shrink the width/height of the sprite to the bare minimum.\n // Since shelf-pack doubles first width, then height when running out of shelf space\n // this can result in fairly large unused space both in width and height if that happens\n // towards the end of bin packing.\n if (this.shelves.length > 0) {\n var w2 = 0;\n var h2 = 0;\n\n for (var j = 0; j < this.shelves.length; j++) {\n var shelf = this.shelves[j];\n h2 += shelf.h;\n w2 = Math.max(shelf.w - shelf.free, w2);\n }\n\n this.resize(w2, h2);\n }\n\n return results;\n};\n\n\n/**\n * Pack a single bin into the sprite.\n *\n * Each bin will have a unique identitifer.\n * If no identifier is supplied in the `id` parameter, one will be created.\n * Note: The supplied `id` is used as an object index, so numeric values are fastest!\n *\n * Bins are automatically refcounted (i.e. a newly packed Bin will have a refcount of 1).\n * When a bin is no longer needed, use the `ShelfPack.unref` function to mark it\n * as unused. When a Bin's refcount decrements to 0, the Bin will be marked\n * as free and its space may be reused by the packing code.\n *\n * @param {number} w Width of the bin to allocate\n * @param {number} h Height of the bin to allocate\n * @param {number|string} [id] Unique identifier for this bin, (if unsupplied, assume it's a new bin and create an id)\n * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties, or `null` if allocation failed\n * @example\n * var results = sprite.packOne(12, 16, 'a');\n */\nShelfPack$1.prototype.packOne = function(w, h, id) {\n var best = { freebin: -1, shelf: -1, waste: Infinity },\n y = 0,\n bin, shelf, waste, i;\n\n // if id was supplied, attempt a lookup..\n if (typeof id === 'string' || typeof id === 'number') {\n bin = this.getBin(id);\n if (bin) { // we packed this bin already\n this.ref(bin);\n return bin;\n }\n if (typeof id === 'number') {\n this.maxId = Math.max(id, this.maxId);\n }\n } else {\n id = ++this.maxId;\n }\n\n // First try to reuse a free bin..\n for (i = 0; i < this.freebins.length; i++) {\n bin = this.freebins[i];\n\n // exactly the right height and width, use it..\n if (h === bin.maxh && w === bin.maxw) {\n return this.allocFreebin(i, w, h, id);\n }\n // not enough height or width, skip it..\n if (h > bin.maxh || w > bin.maxw) {\n continue;\n }\n // extra height or width, minimize wasted area..\n if (h <= bin.maxh && w <= bin.maxw) {\n waste = (bin.maxw * bin.maxh) - (w * h);\n if (waste < best.waste) {\n best.waste = waste;\n best.freebin = i;\n }\n }\n }\n\n // Next find the best shelf..\n for (i = 0; i < this.shelves.length; i++) {\n shelf = this.shelves[i];\n y += shelf.h;\n\n // not enough width on this shelf, skip it..\n if (w > shelf.free) {\n continue;\n }\n // exactly the right height, pack it..\n if (h === shelf.h) {\n return this.allocShelf(i, w, h, id);\n }\n // not enough height, skip it..\n if (h > shelf.h) {\n continue;\n }\n // extra height, minimize wasted area..\n if (h < shelf.h) {\n waste = (shelf.h - h) * w;\n if (waste < best.waste) {\n best.freebin = -1;\n best.waste = waste;\n best.shelf = i;\n }\n }\n }\n\n if (best.freebin !== -1) {\n return this.allocFreebin(best.freebin, w, h, id);\n }\n\n if (best.shelf !== -1) {\n return this.allocShelf(best.shelf, w, h, id);\n }\n\n // No free bins or shelves.. add shelf..\n if (h <= (this.h - y) && w <= this.w) {\n shelf = new Shelf(y, this.w, h);\n return this.allocShelf(this.shelves.push(shelf) - 1, w, h, id);\n }\n\n // No room for more shelves..\n // If `autoResize` option is set, grow the sprite as follows:\n // * double whichever sprite dimension is smaller (`w1` or `h1`)\n // * if sprite dimensions are equal, grow width before height\n // * accomodate very large bin requests (big `w` or `h`)\n if (this.autoResize) {\n var h1, h2, w1, w2;\n\n h1 = h2 = this.h;\n w1 = w2 = this.w;\n\n if (w1 <= h1 || w > w1) { // grow width..\n w2 = Math.max(w, w1) * 2;\n }\n if (h1 < w1 || h > h1) { // grow height..\n h2 = Math.max(h, h1) * 2;\n }\n\n this.resize(w2, h2);\n return this.packOne(w, h, id); // retry\n }\n\n return null;\n};\n\n\n/**\n * Called by packOne() to allocate a bin by reusing an existing freebin\n *\n * @private\n * @param {number} index Index into the `this.freebins` array\n * @param {number} w Width of the bin to allocate\n * @param {number} h Height of the bin to allocate\n * @param {number|string} id Unique identifier for this bin\n * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties\n * @example\n * var bin = sprite.allocFreebin(0, 12, 16, 'a');\n */\nShelfPack$1.prototype.allocFreebin = function (index, w, h, id) {\n var bin = this.freebins.splice(index, 1)[0];\n bin.id = id;\n bin.w = w;\n bin.h = h;\n bin.refcount = 0;\n this.bins[id] = bin;\n this.ref(bin);\n return bin;\n};\n\n\n/**\n * Called by `packOne() to allocate bin on an existing shelf\n *\n * @private\n * @param {number} index Index into the `this.shelves` array\n * @param {number} w Width of the bin to allocate\n * @param {number} h Height of the bin to allocate\n * @param {number|string} id Unique identifier for this bin\n * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties\n * @example\n * var results = sprite.allocShelf(0, 12, 16, 'a');\n */\nShelfPack$1.prototype.allocShelf = function(index, w, h, id) {\n var shelf = this.shelves[index];\n var bin = shelf.alloc(w, h, id);\n this.bins[id] = bin;\n this.ref(bin);\n return bin;\n};\n\n\n/**\n * Return a packed bin given its id, or undefined if the id is not found\n *\n * @param {number|string} id Unique identifier for this bin,\n * @returns {Bin} The requested bin, or undefined if not yet packed\n * @example\n * var b = sprite.getBin('a');\n */\nShelfPack$1.prototype.getBin = function(id) {\n return this.bins[id];\n};\n\n\n/**\n * Increment the ref count of a bin and update statistics.\n *\n * @param {Bin} bin Bin instance\n * @returns {number} New refcount of the bin\n * @example\n * var bin = sprite.getBin('a');\n * sprite.ref(bin);\n */\nShelfPack$1.prototype.ref = function(bin) {\n if (++bin.refcount === 1) { // a new Bin.. record height in stats historgram..\n var h = bin.h;\n this.stats[h] = (this.stats[h] | 0) + 1;\n }\n\n return bin.refcount;\n};\n\n\n/**\n * Decrement the ref count of a bin and update statistics.\n * The bin will be automatically marked as free space once the refcount reaches 0.\n *\n * @param {Bin} bin Bin instance\n * @returns {number} New refcount of the bin\n * @example\n * var bin = sprite.getBin('a');\n * sprite.unref(bin);\n */\nShelfPack$1.prototype.unref = function(bin) {\n if (bin.refcount === 0) {\n return 0;\n }\n\n if (--bin.refcount === 0) {\n this.stats[bin.h]--;\n delete this.bins[bin.id];\n this.freebins.push(bin);\n }\n\n return bin.refcount;\n};\n\n\n/**\n * Clear the sprite. Resets everything and resets statistics.\n *\n * @example\n * sprite.clear();\n */\nShelfPack$1.prototype.clear = function() {\n this.shelves = [];\n this.freebins = [];\n this.stats = {};\n this.bins = {};\n this.maxId = 0;\n};\n\n\n/**\n * Resize the sprite.\n *\n * @param {number} w Requested new sprite width\n * @param {number} h Requested new sprite height\n * @returns {boolean} `true` if resize succeeded, `false` if failed\n * @example\n * sprite.resize(256, 256);\n */\nShelfPack$1.prototype.resize = function(w, h) {\n this.w = w;\n this.h = h;\n for (var i = 0; i < this.shelves.length; i++) {\n this.shelves[i].resize(w);\n }\n return true;\n};\n\n\n/**\n * Create a new Shelf.\n *\n * @private\n * @class Shelf\n * @param {number} y Top coordinate of the new shelf\n * @param {number} w Width of the new shelf\n * @param {number} h Height of the new shelf\n * @example\n * var shelf = new Shelf(64, 512, 24);\n */\nfunction Shelf(y, w, h) {\n this.x = 0;\n this.y = y;\n this.w = this.free = w;\n this.h = h;\n}\n\n\n/**\n * Allocate a single bin into the shelf.\n *\n * @private\n * @param {number} w Width of the bin to allocate\n * @param {number} h Height of the bin to allocate\n * @param {number|string} id Unique id of the bin to allocate\n * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties, or `null` if allocation failed\n * @example\n * shelf.alloc(12, 16, 'a');\n */\nShelf.prototype.alloc = function(w, h, id) {\n if (w > this.free || h > this.h) {\n return null;\n }\n var x = this.x;\n this.x += w;\n this.free -= w;\n return new Bin(id, x, this.y, w, h, w, this.h);\n};\n\n\n/**\n * Resize the shelf.\n *\n * @private\n * @param {number} w Requested new width of the shelf\n * @returns {boolean} true\n * @example\n * shelf.resize(512);\n */\nShelf.prototype.resize = function(w) {\n this.free += (w - this.w);\n this.w = w;\n return true;\n};\n\n\n/**\n * Create a new Bin object.\n *\n * @class Bin\n * @param {number|string} id Unique id of the bin\n * @param {number} x Left coordinate of the bin\n * @param {number} y Top coordinate of the bin\n * @param {number} w Width of the bin\n * @param {number} h Height of the bin\n * @param {number} [maxw] Max width of the bin (defaults to `w` if not provided)\n * @param {number} [maxh] Max height of the bin (defaults to `h` if not provided)\n * @example\n * var bin = new Bin('a', 0, 0, 12, 16);\n */\nfunction Bin(id, x, y, w, h, maxw, maxh) {\n this.id = id;\n this.x = x;\n this.y = y;\n this.w = w;\n this.h = h;\n this.maxw = maxw || w;\n this.maxh = maxh || h;\n this.refcount = 0;\n}\n\nreturn ShelfPack$1;\n\n})));\n","/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Ported from Webkit\n * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h\n */\n\nmodule.exports = UnitBezier;\n\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n this.cx = 3.0 * p1x;\n this.bx = 3.0 * (p2x - p1x) - this.cx;\n this.ax = 1.0 - this.cx - this.bx;\n\n this.cy = 3.0 * p1y;\n this.by = 3.0 * (p2y - p1y) - this.cy;\n this.ay = 1.0 - this.cy - this.by;\n\n this.p1x = p1x;\n this.p1y = p2y;\n this.p2x = p2x;\n this.p2y = p2y;\n}\n\nUnitBezier.prototype.sampleCurveX = function(t) {\n // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n return ((this.ax * t + this.bx) * t + this.cx) * t;\n};\n\nUnitBezier.prototype.sampleCurveY = function(t) {\n return ((this.ay * t + this.by) * t + this.cy) * t;\n};\n\nUnitBezier.prototype.sampleCurveDerivativeX = function(t) {\n return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n};\n\nUnitBezier.prototype.solveCurveX = function(x, epsilon) {\n if (typeof epsilon === 'undefined') epsilon = 1e-6;\n\n var t0, t1, t2, x2, i;\n\n // First try a few iterations of Newton's method -- normally very fast.\n for (t2 = x, i = 0; i < 8; i++) {\n\n x2 = this.sampleCurveX(t2) - x;\n if (Math.abs(x2) < epsilon) return t2;\n\n var d2 = this.sampleCurveDerivativeX(t2);\n if (Math.abs(d2) < 1e-6) break;\n\n t2 = t2 - x2 / d2;\n }\n\n // Fall back to the bisection method for reliability.\n t0 = 0.0;\n t1 = 1.0;\n t2 = x;\n\n if (t2 < t0) return t0;\n if (t2 > t1) return t1;\n\n while (t0 < t1) {\n\n x2 = this.sampleCurveX(t2);\n if (Math.abs(x2 - x) < epsilon) return t2;\n\n if (x > x2) {\n t0 = t2;\n } else {\n t1 = t2;\n }\n\n t2 = (t1 - t0) * 0.5 + t0;\n }\n\n // Failure.\n return t2;\n};\n\nUnitBezier.prototype.solve = function(x, epsilon) {\n return this.sampleCurveY(this.solveCurveX(x, epsilon));\n};\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.WhooTS = global.WhooTS || {})));\n}(this, (function (exports) {\n\n/**\n * getURL\n *\n * @param {String} baseUrl Base url of the WMS server\n * @param {String} layer Layer name\n * @param {Number} x Tile coordinate x\n * @param {Number} y Tile coordinate y\n * @param {Number} z Tile zoom\n * @param {Object} [options]\n * @param {String} [options.format='image/png']\n * @param {String} [options.service='WMS']\n * @param {String} [options.version='1.1.1']\n * @param {String} [options.request='GetMap']\n * @param {String} [options.srs='EPSG:3857']\n * @param {Number} [options.width='256']\n * @param {Number} [options.height='256']\n * @returns {String} url\n * @example\n * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015';\n * var layer = 'Natural2015';\n * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19);\n */\nfunction getURL(baseUrl, layer, x, y, z, options) {\n options = options || {};\n\n var url = baseUrl + '?' + [\n 'bbox=' + getTileBBox(x, y, z),\n 'format=' + (options.format || 'image/png'),\n 'service=' + (options.service || 'WMS'),\n 'version=' + (options.version || '1.1.1'),\n 'request=' + (options.request || 'GetMap'),\n 'srs=' + (options.srs || 'EPSG:3857'),\n 'width=' + (options.width || 256),\n 'height=' + (options.height || 256),\n 'layers=' + layer\n ].join('&');\n\n return url;\n}\n\n\n/**\n * getTileBBox\n *\n * @param {Number} x Tile coordinate x\n * @param {Number} y Tile coordinate y\n * @param {Number} z Tile zoom\n * @returns {String} String of the bounding box\n */\nfunction getTileBBox(x, y, z) {\n // for Google/OSM tile scheme we need to alter the y\n y = (Math.pow(2, z) - y - 1);\n\n var min = getMercCoords(x * 256, y * 256, z),\n max = getMercCoords((x + 1) * 256, (y + 1) * 256, z);\n\n return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1];\n}\n\n\n/**\n * getMercCoords\n *\n * @param {Number} x Pixel coordinate x\n * @param {Number} y Pixel coordinate y\n * @param {Number} z Tile zoom\n * @returns {Array} [x, y]\n */\nfunction getMercCoords(x, y, z) {\n var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z),\n merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0),\n merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0);\n\n return [merc_x, merc_y];\n}\n\nexports.getURL = getURL;\nexports.getTileBBox = getTileBBox;\nexports.getMercCoords = getMercCoords;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\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","var wgs84 = require('wgs84');\n\nmodule.exports.geometry = geometry;\nmodule.exports.ring = ringArea;\n\nfunction geometry(_) {\n if (_.type === 'Polygon') return polygonArea(_.coordinates);\n else if (_.type === 'MultiPolygon') {\n var area = 0;\n for (var i = 0; i < _.coordinates.length; i++) {\n area += polygonArea(_.coordinates[i]);\n }\n return area;\n } else {\n return null;\n }\n}\n\nfunction polygonArea(coords) {\n var area = 0;\n if (coords && coords.length > 0) {\n area += Math.abs(ringArea(coords[0]));\n for (var i = 1; i < coords.length; i++) {\n area -= Math.abs(ringArea(coords[i]));\n }\n }\n return area;\n}\n\n/**\n * Calculate the approximate area of the polygon were it projected onto\n * the earth. Note that this area will be positive if ring is oriented\n * clockwise, otherwise it will be negative.\n *\n * Reference:\n * Robert. G. Chamberlain and William H. Duquette, \"Some Algorithms for\n * Polygons on a Sphere\", JPL Publication 07-03, Jet Propulsion\n * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409\n *\n * Returns:\n * {float} The approximate signed geodesic area of the polygon in square\n * meters.\n */\n\nfunction ringArea(coords) {\n var area = 0;\n\n if (coords.length > 2) {\n var p1, p2;\n for (var i = 0; i < coords.length - 1; i++) {\n p1 = coords[i];\n p2 = coords[i + 1];\n area += rad(p2[0] - p1[0]) * (2 + Math.sin(rad(p1[1])) + Math.sin(rad(p2[1])));\n }\n\n area = area * wgs84.RADIUS * wgs84.RADIUS / 2;\n }\n\n return area;\n}\n\nfunction rad(_) {\n return _ * Math.PI / 180;\n}\n","var geojsonArea = require('geojson-area');\n\nmodule.exports = rewind;\n\nfunction rewind(gj, outer) {\n switch ((gj && gj.type) || null) {\n case 'FeatureCollection':\n gj.features = gj.features.map(curryOuter(rewind, outer));\n return gj;\n case 'Feature':\n gj.geometry = rewind(gj.geometry, outer);\n return gj;\n case 'Polygon':\n case 'MultiPolygon':\n return correct(gj, outer);\n default:\n return gj;\n }\n}\n\nfunction curryOuter(a, b) {\n return function(_) { return a(_, b); };\n}\n\nfunction correct(_, outer) {\n if (_.type === 'Polygon') {\n _.coordinates = correctRings(_.coordinates, outer);\n } else if (_.type === 'MultiPolygon') {\n _.coordinates = _.coordinates.map(curryOuter(correctRings, outer));\n }\n return _;\n}\n\nfunction correctRings(_, outer) {\n outer = !!outer;\n _[0] = wind(_[0], !outer);\n for (var i = 1; i < _.length; i++) {\n _[i] = wind(_[i], outer);\n }\n return _;\n}\n\nfunction wind(_, dir) {\n return cw(_) === dir ? _ : _.reverse();\n}\n\nfunction cw(_) {\n return geojsonArea.ring(_) >= 0;\n}\n","'use strict';\n\nmodule.exports = clip;\n\nvar createFeature = require('./feature');\n\n/* clip features between two axis-parallel lines:\n * | |\n * ___|___ | /\n * / | \\____|____/\n * | |\n */\n\nfunction clip(features, scale, k1, k2, axis, intersect, minAll, maxAll) {\n\n k1 /= scale;\n k2 /= scale;\n\n if (minAll >= k1 && maxAll <= k2) return features; // trivial accept\n else if (minAll > k2 || maxAll < k1) return null; // trivial reject\n\n var clipped = [];\n\n for (var i = 0; i < features.length; i++) {\n\n var feature = features[i],\n geometry = feature.geometry,\n type = feature.type,\n min, max;\n\n min = feature.min[axis];\n max = feature.max[axis];\n\n if (min >= k1 && max <= k2) { // trivial accept\n clipped.push(feature);\n continue;\n } else if (min > k2 || max < k1) continue; // trivial reject\n\n var slices = type === 1 ?\n clipPoints(geometry, k1, k2, axis) :\n clipGeometry(geometry, k1, k2, axis, intersect, type === 3);\n\n if (slices.length) {\n // if a feature got clipped, it will likely get clipped on the next zoom level as well,\n // so there's no need to recalculate bboxes\n clipped.push(createFeature(feature.tags, type, slices, feature.id));\n }\n }\n\n return clipped.length ? clipped : null;\n}\n\nfunction clipPoints(geometry, k1, k2, axis) {\n var slice = [];\n\n for (var i = 0; i < geometry.length; i++) {\n var a = geometry[i],\n ak = a[axis];\n\n if (ak >= k1 && ak <= k2) slice.push(a);\n }\n return slice;\n}\n\nfunction clipGeometry(geometry, k1, k2, axis, intersect, closed) {\n\n var slices = [];\n\n for (var i = 0; i < geometry.length; i++) {\n\n var ak = 0,\n bk = 0,\n b = null,\n points = geometry[i],\n area = points.area,\n dist = points.dist,\n outer = points.outer,\n len = points.length,\n a, j, last;\n\n var slice = [];\n\n for (j = 0; j < len - 1; j++) {\n a = b || points[j];\n b = points[j + 1];\n ak = bk || a[axis];\n bk = b[axis];\n\n if (ak < k1) {\n\n if ((bk > k2)) { // ---|-----|-->\n slice.push(intersect(a, b, k1), intersect(a, b, k2));\n if (!closed) slice = newSlice(slices, slice, area, dist, outer);\n\n } else if (bk >= k1) slice.push(intersect(a, b, k1)); // ---|--> |\n\n } else if (ak > k2) {\n\n if ((bk < k1)) { // <--|-----|---\n slice.push(intersect(a, b, k2), intersect(a, b, k1));\n if (!closed) slice = newSlice(slices, slice, area, dist, outer);\n\n } else if (bk <= k2) slice.push(intersect(a, b, k2)); // | <--|---\n\n } else {\n\n slice.push(a);\n\n if (bk < k1) { // <--|--- |\n slice.push(intersect(a, b, k1));\n if (!closed) slice = newSlice(slices, slice, area, dist, outer);\n\n } else if (bk > k2) { // | ---|-->\n slice.push(intersect(a, b, k2));\n if (!closed) slice = newSlice(slices, slice, area, dist, outer);\n }\n // | --> |\n }\n }\n\n // add the last point\n a = points[len - 1];\n ak = a[axis];\n if (ak >= k1 && ak <= k2) slice.push(a);\n\n // close the polygon if its endpoints are not the same after clipping\n\n last = slice[slice.length - 1];\n if (closed && last && (slice[0][0] !== last[0] || slice[0][1] !== last[1])) slice.push(slice[0]);\n\n // add the final slice\n newSlice(slices, slice, area, dist, outer);\n }\n\n return slices;\n}\n\nfunction newSlice(slices, slice, area, dist, outer) {\n if (slice.length) {\n // we don't recalculate the area/length of the unclipped geometry because the case where it goes\n // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work\n slice.area = area;\n slice.dist = dist;\n if (outer !== undefined) slice.outer = outer;\n\n slices.push(slice);\n }\n return [];\n}\n","'use strict';\n\nmodule.exports = convert;\n\nvar simplify = require('./simplify');\nvar createFeature = require('./feature');\n\n// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data\n\nfunction convert(data, tolerance) {\n var features = [];\n\n if (data.type === 'FeatureCollection') {\n for (var i = 0; i < data.features.length; i++) {\n convertFeature(features, data.features[i], tolerance);\n }\n } else if (data.type === 'Feature') {\n convertFeature(features, data, tolerance);\n\n } else {\n // single geometry or a geometry collection\n convertFeature(features, {geometry: data}, tolerance);\n }\n return features;\n}\n\nfunction convertFeature(features, feature, tolerance) {\n if (feature.geometry === null) {\n // ignore features with null geometry\n return;\n }\n\n var geom = feature.geometry,\n type = geom.type,\n coords = geom.coordinates,\n tags = feature.properties,\n id = feature.id,\n i, j, rings, projectedRing;\n\n if (type === 'Point') {\n features.push(createFeature(tags, 1, [projectPoint(coords)], id));\n\n } else if (type === 'MultiPoint') {\n features.push(createFeature(tags, 1, project(coords), id));\n\n } else if (type === 'LineString') {\n features.push(createFeature(tags, 2, [project(coords, tolerance)], id));\n\n } else if (type === 'MultiLineString' || type === 'Polygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n projectedRing = project(coords[i], tolerance);\n if (type === 'Polygon') projectedRing.outer = (i === 0);\n rings.push(projectedRing);\n }\n features.push(createFeature(tags, type === 'Polygon' ? 3 : 2, rings, id));\n\n } else if (type === 'MultiPolygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n for (j = 0; j < coords[i].length; j++) {\n projectedRing = project(coords[i][j], tolerance);\n projectedRing.outer = (j === 0);\n rings.push(projectedRing);\n }\n }\n features.push(createFeature(tags, 3, rings, id));\n\n } else if (type === 'GeometryCollection') {\n for (i = 0; i < geom.geometries.length; i++) {\n convertFeature(features, {\n geometry: geom.geometries[i],\n properties: tags\n }, tolerance);\n }\n\n } else {\n throw new Error('Input data is not a valid GeoJSON object.');\n }\n}\n\nfunction project(lonlats, tolerance) {\n var projected = [];\n for (var i = 0; i < lonlats.length; i++) {\n projected.push(projectPoint(lonlats[i]));\n }\n if (tolerance) {\n simplify(projected, tolerance);\n calcSize(projected);\n }\n return projected;\n}\n\nfunction projectPoint(p) {\n var sin = Math.sin(p[1] * Math.PI / 180),\n x = (p[0] / 360 + 0.5),\n y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n\n y = y < 0 ? 0 :\n y > 1 ? 1 : y;\n\n return [x, y, 0];\n}\n\n// calculate area and length of the poly\nfunction calcSize(points) {\n var area = 0,\n dist = 0;\n\n for (var i = 0, a, b; i < points.length - 1; i++) {\n a = b || points[i];\n b = points[i + 1];\n\n area += a[0] * b[1] - b[0] * a[1];\n\n // use Manhattan distance instead of Euclidian one to avoid expensive square root computation\n dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]);\n }\n points.area = Math.abs(area / 2);\n points.dist = dist;\n}\n","'use strict';\n\nmodule.exports = createFeature;\n\nfunction createFeature(tags, type, geom, id) {\n var feature = {\n id: id || null,\n type: type,\n geometry: geom,\n tags: tags || null,\n min: [Infinity, Infinity], // initial bbox values\n max: [-Infinity, -Infinity]\n };\n calcBBox(feature);\n return feature;\n}\n\n// calculate the feature bounding box for faster clipping later\nfunction calcBBox(feature) {\n var geometry = feature.geometry,\n min = feature.min,\n max = feature.max;\n\n if (feature.type === 1) {\n calcRingBBox(min, max, geometry);\n } else {\n for (var i = 0; i < geometry.length; i++) {\n calcRingBBox(min, max, geometry[i]);\n }\n }\n\n return feature;\n}\n\nfunction calcRingBBox(min, max, points) {\n for (var i = 0, p; i < points.length; i++) {\n p = points[i];\n min[0] = Math.min(p[0], min[0]);\n max[0] = Math.max(p[0], max[0]);\n min[1] = Math.min(p[1], min[1]);\n max[1] = Math.max(p[1], max[1]);\n }\n}\n","'use strict';\n\nmodule.exports = geojsonvt;\n\nvar convert = require('./convert'), // GeoJSON conversion and preprocessing\n transform = require('./transform'), // coordinate transformation\n clip = require('./clip'), // stripe clipping algorithm\n wrap = require('./wrap'), // date line processing\n createTile = require('./tile'); // final simplified tile generation\n\n\nfunction geojsonvt(data, options) {\n return new GeoJSONVT(data, options);\n}\n\nfunction GeoJSONVT(data, options) {\n options = this.options = extend(Object.create(this.options), options);\n\n var debug = options.debug;\n\n if (debug) console.time('preprocess data');\n\n var z2 = 1 << options.maxZoom, // 2^z\n features = convert(data, options.tolerance / (z2 * options.extent));\n\n this.tiles = {};\n this.tileCoords = [];\n\n if (debug) {\n console.timeEnd('preprocess data');\n console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);\n console.time('generate tiles');\n this.stats = {};\n this.total = 0;\n }\n\n features = wrap(features, options.buffer / options.extent, intersectX);\n\n // start slicing from the top tile down\n if (features.length) this.splitTile(features, 0, 0, 0);\n\n if (debug) {\n if (features.length) console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints);\n console.timeEnd('generate tiles');\n console.log('tiles generated:', this.total, JSON.stringify(this.stats));\n }\n}\n\nGeoJSONVT.prototype.options = {\n maxZoom: 14, // max zoom to preserve detail on\n indexMaxZoom: 5, // max zoom in the tile index\n indexMaxPoints: 100000, // max number of points per tile in the tile index\n solidChildren: false, // whether to tile solid square tiles further\n tolerance: 3, // simplification tolerance (higher means simpler)\n extent: 4096, // tile extent\n buffer: 64, // tile buffer on each side\n debug: 0 // logging level (0, 1 or 2)\n};\n\nGeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {\n\n var stack = [features, z, x, y],\n options = this.options,\n debug = options.debug,\n solid = null;\n\n // avoid recursion by using a processing queue\n while (stack.length) {\n y = stack.pop();\n x = stack.pop();\n z = stack.pop();\n features = stack.pop();\n\n var z2 = 1 << z,\n id = toID(z, x, y),\n tile = this.tiles[id],\n tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * options.extent);\n\n if (!tile) {\n if (debug > 1) console.time('creation');\n\n tile = this.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom);\n this.tileCoords.push({z: z, x: x, y: y});\n\n if (debug) {\n if (debug > 1) {\n console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',\n z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);\n console.timeEnd('creation');\n }\n var key = 'z' + z;\n this.stats[key] = (this.stats[key] || 0) + 1;\n this.total++;\n }\n }\n\n // save reference to original geometry in tile so that we can drill down later if we stop now\n tile.source = features;\n\n // if it's the first-pass tiling\n if (!cz) {\n // stop tiling if we reached max zoom, or if the tile is too simple\n if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue;\n\n // if a drilldown to a specific tile\n } else {\n // stop tiling if we reached base zoom or our target tile zoom\n if (z === options.maxZoom || z === cz) continue;\n\n // stop tiling if it's not an ancestor of the target tile\n var m = 1 << (cz - z);\n if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) continue;\n }\n\n // stop tiling if the tile is solid clipped square\n if (!options.solidChildren && isClippedSquare(tile, options.extent, options.buffer)) {\n if (cz) solid = z; // and remember the zoom if we're drilling down\n continue;\n }\n\n // if we slice further down, no need to keep source geometry\n tile.source = null;\n\n if (debug > 1) console.time('clipping');\n\n // values we'll use for clipping\n var k1 = 0.5 * options.buffer / options.extent,\n k2 = 0.5 - k1,\n k3 = 0.5 + k1,\n k4 = 1 + k1,\n tl, bl, tr, br, left, right;\n\n tl = bl = tr = br = null;\n\n left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]);\n right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]);\n\n if (left) {\n tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (right) {\n tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (debug > 1) console.timeEnd('clipping');\n\n if (features.length) {\n stack.push(tl || [], z + 1, x * 2, y * 2);\n stack.push(bl || [], z + 1, x * 2, y * 2 + 1);\n stack.push(tr || [], z + 1, x * 2 + 1, y * 2);\n stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1);\n }\n }\n\n return solid;\n};\n\nGeoJSONVT.prototype.getTile = function (z, x, y) {\n var options = this.options,\n extent = options.extent,\n debug = options.debug;\n\n var z2 = 1 << z;\n x = ((x % z2) + z2) % z2; // wrap tile x coordinate\n\n var id = toID(z, x, y);\n if (this.tiles[id]) return transform.tile(this.tiles[id], extent);\n\n if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y);\n\n var z0 = z,\n x0 = x,\n y0 = y,\n parent;\n\n while (!parent && z0 > 0) {\n z0--;\n x0 = Math.floor(x0 / 2);\n y0 = Math.floor(y0 / 2);\n parent = this.tiles[toID(z0, x0, y0)];\n }\n\n if (!parent || !parent.source) return null;\n\n // if we found a parent tile containing the original geometry, we can drill down from it\n if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0);\n\n // it parent tile is a solid clipped square, return it instead since it's identical\n if (isClippedSquare(parent, extent, options.buffer)) return transform.tile(parent, extent);\n\n if (debug > 1) console.time('drilling down');\n var solid = this.splitTile(parent.source, z0, x0, y0, z, x, y);\n if (debug > 1) console.timeEnd('drilling down');\n\n // one of the parent tiles was a solid clipped square\n if (solid !== null) {\n var m = 1 << (z - solid);\n id = toID(solid, Math.floor(x / m), Math.floor(y / m));\n }\n\n return this.tiles[id] ? transform.tile(this.tiles[id], extent) : null;\n};\n\nfunction toID(z, x, y) {\n return (((1 << z) * y + x) * 32) + z;\n}\n\nfunction intersectX(a, b, x) {\n return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1];\n}\nfunction intersectY(a, b, y) {\n return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1];\n}\n\nfunction extend(dest, src) {\n for (var i in src) dest[i] = src[i];\n return dest;\n}\n\n// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further\nfunction isClippedSquare(tile, extent, buffer) {\n\n var features = tile.source;\n if (features.length !== 1) return false;\n\n var feature = features[0];\n if (feature.type !== 3 || feature.geometry.length > 1) return false;\n\n var len = feature.geometry[0].length;\n if (len !== 5) return false;\n\n for (var i = 0; i < len; i++) {\n var p = transform.point(feature.geometry[0][i], extent, tile.z2, tile.x, tile.y);\n if ((p[0] !== -buffer && p[0] !== extent + buffer) ||\n (p[1] !== -buffer && p[1] !== extent + buffer)) return false;\n }\n\n return true;\n}\n","'use strict';\n\nmodule.exports = simplify;\n\n// calculate simplification data using optimized Douglas-Peucker algorithm\n\nfunction simplify(points, tolerance) {\n\n var sqTolerance = tolerance * tolerance,\n len = points.length,\n first = 0,\n last = len - 1,\n stack = [],\n i, maxSqDist, sqDist, index;\n\n // always retain the endpoints (1 is the max value)\n points[first][2] = 1;\n points[last][2] = 1;\n\n // avoid recursion by using a stack\n while (last) {\n\n maxSqDist = 0;\n\n for (i = first + 1; i < last; i++) {\n sqDist = getSqSegDist(points[i], points[first], points[last]);\n\n if (sqDist > maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate\n stack.push(first);\n stack.push(index);\n first = index;\n\n } else {\n last = stack.pop();\n first = stack.pop();\n }\n }\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, a, b) {\n\n var x = a[0], y = a[1],\n bx = b[0], by = b[1],\n px = p[0], py = p[1],\n dx = bx - x,\n dy = by - y;\n\n if (dx !== 0 || dy !== 0) {\n\n var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = bx;\n y = by;\n\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = px - x;\n dy = py - y;\n\n return dx * dx + dy * dy;\n}\n","'use strict';\n\nmodule.exports = createTile;\n\nfunction createTile(features, z2, tx, ty, tolerance, noSimplify) {\n var tile = {\n features: [],\n numPoints: 0,\n numSimplified: 0,\n numFeatures: 0,\n source: null,\n x: tx,\n y: ty,\n z2: z2,\n transformed: false,\n min: [2, 1],\n max: [-1, 0]\n };\n for (var i = 0; i < features.length; i++) {\n tile.numFeatures++;\n addFeature(tile, features[i], tolerance, noSimplify);\n\n var min = features[i].min,\n max = features[i].max;\n\n if (min[0] < tile.min[0]) tile.min[0] = min[0];\n if (min[1] < tile.min[1]) tile.min[1] = min[1];\n if (max[0] > tile.max[0]) tile.max[0] = max[0];\n if (max[1] > tile.max[1]) tile.max[1] = max[1];\n }\n return tile;\n}\n\nfunction addFeature(tile, feature, tolerance, noSimplify) {\n\n var geom = feature.geometry,\n type = feature.type,\n simplified = [],\n sqTolerance = tolerance * tolerance,\n i, j, ring, p;\n\n if (type === 1) {\n for (i = 0; i < geom.length; i++) {\n simplified.push(geom[i]);\n tile.numPoints++;\n tile.numSimplified++;\n }\n\n } else {\n\n // simplify and transform projected coordinates for tile geometry\n for (i = 0; i < geom.length; i++) {\n ring = geom[i];\n\n // filter out tiny polylines & polygons\n if (!noSimplify && ((type === 2 && ring.dist < tolerance) ||\n (type === 3 && ring.area < sqTolerance))) {\n tile.numPoints += ring.length;\n continue;\n }\n\n var simplifiedRing = [];\n\n for (j = 0; j < ring.length; j++) {\n p = ring[j];\n // keep points with importance > tolerance\n if (noSimplify || p[2] > sqTolerance) {\n simplifiedRing.push(p);\n tile.numSimplified++;\n }\n tile.numPoints++;\n }\n\n if (type === 3) rewind(simplifiedRing, ring.outer);\n\n simplified.push(simplifiedRing);\n }\n }\n\n if (simplified.length) {\n var tileFeature = {\n geometry: simplified,\n type: type,\n tags: feature.tags || null\n };\n if (feature.id !== null) {\n tileFeature.id = feature.id;\n }\n tile.features.push(tileFeature);\n }\n}\n\nfunction rewind(ring, clockwise) {\n var area = signedArea(ring);\n if (area < 0 === clockwise) ring.reverse();\n}\n\nfunction signedArea(ring) {\n var sum = 0;\n for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);\n }\n return sum;\n}\n","'use strict';\n\nexports.tile = transformTile;\nexports.point = transformPoint;\n\n// Transforms the coordinates of each feature in the given tile from\n// mercator-projected space into (extent x extent) tile space.\nfunction transformTile(tile, extent) {\n if (tile.transformed) return tile;\n\n var z2 = tile.z2,\n tx = tile.x,\n ty = tile.y,\n i, j, k;\n\n for (i = 0; i < tile.features.length; i++) {\n var feature = tile.features[i],\n geom = feature.geometry,\n type = feature.type;\n\n if (type === 1) {\n for (j = 0; j < geom.length; j++) geom[j] = transformPoint(geom[j], extent, z2, tx, ty);\n\n } else {\n for (j = 0; j < geom.length; j++) {\n var ring = geom[j];\n for (k = 0; k < ring.length; k++) ring[k] = transformPoint(ring[k], extent, z2, tx, ty);\n }\n }\n }\n\n tile.transformed = true;\n\n return tile;\n}\n\nfunction transformPoint(p, extent, z2, tx, ty) {\n var x = Math.round(extent * (p[0] * z2 - tx)),\n y = Math.round(extent * (p[1] * z2 - ty));\n return [x, y];\n}\n","'use strict';\n\nvar clip = require('./clip');\nvar createFeature = require('./feature');\n\nmodule.exports = wrap;\n\nfunction wrap(features, buffer, intersectX) {\n var merged = features,\n left = clip(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy\n right = clip(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy\n\n if (left || right) {\n merged = clip(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2) || []; // center world copy\n\n if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center\n if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center\n }\n\n return merged;\n}\n\nfunction shiftFeatureCoords(features, offset) {\n var newFeatures = [];\n\n for (var i = 0; i < features.length; i++) {\n var feature = features[i],\n type = feature.type;\n\n var newGeometry;\n\n if (type === 1) {\n newGeometry = shiftCoords(feature.geometry, offset);\n } else {\n newGeometry = [];\n for (var j = 0; j < feature.geometry.length; j++) {\n newGeometry.push(shiftCoords(feature.geometry[j], offset));\n }\n }\n\n newFeatures.push(createFeature(feature.tags, type, newGeometry, feature.id));\n }\n\n return newFeatures;\n}\n\nfunction shiftCoords(points, offset) {\n var newPoints = [];\n newPoints.area = points.area;\n newPoints.dist = points.dist;\n\n for (var i = 0; i < points.length; i++) {\n newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]);\n }\n return newPoints;\n}\n","'use strict';\n\nmodule.exports = GridIndex;\n\nvar NUM_PARAMS = 3;\n\nfunction GridIndex(extent, n, padding) {\n var cells = this.cells = [];\n\n if (extent instanceof ArrayBuffer) {\n this.arrayBuffer = extent;\n var array = new Int32Array(this.arrayBuffer);\n extent = array[0];\n n = array[1];\n padding = array[2];\n\n this.d = n + 2 * padding;\n for (var k = 0; k < this.d * this.d; k++) {\n var start = array[NUM_PARAMS + k];\n var end = array[NUM_PARAMS + k + 1];\n cells.push(start === end ?\n null :\n array.subarray(start, end));\n }\n var keysOffset = array[NUM_PARAMS + cells.length];\n var bboxesOffset = array[NUM_PARAMS + cells.length + 1];\n this.keys = array.subarray(keysOffset, bboxesOffset);\n this.bboxes = array.subarray(bboxesOffset);\n\n this.insert = this._insertReadonly;\n\n } else {\n this.d = n + 2 * padding;\n for (var i = 0; i < this.d * this.d; i++) {\n cells.push([]);\n }\n this.keys = [];\n this.bboxes = [];\n }\n\n this.n = n;\n this.extent = extent;\n this.padding = padding;\n this.scale = n / extent;\n this.uid = 0;\n\n var p = (padding / n) * extent;\n this.min = -p;\n this.max = extent + p;\n}\n\n\nGridIndex.prototype.insert = function(key, x1, y1, x2, y2) {\n this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++);\n this.keys.push(key);\n this.bboxes.push(x1);\n this.bboxes.push(y1);\n this.bboxes.push(x2);\n this.bboxes.push(y2);\n};\n\nGridIndex.prototype._insertReadonly = function() {\n throw 'Cannot insert into a GridIndex created from an ArrayBuffer.';\n};\n\nGridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) {\n this.cells[cellIndex].push(uid);\n};\n\nGridIndex.prototype.query = function(x1, y1, x2, y2) {\n var min = this.min;\n var max = this.max;\n if (x1 <= min && y1 <= min && max <= x2 && max <= y2) {\n // We use `Array#slice` because `this.keys` may be a `Int32Array` and\n // some browsers (Safari and IE) do not support `TypedArray#slice`\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility\n return Array.prototype.slice.call(this.keys);\n\n } else {\n var result = [];\n var seenUids = {};\n this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids);\n return result;\n }\n};\n\nGridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids) {\n var cell = this.cells[cellIndex];\n if (cell !== null) {\n var keys = this.keys;\n var bboxes = this.bboxes;\n for (var u = 0; u < cell.length; u++) {\n var uid = cell[u];\n if (seenUids[uid] === undefined) {\n var offset = uid * 4;\n if ((x1 <= bboxes[offset + 2]) &&\n (y1 <= bboxes[offset + 3]) &&\n (x2 >= bboxes[offset + 0]) &&\n (y2 >= bboxes[offset + 1])) {\n seenUids[uid] = true;\n result.push(keys[uid]);\n } else {\n seenUids[uid] = false;\n }\n }\n }\n }\n};\n\nGridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2) {\n var cx1 = this._convertToCellCoord(x1);\n var cy1 = this._convertToCellCoord(y1);\n var cx2 = this._convertToCellCoord(x2);\n var cy2 = this._convertToCellCoord(y2);\n for (var x = cx1; x <= cx2; x++) {\n for (var y = cy1; y <= cy2; y++) {\n var cellIndex = this.d * y + x;\n if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2)) return;\n }\n }\n};\n\nGridIndex.prototype._convertToCellCoord = function(x) {\n return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding));\n};\n\nGridIndex.prototype.toArrayBuffer = function() {\n if (this.arrayBuffer) return this.arrayBuffer;\n\n var cells = this.cells;\n\n var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1;\n var totalCellLength = 0;\n for (var i = 0; i < this.cells.length; i++) {\n totalCellLength += this.cells[i].length;\n }\n\n var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length);\n array[0] = this.extent;\n array[1] = this.n;\n array[2] = this.padding;\n\n var offset = metadataLength;\n for (var k = 0; k < cells.length; k++) {\n var cell = cells[k];\n array[NUM_PARAMS + k] = offset;\n array.set(cell, offset);\n offset += cell.length;\n }\n\n array[NUM_PARAMS + cells.length] = offset;\n array.set(this.keys, offset);\n offset += this.keys.length;\n\n array[NUM_PARAMS + cells.length + 1] = offset;\n array.set(this.bboxes, offset);\n offset += this.bboxes.length;\n\n return array.buffer;\n};\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","'use strict';\n\nvar sort = require('./sort');\nvar range = require('./range');\nvar within = require('./within');\n\nmodule.exports = kdbush;\n\nfunction kdbush(points, getX, getY, nodeSize, ArrayType) {\n return new KDBush(points, getX, getY, nodeSize, ArrayType);\n}\n\nfunction KDBush(points, getX, getY, nodeSize, ArrayType) {\n getX = getX || defaultGetX;\n getY = getY || defaultGetY;\n ArrayType = ArrayType || Array;\n\n this.nodeSize = nodeSize || 64;\n this.points = points;\n\n this.ids = new ArrayType(points.length);\n this.coords = new ArrayType(points.length * 2);\n\n for (var i = 0; i < points.length; i++) {\n this.ids[i] = i;\n this.coords[2 * i] = getX(points[i]);\n this.coords[2 * i + 1] = getY(points[i]);\n }\n\n sort(this.ids, this.coords, this.nodeSize, 0, this.ids.length - 1, 0);\n}\n\nKDBush.prototype = {\n range: function (minX, minY, maxX, maxY) {\n return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize);\n },\n\n within: function (x, y, r) {\n return within(this.ids, this.coords, x, y, r, this.nodeSize);\n }\n};\n\nfunction defaultGetX(p) { return p[0]; }\nfunction defaultGetY(p) { return p[1]; }\n","'use strict';\n\nmodule.exports = range;\n\nfunction range(ids, coords, minX, minY, maxX, maxY, nodeSize) {\n var stack = [0, ids.length - 1, 0];\n var result = [];\n var x, y;\n\n while (stack.length) {\n var axis = stack.pop();\n var right = stack.pop();\n var left = stack.pop();\n\n if (right - left <= nodeSize) {\n for (var i = left; i <= right; i++) {\n x = coords[2 * i];\n y = coords[2 * i + 1];\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]);\n }\n continue;\n }\n\n var m = Math.floor((left + right) / 2);\n\n x = coords[2 * m];\n y = coords[2 * m + 1];\n\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]);\n\n var nextAxis = (axis + 1) % 2;\n\n if (axis === 0 ? minX <= x : minY <= y) {\n stack.push(left);\n stack.push(m - 1);\n stack.push(nextAxis);\n }\n if (axis === 0 ? maxX >= x : maxY >= y) {\n stack.push(m + 1);\n stack.push(right);\n stack.push(nextAxis);\n }\n }\n\n return result;\n}\n","'use strict';\n\nmodule.exports = sortKD;\n\nfunction sortKD(ids, coords, nodeSize, left, right, depth) {\n if (right - left <= nodeSize) return;\n\n var m = Math.floor((left + right) / 2);\n\n select(ids, coords, m, left, right, depth % 2);\n\n sortKD(ids, coords, nodeSize, left, m - 1, depth + 1);\n sortKD(ids, coords, nodeSize, m + 1, right, depth + 1);\n}\n\nfunction select(ids, coords, k, left, right, inc) {\n\n while (right > left) {\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp(2 * z / 3);\n var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n select(ids, coords, k, newLeft, newRight, inc);\n }\n\n var t = coords[2 * k + inc];\n var i = left;\n var j = right;\n\n swapItem(ids, coords, left, k);\n if (coords[2 * right + inc] > t) swapItem(ids, coords, left, right);\n\n while (i < j) {\n swapItem(ids, coords, i, j);\n i++;\n j--;\n while (coords[2 * i + inc] < t) i++;\n while (coords[2 * j + inc] > t) j--;\n }\n\n if (coords[2 * left + inc] === t) swapItem(ids, coords, left, j);\n else {\n j++;\n swapItem(ids, coords, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swapItem(ids, coords, i, j) {\n swap(ids, i, j);\n swap(coords, 2 * i, 2 * j);\n swap(coords, 2 * i + 1, 2 * j + 1);\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n","'use strict';\n\nmodule.exports = within;\n\nfunction within(ids, coords, qx, qy, r, nodeSize) {\n var stack = [0, ids.length - 1, 0];\n var result = [];\n var r2 = r * r;\n\n while (stack.length) {\n var axis = stack.pop();\n var right = stack.pop();\n var left = stack.pop();\n\n if (right - left <= nodeSize) {\n for (var i = left; i <= right; i++) {\n if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]);\n }\n continue;\n }\n\n var m = Math.floor((left + right) / 2);\n\n var x = coords[2 * m];\n var y = coords[2 * m + 1];\n\n if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]);\n\n var nextAxis = (axis + 1) % 2;\n\n if (axis === 0 ? qx - r <= x : qy - r <= y) {\n stack.push(left);\n stack.push(m - 1);\n stack.push(nextAxis);\n }\n if (axis === 0 ? qx + r >= x : qy + r >= y) {\n stack.push(m + 1);\n stack.push(right);\n stack.push(nextAxis);\n }\n }\n\n return result;\n}\n\nfunction sqDist(ax, ay, bx, by) {\n var dx = ax - bx;\n var dy = ay - by;\n return dx * dx + dy * dy;\n}\n","'use strict';\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = isSupported;\n} else if (window) {\n window.mapboxgl = window.mapboxgl || {};\n window.mapboxgl.supported = isSupported;\n}\n\n/**\n * Test whether the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n * if the performance of Mapbox GL JS would be dramatically worse than\n * expected (i.e. a software renderer is would be used)\n * @return {boolean}\n */\nfunction isSupported(options) {\n return !!(\n isBrowser() &&\n isArraySupported() &&\n isFunctionSupported() &&\n isObjectSupported() &&\n isJSONSupported() &&\n isWorkerSupported() &&\n isUint8ClampedArraySupported() &&\n isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)\n );\n}\n\nfunction isBrowser() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isArraySupported() {\n return (\n Array.prototype &&\n Array.prototype.every &&\n Array.prototype.filter &&\n Array.prototype.forEach &&\n Array.prototype.indexOf &&\n Array.prototype.lastIndexOf &&\n Array.prototype.map &&\n Array.prototype.some &&\n Array.prototype.reduce &&\n Array.prototype.reduceRight &&\n Array.isArray\n );\n}\n\nfunction isFunctionSupported() {\n return Function.prototype && Function.prototype.bind;\n}\n\nfunction isObjectSupported() {\n return (\n Object.keys &&\n Object.create &&\n Object.getPrototypeOf &&\n Object.getOwnPropertyNames &&\n Object.isSealed &&\n Object.isFrozen &&\n Object.isExtensible &&\n Object.getOwnPropertyDescriptor &&\n Object.defineProperty &&\n Object.defineProperties &&\n Object.seal &&\n Object.freeze &&\n Object.preventExtensions\n );\n}\n\nfunction isJSONSupported() {\n return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;\n}\n\nfunction isWorkerSupported() {\n return 'Worker' in window;\n}\n\n// IE11 only supports `Uint8ClampedArray` as of version\n// [KB2929437](https://support.microsoft.com/en-us/kb/2929437)\nfunction isUint8ClampedArraySupported() {\n return 'Uint8ClampedArray' in window;\n}\n\nvar isWebGLSupportedCache = {};\nfunction isWebGLSupportedCached(failIfMajorPerformanceCaveat) {\n\n if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) {\n isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat);\n }\n\n return isWebGLSupportedCache[failIfMajorPerformanceCaveat];\n}\n\nisSupported.webGLContextAttributes = {\n antialias: false,\n alpha: true,\n stencil: true,\n depth: true\n};\n\nfunction isWebGLSupported(failIfMajorPerformanceCaveat) {\n\n var canvas = document.createElement('canvas');\n\n var attributes = Object.create(isSupported.webGLContextAttributes);\n attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;\n\n if (canvas.probablySupportsContext) {\n return (\n canvas.probablySupportsContext('webgl', attributes) ||\n canvas.probablySupportsContext('experimental-webgl', attributes)\n );\n\n } else if (canvas.supportsContext) {\n return (\n canvas.supportsContext('webgl', attributes) ||\n canvas.supportsContext('experimental-webgl', attributes)\n );\n\n } else {\n return (\n canvas.getContext('webgl', attributes) ||\n canvas.getContext('experimental-webgl', attributes)\n );\n }\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","'use strict';\n\n// lightweight Buffer shim for pbf browser build\n// based on code from github.com/feross/buffer (MIT-licensed)\n\nmodule.exports = Buffer;\n\nvar ieee754 = require('ieee754');\n\nvar BufferMethods;\n\nfunction Buffer(length) {\n var arr;\n if (length && length.length) {\n arr = length;\n length = arr.length;\n }\n var buf = new Uint8Array(length || 0);\n if (arr) buf.set(arr);\n\n buf.readUInt32LE = BufferMethods.readUInt32LE;\n buf.writeUInt32LE = BufferMethods.writeUInt32LE;\n buf.readInt32LE = BufferMethods.readInt32LE;\n buf.writeInt32LE = BufferMethods.writeInt32LE;\n buf.readFloatLE = BufferMethods.readFloatLE;\n buf.writeFloatLE = BufferMethods.writeFloatLE;\n buf.readDoubleLE = BufferMethods.readDoubleLE;\n buf.writeDoubleLE = BufferMethods.writeDoubleLE;\n buf.toString = BufferMethods.toString;\n buf.write = BufferMethods.write;\n buf.slice = BufferMethods.slice;\n buf.copy = BufferMethods.copy;\n\n buf._isBuffer = true;\n return buf;\n}\n\nvar lastStr, lastStrEncoded;\n\nBufferMethods = {\n readUInt32LE: function(pos) {\n return ((this[pos]) |\n (this[pos + 1] << 8) |\n (this[pos + 2] << 16)) +\n (this[pos + 3] * 0x1000000);\n },\n\n writeUInt32LE: function(val, pos) {\n this[pos] = val;\n this[pos + 1] = (val >>> 8);\n this[pos + 2] = (val >>> 16);\n this[pos + 3] = (val >>> 24);\n },\n\n readInt32LE: function(pos) {\n return ((this[pos]) |\n (this[pos + 1] << 8) |\n (this[pos + 2] << 16)) +\n (this[pos + 3] << 24);\n },\n\n readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); },\n readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); },\n\n writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); },\n writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); },\n\n toString: function(encoding, start, end) {\n var str = '',\n tmp = '';\n\n start = start || 0;\n end = Math.min(this.length, end || this.length);\n\n for (var i = start; i < end; i++) {\n var ch = this[i];\n if (ch <= 0x7F) {\n str += decodeURIComponent(tmp) + String.fromCharCode(ch);\n tmp = '';\n } else {\n tmp += '%' + ch.toString(16);\n }\n }\n\n str += decodeURIComponent(tmp);\n\n return str;\n },\n\n write: function(str, pos) {\n var bytes = str === lastStr ? lastStrEncoded : encodeString(str);\n for (var i = 0; i < bytes.length; i++) {\n this[pos + i] = bytes[i];\n }\n },\n\n slice: function(start, end) {\n return this.subarray(start, end);\n },\n\n copy: function(buf, pos) {\n pos = pos || 0;\n for (var i = 0; i < this.length; i++) {\n buf[pos + i] = this[i];\n }\n }\n};\n\nBufferMethods.writeInt32LE = BufferMethods.writeUInt32LE;\n\nBuffer.byteLength = function(str) {\n lastStr = str;\n lastStrEncoded = encodeString(str);\n return lastStrEncoded.length;\n};\n\nBuffer.isBuffer = function(buf) {\n return !!(buf && buf._isBuffer);\n};\n\nfunction encodeString(str) {\n var length = str.length,\n bytes = [];\n\n for (var i = 0, c, lead; i < length; i++) {\n c = str.charCodeAt(i); // code point\n\n if (c > 0xD7FF && c < 0xE000) {\n\n if (lead) {\n if (c < 0xDC00) {\n bytes.push(0xEF, 0xBF, 0xBD);\n lead = c;\n continue;\n\n } else {\n c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n lead = null;\n }\n\n } else {\n if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD);\n else lead = c;\n\n continue;\n }\n\n } else if (lead) {\n bytes.push(0xEF, 0xBF, 0xBD);\n lead = null;\n }\n\n if (c < 0x80) bytes.push(c);\n else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80);\n else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n }\n return bytes;\n}\n","'use strict';\n\nmodule.exports = Pbf;\n\nvar Buffer = global.Buffer || require('./buffer');\n\nfunction Pbf(buf) {\n this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf;\n this.pos = 0;\n this.length = this.buf.length;\n}\n\nPbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\nPbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64\nPbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\nPbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32\n\nvar SHIFT_LEFT_32 = (1 << 16) * (1 << 16),\n SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32,\n POW_2_63 = Math.pow(2, 63);\n\nPbf.prototype = {\n\n destroy: function() {\n this.buf = null;\n },\n\n // === READING =================================================================\n\n readFields: function(readField, result, end) {\n end = end || this.length;\n\n while (this.pos < end) {\n var val = this.readVarint(),\n tag = val >> 3,\n startPos = this.pos;\n\n readField(tag, result, this);\n\n if (this.pos === startPos) this.skip(val);\n }\n return result;\n },\n\n readMessage: function(readField, result) {\n return this.readFields(readField, result, this.readVarint() + this.pos);\n },\n\n readFixed32: function() {\n var val = this.buf.readUInt32LE(this.pos);\n this.pos += 4;\n return val;\n },\n\n readSFixed32: function() {\n var val = this.buf.readInt32LE(this.pos);\n this.pos += 4;\n return val;\n },\n\n // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n\n readFixed64: function() {\n var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n this.pos += 8;\n return val;\n },\n\n readSFixed64: function() {\n var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n this.pos += 8;\n return val;\n },\n\n readFloat: function() {\n var val = this.buf.readFloatLE(this.pos);\n this.pos += 4;\n return val;\n },\n\n readDouble: function() {\n var val = this.buf.readDoubleLE(this.pos);\n this.pos += 8;\n return val;\n },\n\n readVarint: function() {\n var buf = this.buf,\n val, b;\n\n b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val;\n b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val;\n b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;\n b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;\n\n return readVarintRemainder(val, this);\n },\n\n readVarint64: function() {\n var startPos = this.pos,\n val = this.readVarint();\n\n if (val < POW_2_63) return val;\n\n var pos = this.pos - 2;\n while (this.buf[pos] === 0xff) pos--;\n if (pos < startPos) pos = startPos;\n\n val = 0;\n for (var i = 0; i < pos - startPos + 1; i++) {\n var b = ~this.buf[startPos + i] & 0x7f;\n val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7);\n }\n\n return -val - 1;\n },\n\n readSVarint: function() {\n var num = this.readVarint();\n return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n },\n\n readBoolean: function() {\n return Boolean(this.readVarint());\n },\n\n readString: function() {\n var end = this.readVarint() + this.pos,\n str = this.buf.toString('utf8', this.pos, end);\n this.pos = end;\n return str;\n },\n\n readBytes: function() {\n var end = this.readVarint() + this.pos,\n buffer = this.buf.slice(this.pos, end);\n this.pos = end;\n return buffer;\n },\n\n // verbose for performance reasons; doesn't affect gzipped size\n\n readPackedVarint: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readVarint());\n return arr;\n },\n readPackedSVarint: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readSVarint());\n return arr;\n },\n readPackedBoolean: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readBoolean());\n return arr;\n },\n readPackedFloat: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readFloat());\n return arr;\n },\n readPackedDouble: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readDouble());\n return arr;\n },\n readPackedFixed32: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readFixed32());\n return arr;\n },\n readPackedSFixed32: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readSFixed32());\n return arr;\n },\n readPackedFixed64: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readFixed64());\n return arr;\n },\n readPackedSFixed64: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readSFixed64());\n return arr;\n },\n\n skip: function(val) {\n var type = val & 0x7;\n if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}\n else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;\n else if (type === Pbf.Fixed32) this.pos += 4;\n else if (type === Pbf.Fixed64) this.pos += 8;\n else throw new Error('Unimplemented type: ' + type);\n },\n\n // === WRITING =================================================================\n\n writeTag: function(tag, type) {\n this.writeVarint((tag << 3) | type);\n },\n\n realloc: function(min) {\n var length = this.length || 16;\n\n while (length < this.pos + min) length *= 2;\n\n if (length !== this.length) {\n var buf = new Buffer(length);\n this.buf.copy(buf);\n this.buf = buf;\n this.length = length;\n }\n },\n\n finish: function() {\n this.length = this.pos;\n this.pos = 0;\n return this.buf.slice(0, this.length);\n },\n\n writeFixed32: function(val) {\n this.realloc(4);\n this.buf.writeUInt32LE(val, this.pos);\n this.pos += 4;\n },\n\n writeSFixed32: function(val) {\n this.realloc(4);\n this.buf.writeInt32LE(val, this.pos);\n this.pos += 4;\n },\n\n writeFixed64: function(val) {\n this.realloc(8);\n this.buf.writeInt32LE(val & -1, this.pos);\n this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n this.pos += 8;\n },\n\n writeSFixed64: function(val) {\n this.realloc(8);\n this.buf.writeInt32LE(val & -1, this.pos);\n this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n this.pos += 8;\n },\n\n writeVarint: function(val) {\n val = +val;\n\n if (val > 0xfffffff) {\n writeBigVarint(val, this);\n return;\n }\n\n this.realloc(4);\n\n this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;\n this.buf[this.pos++] = (val >>> 7) & 0x7f;\n },\n\n writeSVarint: function(val) {\n this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n },\n\n writeBoolean: function(val) {\n this.writeVarint(Boolean(val));\n },\n\n writeString: function(str) {\n str = String(str);\n var bytes = Buffer.byteLength(str);\n this.writeVarint(bytes);\n this.realloc(bytes);\n this.buf.write(str, this.pos);\n this.pos += bytes;\n },\n\n writeFloat: function(val) {\n this.realloc(4);\n this.buf.writeFloatLE(val, this.pos);\n this.pos += 4;\n },\n\n writeDouble: function(val) {\n this.realloc(8);\n this.buf.writeDoubleLE(val, this.pos);\n this.pos += 8;\n },\n\n writeBytes: function(buffer) {\n var len = buffer.length;\n this.writeVarint(len);\n this.realloc(len);\n for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];\n },\n\n writeRawMessage: function(fn, obj) {\n this.pos++; // reserve 1 byte for short message length\n\n // write the message directly to the buffer and see how much was written\n var startPos = this.pos;\n fn(obj, this);\n var len = this.pos - startPos;\n\n if (len >= 0x80) reallocForRawMessage(startPos, len, this);\n\n // finally, write the message length in the reserved place and restore the position\n this.pos = startPos - 1;\n this.writeVarint(len);\n this.pos += len;\n },\n\n writeMessage: function(tag, fn, obj) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeRawMessage(fn, obj);\n },\n\n writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); },\n writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); },\n writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); },\n writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); },\n writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); },\n writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); },\n writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },\n writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); },\n writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },\n\n writeBytesField: function(tag, buffer) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeBytes(buffer);\n },\n writeFixed32Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeFixed32(val);\n },\n writeSFixed32Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeSFixed32(val);\n },\n writeFixed64Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeFixed64(val);\n },\n writeSFixed64Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeSFixed64(val);\n },\n writeVarintField: function(tag, val) {\n this.writeTag(tag, Pbf.Varint);\n this.writeVarint(val);\n },\n writeSVarintField: function(tag, val) {\n this.writeTag(tag, Pbf.Varint);\n this.writeSVarint(val);\n },\n writeStringField: function(tag, str) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeString(str);\n },\n writeFloatField: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeFloat(val);\n },\n writeDoubleField: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeDouble(val);\n },\n writeBooleanField: function(tag, val) {\n this.writeVarintField(tag, Boolean(val));\n }\n};\n\nfunction readVarintRemainder(val, pbf) {\n var buf = pbf.buf, b;\n\n b = buf[pbf.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val;\n b = buf[pbf.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val;\n b = buf[pbf.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val;\n b = buf[pbf.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val;\n b = buf[pbf.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val;\n b = buf[pbf.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val;\n\n throw new Error('Expected varint not more than 10 bytes');\n}\n\nfunction writeBigVarint(val, pbf) {\n pbf.realloc(10);\n\n var maxPos = pbf.pos + 10;\n\n while (val >= 1) {\n if (pbf.pos >= maxPos) throw new Error('Given varint doesn\\'t fit into 10 bytes');\n var b = val & 0xff;\n pbf.buf[pbf.pos++] = b | (val >= 0x80 ? 0x80 : 0);\n val /= 0x80;\n }\n}\n\nfunction reallocForRawMessage(startPos, len, pbf) {\n var extraLen =\n len <= 0x3fff ? 1 :\n len <= 0x1fffff ? 2 :\n len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));\n\n // if 1 byte isn't enough for encoding message length, shift the data to the right\n pbf.realloc(extraLen);\n for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];\n}\n\nfunction writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); }\nfunction writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); }\nfunction writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); }\nfunction writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); }\nfunction writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); }\nfunction writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); }\nfunction writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }\nfunction writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); }\nfunction writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }\n","'use strict';\n\nmodule.exports = Point;\n\nfunction Point(x, y) {\n this.x = x;\n this.y = y;\n}\n\nPoint.prototype = {\n clone: function() { return new Point(this.x, this.y); },\n\n add: function(p) { return this.clone()._add(p); },\n sub: function(p) { return this.clone()._sub(p); },\n mult: function(k) { return this.clone()._mult(k); },\n div: function(k) { return this.clone()._div(k); },\n rotate: function(a) { return this.clone()._rotate(a); },\n matMult: function(m) { return this.clone()._matMult(m); },\n unit: function() { return this.clone()._unit(); },\n perp: function() { return this.clone()._perp(); },\n round: function() { return this.clone()._round(); },\n\n mag: function() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n\n equals: function(p) {\n return this.x === p.x &&\n this.y === p.y;\n },\n\n dist: function(p) {\n return Math.sqrt(this.distSqr(p));\n },\n\n distSqr: function(p) {\n var dx = p.x - this.x,\n dy = p.y - this.y;\n return dx * dx + dy * dy;\n },\n\n angle: function() {\n return Math.atan2(this.y, this.x);\n },\n\n angleTo: function(b) {\n return Math.atan2(this.y - b.y, this.x - b.x);\n },\n\n angleWith: function(b) {\n return this.angleWithSep(b.x, b.y);\n },\n\n // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ.\n angleWithSep: function(x, y) {\n return Math.atan2(\n this.x * y - this.y * x,\n this.x * x + this.y * y);\n },\n\n _matMult: function(m) {\n var x = m[0] * this.x + m[1] * this.y,\n y = m[2] * this.x + m[3] * this.y;\n this.x = x;\n this.y = y;\n return this;\n },\n\n _add: function(p) {\n this.x += p.x;\n this.y += p.y;\n return this;\n },\n\n _sub: function(p) {\n this.x -= p.x;\n this.y -= p.y;\n return this;\n },\n\n _mult: function(k) {\n this.x *= k;\n this.y *= k;\n return this;\n },\n\n _div: function(k) {\n this.x /= k;\n this.y /= k;\n return this;\n },\n\n _unit: function() {\n this._div(this.mag());\n return this;\n },\n\n _perp: function() {\n var y = this.y;\n this.y = this.x;\n this.x = -y;\n return this;\n },\n\n _rotate: function(angle) {\n var cos = Math.cos(angle),\n sin = Math.sin(angle),\n x = cos * this.x - sin * this.y,\n y = sin * this.x + cos * this.y;\n this.x = x;\n this.y = y;\n return this;\n },\n\n _round: function() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n};\n\n// constructs Point from an array if necessary\nPoint.convert = function (a) {\n if (a instanceof Point) {\n return a;\n }\n if (Array.isArray(a)) {\n return new Point(a[0], a[1]);\n }\n return a;\n};\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nmodule.exports = partialSort;\n\n// Floyd-Rivest selection algorithm:\n// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];\n// The k-th element will have the (k - left + 1)th smallest value in [left, right]\n\nfunction partialSort(arr, k, left, right, compare) {\n left = left || 0;\n right = right || (arr.length - 1);\n compare = compare || defaultCompare;\n\n while (right > left) {\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp(2 * z / 3);\n var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n partialSort(arr, k, newLeft, newRight, compare);\n }\n\n var t = arr[k];\n var i = left;\n var j = right;\n\n swap(arr, left, k);\n if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (compare(arr[i], t) < 0) i++;\n while (compare(arr[j], t) > 0) j--;\n }\n\n if (compare(arr[left], t) === 0) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","'use strict';\n\nvar kdbush = require('kdbush');\n\nmodule.exports = supercluster;\n\nfunction supercluster(options) {\n return new SuperCluster(options);\n}\n\nfunction SuperCluster(options) {\n this.options = extend(Object.create(this.options), options);\n this.trees = new Array(this.options.maxZoom + 1);\n}\n\nSuperCluster.prototype = {\n options: {\n minZoom: 0, // min zoom to generate clusters on\n maxZoom: 16, // max zoom level to cluster the points on\n radius: 40, // cluster radius in pixels\n extent: 512, // tile extent (radius is calculated relative to it)\n nodeSize: 64, // size of the KD-tree leaf node, affects performance\n log: false, // whether to log timing info\n\n // a reduce function for calculating custom cluster properties\n reduce: null, // function (accumulated, props) { accumulated.sum += props.sum; }\n\n // initial properties of a cluster (before running the reducer)\n initial: function () { return {}; }, // function () { return {sum: 0}; },\n\n // properties to use for individual points when running the reducer\n map: function (props) { return props; } // function (props) { return {sum: props.my_value}; },\n },\n\n load: function (points) {\n var log = this.options.log;\n\n if (log) console.time('total time');\n\n var timerId = 'prepare ' + points.length + ' points';\n if (log) console.time(timerId);\n\n this.points = points;\n\n // generate a cluster object for each point\n var clusters = points.map(createPointCluster);\n if (log) console.timeEnd(timerId);\n\n // cluster points on max zoom, then cluster the results on previous zoom, etc.;\n // results in a cluster hierarchy across zoom levels\n for (var z = this.options.maxZoom; z >= this.options.minZoom; z--) {\n var now = +Date.now();\n\n // index input points into a KD-tree\n this.trees[z + 1] = kdbush(clusters, getX, getY, this.options.nodeSize, Float32Array);\n\n clusters = this._cluster(clusters, z); // create a new set of clusters for the zoom\n\n if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now);\n }\n\n // index top-level clusters\n this.trees[this.options.minZoom] = kdbush(clusters, getX, getY, this.options.nodeSize, Float32Array);\n\n if (log) console.timeEnd('total time');\n\n return this;\n },\n\n getClusters: function (bbox, zoom) {\n var tree = this.trees[this._limitZoom(zoom)];\n var ids = tree.range(lngX(bbox[0]), latY(bbox[3]), lngX(bbox[2]), latY(bbox[1]));\n var clusters = [];\n for (var i = 0; i < ids.length; i++) {\n var c = tree.points[ids[i]];\n clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.id]);\n }\n return clusters;\n },\n\n getChildren: function (clusterId, clusterZoom) {\n var origin = this.trees[clusterZoom + 1].points[clusterId];\n var r = this.options.radius / (this.options.extent * Math.pow(2, clusterZoom));\n var points = this.trees[clusterZoom + 1].within(origin.x, origin.y, r);\n var children = [];\n for (var i = 0; i < points.length; i++) {\n var c = this.trees[clusterZoom + 1].points[points[i]];\n if (c.parentId === clusterId) {\n children.push(c.numPoints ? getClusterJSON(c) : this.points[c.id]);\n }\n }\n return children;\n },\n\n getLeaves: function (clusterId, clusterZoom, limit, offset) {\n limit = limit || 10;\n offset = offset || 0;\n\n var leaves = [];\n this._appendLeaves(leaves, clusterId, clusterZoom, limit, offset, 0);\n\n return leaves;\n },\n\n getTile: function (z, x, y) {\n var tree = this.trees[this._limitZoom(z)];\n var z2 = Math.pow(2, z);\n var extent = this.options.extent;\n var r = this.options.radius;\n var p = r / extent;\n var top = (y - p) / z2;\n var bottom = (y + 1 + p) / z2;\n\n var tile = {\n features: []\n };\n\n this._addTileFeatures(\n tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom),\n tree.points, x, y, z2, tile);\n\n if (x === 0) {\n this._addTileFeatures(\n tree.range(1 - p / z2, top, 1, bottom),\n tree.points, z2, y, z2, tile);\n }\n if (x === z2 - 1) {\n this._addTileFeatures(\n tree.range(0, top, p / z2, bottom),\n tree.points, -1, y, z2, tile);\n }\n\n return tile.features.length ? tile : null;\n },\n\n getClusterExpansionZoom: function (clusterId, clusterZoom) {\n while (clusterZoom < this.options.maxZoom) {\n var children = this.getChildren(clusterId, clusterZoom);\n clusterZoom++;\n if (children.length !== 1) break;\n clusterId = children[0].properties.cluster_id;\n }\n return clusterZoom;\n },\n\n _appendLeaves: function (result, clusterId, clusterZoom, limit, offset, skipped) {\n var children = this.getChildren(clusterId, clusterZoom);\n\n for (var i = 0; i < children.length; i++) {\n var props = children[i].properties;\n\n if (props.cluster) {\n if (skipped + props.point_count <= offset) {\n // skip the whole cluster\n skipped += props.point_count;\n } else {\n // enter the cluster\n skipped = this._appendLeaves(\n result, props.cluster_id, clusterZoom + 1, limit, offset, skipped);\n // exit the cluster\n }\n } else if (skipped < offset) {\n // skip a single point\n skipped++;\n } else {\n // add a single point\n result.push(children[i]);\n }\n if (result.length === limit) break;\n }\n\n return skipped;\n },\n\n _addTileFeatures: function (ids, points, x, y, z2, tile) {\n for (var i = 0; i < ids.length; i++) {\n var c = points[ids[i]];\n tile.features.push({\n type: 1,\n geometry: [[\n Math.round(this.options.extent * (c.x * z2 - x)),\n Math.round(this.options.extent * (c.y * z2 - y))\n ]],\n tags: c.numPoints ? getClusterProperties(c) : this.points[c.id].properties\n });\n }\n },\n\n _limitZoom: function (z) {\n return Math.max(this.options.minZoom, Math.min(z, this.options.maxZoom + 1));\n },\n\n _cluster: function (points, zoom) {\n var clusters = [];\n var r = this.options.radius / (this.options.extent * Math.pow(2, zoom));\n\n // loop through each point\n for (var i = 0; i < points.length; i++) {\n var p = points[i];\n // if we've already visited the point at this zoom level, skip it\n if (p.zoom <= zoom) continue;\n p.zoom = zoom;\n\n // find all nearby points\n var tree = this.trees[zoom + 1];\n var neighborIds = tree.within(p.x, p.y, r);\n\n var numPoints = p.numPoints || 1;\n var wx = p.x * numPoints;\n var wy = p.y * numPoints;\n\n var clusterProperties = null;\n\n if (this.options.reduce) {\n clusterProperties = this.options.initial();\n this._accumulate(clusterProperties, p);\n }\n\n for (var j = 0; j < neighborIds.length; j++) {\n var b = tree.points[neighborIds[j]];\n // filter out neighbors that are too far or already processed\n if (zoom < b.zoom) {\n var numPoints2 = b.numPoints || 1;\n b.zoom = zoom; // save the zoom (so it doesn't get processed twice)\n wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center\n wy += b.y * numPoints2;\n numPoints += numPoints2;\n b.parentId = i;\n\n if (this.options.reduce) {\n this._accumulate(clusterProperties, b);\n }\n }\n }\n\n if (numPoints === 1) {\n clusters.push(p);\n } else {\n p.parentId = i;\n clusters.push(createCluster(wx / numPoints, wy / numPoints, numPoints, i, clusterProperties));\n }\n }\n\n return clusters;\n },\n\n _accumulate: function (clusterProperties, point) {\n var properties = point.numPoints ?\n point.properties :\n this.options.map(this.points[point.id].properties);\n\n this.options.reduce(clusterProperties, properties);\n }\n};\n\nfunction createCluster(x, y, numPoints, id, properties) {\n return {\n x: x, // weighted cluster center\n y: y,\n zoom: Infinity, // the last zoom the cluster was processed at\n id: id, // index of the first child of the cluster in the zoom level tree\n properties: properties,\n parentId: -1, // parent cluster id\n numPoints: numPoints\n };\n}\n\nfunction createPointCluster(p, id) {\n var coords = p.geometry.coordinates;\n return {\n x: lngX(coords[0]), // projected point coordinates\n y: latY(coords[1]),\n zoom: Infinity, // the last zoom the point was processed at\n id: id, // index of the source feature in the original input array\n parentId: -1 // parent cluster id\n };\n}\n\nfunction getClusterJSON(cluster) {\n return {\n type: 'Feature',\n properties: getClusterProperties(cluster),\n geometry: {\n type: 'Point',\n coordinates: [xLng(cluster.x), yLat(cluster.y)]\n }\n };\n}\n\nfunction getClusterProperties(cluster) {\n var count = cluster.numPoints;\n var abbrev = count >= 10000 ? Math.round(count / 1000) + 'k' :\n count >= 1000 ? (Math.round(count / 100) / 10) + 'k' : count;\n return extend(extend({}, cluster.properties), {\n cluster: true,\n cluster_id: cluster.id,\n point_count: count,\n point_count_abbreviated: abbrev\n });\n}\n\n// longitude/latitude to spherical mercator in [0..1] range\nfunction lngX(lng) {\n return lng / 360 + 0.5;\n}\nfunction latY(lat) {\n var sin = Math.sin(lat * Math.PI / 180),\n y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n return y < 0 ? 0 :\n y > 1 ? 1 : y;\n}\n\n// spherical mercator to longitude/latitude\nfunction xLng(x) {\n return (x - 0.5) * 360;\n}\nfunction yLat(y) {\n var y2 = (180 - y * 360) * Math.PI / 180;\n return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90;\n}\n\nfunction extend(dest, src) {\n for (var id in src) dest[id] = src[id];\n return dest;\n}\n\nfunction getX(p) {\n return p.x;\n}\nfunction getY(p) {\n return p.y;\n}\n","'use strict';\n\nmodule.exports = TinyQueue;\n\nfunction TinyQueue(data, compare) {\n if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);\n\n this.data = data || [];\n this.length = this.data.length;\n this.compare = compare || defaultCompare;\n\n if (data) for (var i = Math.floor(this.length / 2); i >= 0; i--) this._down(i);\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nTinyQueue.prototype = {\n\n push: function (item) {\n this.data.push(item);\n this.length++;\n this._up(this.length - 1);\n },\n\n pop: function () {\n var top = this.data[0];\n this.data[0] = this.data[this.length - 1];\n this.length--;\n this.data.pop();\n this._down(0);\n return top;\n },\n\n peek: function () {\n return this.data[0];\n },\n\n _up: function (pos) {\n var data = this.data,\n compare = this.compare;\n\n while (pos > 0) {\n var parent = Math.floor((pos - 1) / 2);\n if (compare(data[pos], data[parent]) < 0) {\n swap(data, parent, pos);\n pos = parent;\n\n } else break;\n }\n },\n\n _down: function (pos) {\n var data = this.data,\n compare = this.compare,\n len = this.length;\n\n while (true) {\n var left = 2 * pos + 1,\n right = left + 1,\n min = pos;\n\n if (left < len && compare(data[left], data[min]) < 0) min = left;\n if (right < len && compare(data[right], data[min]) < 0) min = right;\n\n if (min === pos) return;\n\n swap(data, min, pos);\n pos = min;\n }\n }\n};\n\nfunction swap(data, i, j) {\n var tmp = data[i];\n data[i] = data[j];\n data[j] = tmp;\n}\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n","module.exports.VectorTile = require('./lib/vectortile.js');\nmodule.exports.VectorTileFeature = require('./lib/vectortilefeature.js');\nmodule.exports.VectorTileLayer = require('./lib/vectortilelayer.js');\n","'use strict';\n\nvar VectorTileLayer = require('./vectortilelayer');\n\nmodule.exports = VectorTile;\n\nfunction VectorTile(pbf, end) {\n this.layers = pbf.readFields(readTile, {}, end);\n}\n\nfunction readTile(tag, layers, pbf) {\n if (tag === 3) {\n var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);\n if (layer.length) layers[layer.name] = layer;\n }\n}\n\n","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = VectorTileFeature;\n\nfunction VectorTileFeature(pbf, end, extent, keys, values) {\n // Public\n this.properties = {};\n this.extent = extent;\n this.type = 0;\n\n // Private\n this._pbf = pbf;\n this._geometry = -1;\n this._keys = keys;\n this._values = values;\n\n pbf.readFields(readFeature, this, end);\n}\n\nfunction readFeature(tag, feature, pbf) {\n if (tag == 1) feature.id = pbf.readVarint();\n else if (tag == 2) readTag(pbf, feature);\n else if (tag == 3) feature.type = pbf.readVarint();\n else if (tag == 4) feature._geometry = pbf.pos;\n}\n\nfunction readTag(pbf, feature) {\n var end = pbf.readVarint() + pbf.pos;\n\n while (pbf.pos < end) {\n var key = feature._keys[pbf.readVarint()],\n value = feature._values[pbf.readVarint()];\n feature.properties[key] = value;\n }\n}\n\nVectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nVectorTileFeature.prototype.loadGeometry = function() {\n var pbf = this._pbf;\n pbf.pos = this._geometry;\n\n var end = pbf.readVarint() + pbf.pos,\n cmd = 1,\n length = 0,\n x = 0,\n y = 0,\n lines = [],\n line;\n\n while (pbf.pos < end) {\n if (!length) {\n var cmdLen = pbf.readVarint();\n cmd = cmdLen & 0x7;\n length = cmdLen >> 3;\n }\n\n length--;\n\n if (cmd === 1 || cmd === 2) {\n x += pbf.readSVarint();\n y += pbf.readSVarint();\n\n if (cmd === 1) { // moveTo\n if (line) lines.push(line);\n line = [];\n }\n\n line.push(new Point(x, y));\n\n } else if (cmd === 7) {\n\n // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90\n if (line) {\n line.push(line[0].clone()); // closePolygon\n }\n\n } else {\n throw new Error('unknown command ' + cmd);\n }\n }\n\n if (line) lines.push(line);\n\n return lines;\n};\n\nVectorTileFeature.prototype.bbox = function() {\n var pbf = this._pbf;\n pbf.pos = this._geometry;\n\n var end = pbf.readVarint() + pbf.pos,\n cmd = 1,\n length = 0,\n x = 0,\n y = 0,\n x1 = Infinity,\n x2 = -Infinity,\n y1 = Infinity,\n y2 = -Infinity;\n\n while (pbf.pos < end) {\n if (!length) {\n var cmdLen = pbf.readVarint();\n cmd = cmdLen & 0x7;\n length = cmdLen >> 3;\n }\n\n length--;\n\n if (cmd === 1 || cmd === 2) {\n x += pbf.readSVarint();\n y += pbf.readSVarint();\n if (x < x1) x1 = x;\n if (x > x2) x2 = x;\n if (y < y1) y1 = y;\n if (y > y2) y2 = y;\n\n } else if (cmd !== 7) {\n throw new Error('unknown command ' + cmd);\n }\n }\n\n return [x1, y1, x2, y2];\n};\n\nVectorTileFeature.prototype.toGeoJSON = function(x, y, z) {\n var size = this.extent * Math.pow(2, z),\n x0 = this.extent * x,\n y0 = this.extent * y,\n coords = this.loadGeometry(),\n type = VectorTileFeature.types[this.type],\n i, j;\n\n function project(line) {\n for (var j = 0; j < line.length; j++) {\n var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;\n line[j] = [\n (p.x + x0) * 360 / size - 180,\n 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90\n ];\n }\n }\n\n switch (this.type) {\n case 1:\n var points = [];\n for (i = 0; i < coords.length; i++) {\n points[i] = coords[i][0];\n }\n coords = points;\n project(coords);\n break;\n\n case 2:\n for (i = 0; i < coords.length; i++) {\n project(coords[i]);\n }\n break;\n\n case 3:\n coords = classifyRings(coords);\n for (i = 0; i < coords.length; i++) {\n for (j = 0; j < coords[i].length; j++) {\n project(coords[i][j]);\n }\n }\n break;\n }\n\n if (coords.length === 1) {\n coords = coords[0];\n } else {\n type = 'Multi' + type;\n }\n\n var result = {\n type: \"Feature\",\n geometry: {\n type: type,\n coordinates: coords\n },\n properties: this.properties\n };\n\n if ('id' in this) {\n result.id = this.id;\n }\n\n return result;\n};\n\n// classifies an array of rings into polygons with outer rings and holes\n\nfunction classifyRings(rings) {\n var len = rings.length;\n\n if (len <= 1) return [rings];\n\n var polygons = [],\n polygon,\n ccw;\n\n for (var i = 0; i < len; i++) {\n var area = signedArea(rings[i]);\n if (area === 0) continue;\n\n if (ccw === undefined) ccw = area < 0;\n\n if (ccw === area < 0) {\n if (polygon) polygons.push(polygon);\n polygon = [rings[i]];\n\n } else {\n polygon.push(rings[i]);\n }\n }\n if (polygon) polygons.push(polygon);\n\n return polygons;\n}\n\nfunction signedArea(ring) {\n var sum = 0;\n for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n sum += (p2.x - p1.x) * (p1.y + p2.y);\n }\n return sum;\n}\n","'use strict';\n\nvar VectorTileFeature = require('./vectortilefeature.js');\n\nmodule.exports = VectorTileLayer;\n\nfunction VectorTileLayer(pbf, end) {\n // Public\n this.version = 1;\n this.name = null;\n this.extent = 4096;\n this.length = 0;\n\n // Private\n this._pbf = pbf;\n this._keys = [];\n this._values = [];\n this._features = [];\n\n pbf.readFields(readLayer, this, end);\n\n this.length = this._features.length;\n}\n\nfunction readLayer(tag, layer, pbf) {\n if (tag === 15) layer.version = pbf.readVarint();\n else if (tag === 1) layer.name = pbf.readString();\n else if (tag === 5) layer.extent = pbf.readVarint();\n else if (tag === 2) layer._features.push(pbf.pos);\n else if (tag === 3) layer._keys.push(pbf.readString());\n else if (tag === 4) layer._values.push(readValueMessage(pbf));\n}\n\nfunction readValueMessage(pbf) {\n var value = null,\n end = pbf.readVarint() + pbf.pos;\n\n while (pbf.pos < end) {\n var tag = pbf.readVarint() >> 3;\n\n value = tag === 1 ? pbf.readString() :\n tag === 2 ? pbf.readFloat() :\n tag === 3 ? pbf.readDouble() :\n tag === 4 ? pbf.readVarint64() :\n tag === 5 ? pbf.readVarint() :\n tag === 6 ? pbf.readSVarint() :\n tag === 7 ? pbf.readBoolean() : null;\n }\n\n return value;\n}\n\n// return feature `i` from this layer as a `VectorTileFeature`\nVectorTileLayer.prototype.feature = function(i) {\n if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');\n\n this._pbf.pos = this._features[i];\n\n var end = this._pbf.readVarint() + this._pbf.pos;\n return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);\n};\n","var Pbf = require('pbf')\nvar vtpb = require('./vector-tile-pb')\nvar GeoJSONWrapper = require('./lib/geojson_wrapper')\n\nmodule.exports = fromVectorTileJs\nmodule.exports.fromVectorTileJs = fromVectorTileJs\nmodule.exports.fromGeojsonVt = fromGeojsonVt\nmodule.exports.GeoJSONWrapper = GeoJSONWrapper\n\n/**\n * Serialize a vector-tile-js-created tile to pbf\n *\n * @param {Object} tile\n * @return {Buffer} uncompressed, pbf-serialized tile data\n */\nfunction fromVectorTileJs (tile) {\n var layers = []\n for (var l in tile.layers) {\n layers.push(prepareLayer(tile.layers[l]))\n }\n\n var out = new Pbf()\n vtpb.tile.write({ layers: layers }, out)\n return out.finish()\n}\n\n/**\n * Serialized a geojson-vt-created tile to pbf.\n *\n * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects\n * @return {Buffer} uncompressed, pbf-serialized tile data\n */\nfunction fromGeojsonVt (layers) {\n var l = {}\n for (var k in layers) {\n l[k] = new GeoJSONWrapper(layers[k].features)\n l[k].name = k\n }\n return fromVectorTileJs({layers: l})\n}\n\n/**\n * Prepare the given layer to be serialized by the auto-generated pbf\n * serializer by encoding the feature geometry and properties.\n */\nfunction prepareLayer (layer) {\n var preparedLayer = {\n name: layer.name || '',\n version: layer.version || 1,\n extent: layer.extent || 4096,\n keys: [],\n values: [],\n features: []\n }\n\n var keycache = {}\n var valuecache = {}\n\n for (var i = 0; i < layer.length; i++) {\n var feature = layer.feature(i)\n feature.geometry = encodeGeometry(feature.loadGeometry())\n\n var tags = []\n for (var key in feature.properties) {\n var keyIndex = keycache[key]\n if (typeof keyIndex === 'undefined') {\n preparedLayer.keys.push(key)\n keyIndex = preparedLayer.keys.length - 1\n keycache[key] = keyIndex\n }\n var value = wrapValue(feature.properties[key])\n var valueIndex = valuecache[value.key]\n if (typeof valueIndex === 'undefined') {\n preparedLayer.values.push(value)\n valueIndex = preparedLayer.values.length - 1\n valuecache[value.key] = valueIndex\n }\n tags.push(keyIndex)\n tags.push(valueIndex)\n }\n\n feature.tags = tags\n preparedLayer.features.push(feature)\n }\n\n return preparedLayer\n}\n\nfunction command (cmd, length) {\n return (length << 3) + (cmd & 0x7)\n}\n\nfunction zigzag (num) {\n return (num << 1) ^ (num >> 31)\n}\n\n/**\n * Encode a polygon's geometry into an array ready to be serialized\n * to mapbox vector tile specified geometry data.\n *\n * @param {Array} Rings, each being an array of [x, y] tile-space coordinates\n * @return {Array} encoded geometry\n */\nfunction encodeGeometry (geometry) {\n var encoded = []\n var x = 0\n var y = 0\n var rings = geometry.length\n for (var r = 0; r < rings; r++) {\n var ring = geometry[r]\n encoded.push(command(1, 1)) // moveto\n for (var i = 0; i < ring.length; i++) {\n if (i === 1) {\n encoded.push(command(2, ring.length - 1)) // lineto\n }\n var dx = ring[i].x - x\n var dy = ring[i].y - y\n encoded.push(zigzag(dx), zigzag(dy))\n x += dx\n y += dy\n }\n }\n\n return encoded\n}\n\n/**\n * Wrap a property value according to its type. The returned object\n * is of the form { xxxx_value: primitiveValue }, which is what the generated\n * protobuf serializer expects.\n */\nfunction wrapValue (value) {\n var result\n var type = typeof value\n if (type === 'string') {\n result = { string_value: value }\n } else if (type === 'boolean') {\n result = { bool_value: value }\n } else if (type === 'number') {\n if (value % 1 !== 0) {\n result = { double_value: value }\n } else if (value < 0) {\n result = { sint_value: value }\n } else {\n result = { uint_value: value }\n }\n } else {\n value = JSON.stringify(value)\n result = { string_value: value }\n }\n\n result.key = type + ':' + value\n return result\n}\n","'use strict'\n\nvar Point = require('point-geometry')\nvar VectorTileFeature = require('vector-tile').VectorTileFeature\n\nmodule.exports = GeoJSONWrapper\n\n// conform to vectortile api\nfunction GeoJSONWrapper (features) {\n this.features = features\n this.length = features.length\n}\n\nGeoJSONWrapper.prototype.feature = function (i) {\n return new FeatureWrapper(this.features[i])\n}\n\nfunction FeatureWrapper (feature) {\n this.id = typeof feature.id === 'number' ? feature.id : undefined\n this.type = feature.type\n this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry\n this.properties = feature.tags\n this.extent = 4096\n}\n\nFeatureWrapper.prototype.loadGeometry = function () {\n var rings = this.rawGeometry\n this.geometry = []\n\n for (var i = 0; i < rings.length; i++) {\n var ring = rings[i]\n var newRing = []\n for (var j = 0; j < ring.length; j++) {\n newRing.push(new Point(ring[j][0], ring[j][1]))\n }\n this.geometry.push(newRing)\n }\n return this.geometry\n}\n\nFeatureWrapper.prototype.bbox = function () {\n if (!this.geometry) this.loadGeometry()\n\n var rings = this.geometry\n var x1 = Infinity\n var x2 = -Infinity\n var y1 = Infinity\n var y2 = -Infinity\n\n for (var i = 0; i < rings.length; i++) {\n var ring = rings[i]\n\n for (var j = 0; j < ring.length; j++) {\n var coord = ring[j]\n\n x1 = Math.min(x1, coord.x)\n x2 = Math.max(x2, coord.x)\n y1 = Math.min(y1, coord.y)\n y2 = Math.max(y2, coord.y)\n }\n }\n\n return [x1, y1, x2, y2]\n}\n\nFeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON\n","'use strict';\n\n// tile ========================================\n\nvar tile = exports.tile = {read: readTile, write: writeTile};\n\ntile.GeomType = {\n \"Unknown\": 0,\n \"Point\": 1,\n \"LineString\": 2,\n \"Polygon\": 3\n};\n\nfunction readTile(pbf, end) {\n return pbf.readFields(readTileField, {\"layers\": []}, end);\n}\n\nfunction readTileField(tag, tile, pbf) {\n if (tag === 3) tile.layers.push(readLayer(pbf, pbf.readVarint() + pbf.pos));\n}\n\nfunction writeTile(tile, pbf) {\n var i;\n if (tile.layers !== undefined) for (i = 0; i < tile.layers.length; i++) pbf.writeMessage(3, writeLayer, tile.layers[i]);\n}\n\n// value ========================================\n\ntile.value = {read: readValue, write: writeValue};\n\nfunction readValue(pbf, end) {\n return pbf.readFields(readValueField, {}, end);\n}\n\nfunction readValueField(tag, value, pbf) {\n if (tag === 1) value.string_value = pbf.readString();\n else if (tag === 2) value.float_value = pbf.readFloat();\n else if (tag === 3) value.double_value = pbf.readDouble();\n else if (tag === 4) value.int_value = pbf.readVarint();\n else if (tag === 5) value.uint_value = pbf.readVarint();\n else if (tag === 6) value.sint_value = pbf.readSVarint();\n else if (tag === 7) value.bool_value = pbf.readBoolean();\n}\n\nfunction writeValue(value, pbf) {\n if (value.string_value !== undefined) pbf.writeStringField(1, value.string_value);\n if (value.float_value !== undefined) pbf.writeFloatField(2, value.float_value);\n if (value.double_value !== undefined) pbf.writeDoubleField(3, value.double_value);\n if (value.int_value !== undefined) pbf.writeVarintField(4, value.int_value);\n if (value.uint_value !== undefined) pbf.writeVarintField(5, value.uint_value);\n if (value.sint_value !== undefined) pbf.writeSVarintField(6, value.sint_value);\n if (value.bool_value !== undefined) pbf.writeBooleanField(7, value.bool_value);\n}\n\n// feature ========================================\n\ntile.feature = {read: readFeature, write: writeFeature};\n\nfunction readFeature(pbf, end) {\n var feature = pbf.readFields(readFeatureField, {}, end);\n if (feature.type === undefined) feature.type = \"Unknown\";\n return feature;\n}\n\nfunction readFeatureField(tag, feature, pbf) {\n if (tag === 1) feature.id = pbf.readVarint();\n else if (tag === 2) feature.tags = pbf.readPackedVarint();\n else if (tag === 3) feature.type = pbf.readVarint();\n else if (tag === 4) feature.geometry = pbf.readPackedVarint();\n}\n\nfunction writeFeature(feature, pbf) {\n if (feature.id !== undefined) pbf.writeVarintField(1, feature.id);\n if (feature.tags !== undefined) pbf.writePackedVarint(2, feature.tags);\n if (feature.type !== undefined) pbf.writeVarintField(3, feature.type);\n if (feature.geometry !== undefined) pbf.writePackedVarint(4, feature.geometry);\n}\n\n// layer ========================================\n\ntile.layer = {read: readLayer, write: writeLayer};\n\nfunction readLayer(pbf, end) {\n return pbf.readFields(readLayerField, {\"features\": [], \"keys\": [], \"values\": []}, end);\n}\n\nfunction readLayerField(tag, layer, pbf) {\n if (tag === 15) layer.version = pbf.readVarint();\n else if (tag === 1) layer.name = pbf.readString();\n else if (tag === 2) layer.features.push(readFeature(pbf, pbf.readVarint() + pbf.pos));\n else if (tag === 3) layer.keys.push(pbf.readString());\n else if (tag === 4) layer.values.push(readValue(pbf, pbf.readVarint() + pbf.pos));\n else if (tag === 5) layer.extent = pbf.readVarint();\n}\n\nfunction writeLayer(layer, pbf) {\n if (layer.version !== undefined) pbf.writeVarintField(15, layer.version);\n if (layer.name !== undefined) pbf.writeStringField(1, layer.name);\n var i;\n if (layer.features !== undefined) for (i = 0; i < layer.features.length; i++) pbf.writeMessage(2, writeFeature, layer.features[i]);\n if (layer.keys !== undefined) for (i = 0; i < layer.keys.length; i++) pbf.writeStringField(3, layer.keys[i]);\n if (layer.values !== undefined) for (i = 0; i < layer.values.length; i++) pbf.writeMessage(4, writeValue, layer.values[i]);\n if (layer.extent !== undefined) pbf.writeVarintField(5, layer.extent);\n}\n","var bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n Function(['require','module','exports'], '(' + fn + ')(self)'),\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n Function(['require'], (\n // try to call default if defined to also support babel esmodule\n // exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);'\n )),\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\n};\n","module.exports.RADIUS = 6378137;\nmodule.exports.FLATTENING = 1/298.257223563;\nmodule.exports.POLAR_RADIUS = 6356752.3142;\n","'use strict';\n\nconst ProgramConfiguration = require('./program_configuration');\n\nclass Segment {\n constructor(vertexOffset, primitiveOffset) {\n this.vertexOffset = vertexOffset;\n this.primitiveOffset = primitiveOffset;\n this.vertexLength = 0;\n this.primitiveLength = 0;\n }\n}\n\n/**\n * A class that manages vertex and element arrays for a bucket. It handles initialization,\n * serialization for transfer to the main thread, and certain intervening mutations.\n *\n * A group has:\n *\n * * A \"layout\" vertex array, with fixed attributes, containing values calculated from layout properties.\n * * Zero, one, or two element arrays, with fixed layout, for eventual `gl.drawElements` use.\n * * Zero or more \"paint\" vertex arrays keyed by layer ID, each with a dynamic layout which depends\n * on which paint properties of that layer use data-driven-functions (property functions or\n * property-and-zoom functions). Values are calculated by evaluating those functions.\n *\n * Because indexed rendering is best done with 16 bit indices (and in fact, in WebGL, 16 bit\n * indices are the only choice), a form of segmented addressing is used. Each group\n * contains an `Array` of `Segment`s. A segment contains a vertex array offset, which forms\n * the \"base address\" of indices within this segment. Each segment is drawn separately.\n *\n * @private\n */\nclass ArrayGroup {\n constructor(programInterface, layers, zoom) {\n this.globalProperties = {zoom};\n\n const LayoutVertexArrayType = programInterface.layoutVertexArrayType;\n this.layoutVertexArray = new LayoutVertexArrayType();\n\n const ElementArrayType = programInterface.elementArrayType;\n if (ElementArrayType) this.elementArray = new ElementArrayType();\n\n const ElementArrayType2 = programInterface.elementArrayType2;\n if (ElementArrayType2) this.elementArray2 = new ElementArrayType2();\n\n this.layerData = {};\n for (const layer of layers) {\n const programConfiguration = ProgramConfiguration.createDynamic(\n programInterface.paintAttributes || [], layer, zoom);\n this.layerData[layer.id] = {\n layer: layer,\n programConfiguration: programConfiguration,\n paintVertexArray: new programConfiguration.PaintVertexArray(),\n paintPropertyStatistics: programConfiguration.createPaintPropertyStatistics()\n };\n }\n\n this.segments = [];\n this.segments2 = [];\n }\n\n prepareSegment(numVertices) {\n let segment = this.segments[this.segments.length - 1];\n if (!segment || segment.vertexLength + numVertices > ArrayGroup.MAX_VERTEX_ARRAY_LENGTH) {\n segment = new Segment(this.layoutVertexArray.length, this.elementArray.length);\n this.segments.push(segment);\n }\n return segment;\n }\n\n prepareSegment2(numVertices) {\n let segment = this.segments2[this.segments2.length - 1];\n if (!segment || segment.vertexLength + numVertices > ArrayGroup.MAX_VERTEX_ARRAY_LENGTH) {\n segment = new Segment(this.layoutVertexArray.length, this.elementArray2.length);\n this.segments2.push(segment);\n }\n return segment;\n }\n\n populatePaintArrays(featureProperties) {\n for (const key in this.layerData) {\n const layerData = this.layerData[key];\n if (layerData.paintVertexArray.bytesPerElement === 0) continue;\n layerData.programConfiguration.populatePaintArray(\n layerData.layer,\n layerData.paintVertexArray,\n layerData.paintPropertyStatistics,\n this.layoutVertexArray.length,\n this.globalProperties,\n featureProperties);\n }\n }\n\n isEmpty() {\n return this.layoutVertexArray.length === 0;\n }\n\n serialize(transferables) {\n return {\n layoutVertexArray: this.layoutVertexArray.serialize(transferables),\n elementArray: this.elementArray && this.elementArray.serialize(transferables),\n elementArray2: this.elementArray2 && this.elementArray2.serialize(transferables),\n paintVertexArrays: serializePaintVertexArrays(this.layerData, transferables),\n segments: this.segments,\n segments2: this.segments2\n };\n }\n}\n\nfunction serializePaintVertexArrays(layerData, transferables) {\n const paintVertexArrays = {};\n for (const layerId in layerData) {\n const inputArray = layerData[layerId].paintVertexArray;\n if (inputArray.length === 0) continue;\n const array = inputArray.serialize(transferables);\n const type = inputArray.constructor.serialize();\n paintVertexArrays[layerId] = {array, type};\n }\n return paintVertexArrays;\n}\n\n/**\n * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit\n * addressing of vertex buffers.\n * @private\n * @readonly\n */\nArrayGroup.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1;\n\nmodule.exports = ArrayGroup;\n","'use strict';\n\nconst ArrayGroup = require('./array_group');\nconst BufferGroup = require('./buffer_group');\nconst util = require('../util/util');\n\n/**\n * The `Bucket` class is the single point of knowledge about turning vector\n * tiles into WebGL buffers.\n *\n * `Bucket` is an abstract class. A subclass exists for each style layer type.\n * Create a bucket via the `StyleLayer#createBucket` method.\n *\n * The concrete bucket types, using layout options from the style layer,\n * transform feature geometries into vertex and element data for use by the\n * vertex shader. They also (via `ProgramConfiguration`) use feature\n * properties and the zoom level to populate the attributes needed for\n * data-driven styling.\n *\n * Buckets are designed to be built on a worker thread and then serialized and\n * transferred back to the main thread for rendering. On the worker side, a\n * bucket's vertex, element, and attribute data is stored in `bucket.arrays:\n * ArrayGroup`. When a bucket's data is serialized and sent back to the main\n * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with\n * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups\n * hold the same data as ArrayGroups, but are tuned for consumption by WebGL.\n *\n * @private\n */\nclass Bucket {\n /**\n * @param options\n * @param {number} options.zoom Zoom level of the buffers being built. May be\n * a fractional zoom level.\n * @param options.layer A Mapbox style layer object\n * @param {Object.} options.buffers The set of `Buffer`s being\n * built for this tile. This object facilitates sharing of `Buffer`s be\n between `Bucket`s.\n */\n constructor (options, programInterface) {\n this.zoom = options.zoom;\n this.overscaling = options.overscaling;\n this.layers = options.layers;\n this.index = options.index;\n\n if (options.arrays) {\n this.buffers = new BufferGroup(programInterface, options.layers, options.zoom, options.arrays);\n } else {\n this.arrays = new ArrayGroup(programInterface, options.layers, options.zoom);\n }\n }\n\n populate(features, options) {\n for (const feature of features) {\n if (this.layers[0].filter(feature)) {\n this.addFeature(feature);\n options.featureIndex.insert(feature, this.index);\n }\n }\n }\n\n getPaintPropertyStatistics() {\n return util.mapObject(this.arrays.layerData, data => data.paintPropertyStatistics);\n }\n\n isEmpty() {\n return this.arrays.isEmpty();\n }\n\n serialize(transferables) {\n return {\n zoom: this.zoom,\n layerIds: this.layers.map((l) => l.id),\n arrays: this.arrays.serialize(transferables)\n };\n }\n\n /**\n * Release the WebGL resources associated with the buffers. Note that because\n * buckets are shared between layers having the same layout properties, they\n * must be destroyed in groups (all buckets for a tile, or all symbol buckets).\n *\n * @private\n */\n destroy() {\n if (this.buffers) {\n this.buffers.destroy();\n this.buffers = null;\n }\n }\n}\n\nmodule.exports = Bucket;\n\nBucket.deserialize = function(input, style) {\n // Guard against the case where the map's style has been set to null while\n // this bucket has been parsing.\n if (!style) return;\n\n const output = {};\n\n for (const serialized of input) {\n const layers = serialized.layerIds\n .map((id) => style.getLayer(id))\n .filter(Boolean);\n\n if (layers.length === 0) {\n continue;\n }\n\n const bucket = layers[0].createBucket(util.extend({layers}, serialized));\n for (const layer of layers) {\n output[layer.id] = bucket;\n }\n }\n\n return output;\n};\n","'use strict';\n\nconst Bucket = require('../bucket');\nconst createVertexArrayType = require('../vertex_array_type');\nconst createElementArrayType = require('../element_array_type');\nconst loadGeometry = require('../load_geometry');\nconst EXTENT = require('../extent');\n\nconst circleInterface = {\n layoutVertexArrayType: createVertexArrayType([\n {name: 'a_pos', components: 2, type: 'Int16'}\n ]),\n elementArrayType: createElementArrayType(),\n\n paintAttributes: [\n {property: 'circle-color', type: 'Uint8'},\n {property: 'circle-radius', type: 'Uint16', multiplier: 10},\n {property: 'circle-blur', type: 'Uint16', multiplier: 10},\n {property: 'circle-opacity', type: 'Uint8', multiplier: 255},\n {property: 'circle-stroke-color', type: 'Uint8'},\n {property: 'circle-stroke-width', type: 'Uint16', multiplier: 10},\n {property: 'circle-stroke-opacity', type: 'Uint8', multiplier: 255}\n ]\n};\n\nfunction addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) {\n layoutVertexArray.emplaceBack(\n (x * 2) + ((extrudeX + 1) / 2),\n (y * 2) + ((extrudeY + 1) / 2));\n}\n\n/**\n * Circles are represented by two triangles.\n *\n * Each corner has a pos that is the center of the circle and an extrusion\n * vector that is where it points.\n * @private\n */\nclass CircleBucket extends Bucket {\n constructor(options) {\n super(options, circleInterface);\n }\n\n addFeature(feature) {\n const arrays = this.arrays;\n\n for (const ring of loadGeometry(feature)) {\n for (const point of ring) {\n const x = point.x;\n const y = point.y;\n\n // Do not include points that are outside the tile boundaries.\n if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue;\n\n // this geometry will be of the Point type, and we'll derive\n // two triangles from it.\n //\n // ┌─────────┐\n // │ 3 2 │\n // │ │\n // │ 0 1 │\n // └─────────┘\n\n const segment = arrays.prepareSegment(4);\n const index = segment.vertexLength;\n\n addCircleVertex(arrays.layoutVertexArray, x, y, -1, -1);\n addCircleVertex(arrays.layoutVertexArray, x, y, 1, -1);\n addCircleVertex(arrays.layoutVertexArray, x, y, 1, 1);\n addCircleVertex(arrays.layoutVertexArray, x, y, -1, 1);\n\n arrays.elementArray.emplaceBack(index, index + 1, index + 2);\n arrays.elementArray.emplaceBack(index, index + 3, index + 2);\n\n segment.vertexLength += 4;\n segment.primitiveLength += 2;\n }\n }\n\n arrays.populatePaintArrays(feature.properties);\n }\n}\n\nCircleBucket.programInterface = circleInterface;\n\nmodule.exports = CircleBucket;\n","'use strict';\n\nconst Bucket = require('../bucket');\nconst createVertexArrayType = require('../vertex_array_type');\nconst createElementArrayType = require('../element_array_type');\nconst loadGeometry = require('../load_geometry');\nconst earcut = require('earcut');\nconst classifyRings = require('../../util/classify_rings');\nconst assert = require('assert');\nconst EARCUT_MAX_RINGS = 500;\n\nconst fillInterface = {\n layoutVertexArrayType: createVertexArrayType([\n {name: 'a_pos', components: 2, type: 'Int16'}\n ]),\n elementArrayType: createElementArrayType(3),\n elementArrayType2: createElementArrayType(2),\n\n paintAttributes: [\n {property: 'fill-color', type: 'Uint8'},\n {property: 'fill-outline-color', type: 'Uint8'},\n {property: 'fill-opacity', type: 'Uint8', multiplier: 255}\n ]\n};\n\nclass FillBucket extends Bucket {\n constructor(options) {\n super(options, fillInterface);\n }\n\n addFeature(feature) {\n const arrays = this.arrays;\n\n for (const polygon of classifyRings(loadGeometry(feature), EARCUT_MAX_RINGS)) {\n let numVertices = 0;\n for (const ring of polygon) {\n numVertices += ring.length;\n }\n\n const triangleSegment = arrays.prepareSegment(numVertices);\n const triangleIndex = triangleSegment.vertexLength;\n\n const flattened = [];\n const holeIndices = [];\n\n for (const ring of polygon) {\n if (ring.length === 0) {\n continue;\n }\n\n if (ring !== polygon[0]) {\n holeIndices.push(flattened.length / 2);\n }\n\n const lineSegment = arrays.prepareSegment2(ring.length);\n const lineIndex = lineSegment.vertexLength;\n\n arrays.layoutVertexArray.emplaceBack(ring[0].x, ring[0].y);\n arrays.elementArray2.emplaceBack(lineIndex + ring.length - 1, lineIndex);\n flattened.push(ring[0].x);\n flattened.push(ring[0].y);\n\n for (let i = 1; i < ring.length; i++) {\n arrays.layoutVertexArray.emplaceBack(ring[i].x, ring[i].y);\n arrays.elementArray2.emplaceBack(lineIndex + i - 1, lineIndex + i);\n flattened.push(ring[i].x);\n flattened.push(ring[i].y);\n }\n\n lineSegment.vertexLength += ring.length;\n lineSegment.primitiveLength += ring.length;\n }\n\n const indices = earcut(flattened, holeIndices);\n assert(indices.length % 3 === 0);\n\n for (let i = 0; i < indices.length; i += 3) {\n arrays.elementArray.emplaceBack(\n triangleIndex + indices[i],\n triangleIndex + indices[i + 1],\n triangleIndex + indices[i + 2]);\n }\n\n triangleSegment.vertexLength += numVertices;\n triangleSegment.primitiveLength += indices.length / 3;\n }\n\n arrays.populatePaintArrays(feature.properties);\n }\n}\n\nFillBucket.programInterface = fillInterface;\n\nmodule.exports = FillBucket;\n","'use strict';\n\nconst Bucket = require('../bucket');\nconst createVertexArrayType = require('../vertex_array_type');\nconst createElementArrayType = require('../element_array_type');\nconst loadGeometry = require('../load_geometry');\nconst EXTENT = require('../extent');\nconst earcut = require('earcut');\nconst classifyRings = require('../../util/classify_rings');\nconst assert = require('assert');\nconst EARCUT_MAX_RINGS = 500;\n\nconst fillExtrusionInterface = {\n layoutVertexArrayType: createVertexArrayType([\n {name: 'a_pos', components: 2, type: 'Int16'},\n {name: 'a_normal', components: 3, type: 'Int16'},\n {name: 'a_edgedistance', components: 1, type: 'Int16'}\n ]),\n elementArrayType: createElementArrayType(3),\n\n paintAttributes: [\n {property: 'fill-extrusion-base', type: 'Uint16'},\n {property: 'fill-extrusion-height', type: 'Uint16'},\n {property: 'fill-extrusion-color', type: 'Uint8'}\n ]\n};\n\nconst FACTOR = Math.pow(2, 13);\n\nfunction addVertex(vertexArray, x, y, nx, ny, nz, t, e) {\n vertexArray.emplaceBack(\n // a_pos\n x,\n y,\n // a_normal\n Math.floor(nx * FACTOR) * 2 + t,\n ny * FACTOR * 2,\n nz * FACTOR * 2,\n\n // a_edgedistance\n Math.round(e)\n );\n}\n\nclass FillExtrusionBucket extends Bucket {\n constructor(options) {\n super(options, fillExtrusionInterface);\n }\n\n addFeature(feature) {\n const arrays = this.arrays;\n\n for (const polygon of classifyRings(loadGeometry(feature), EARCUT_MAX_RINGS)) {\n let numVertices = 0;\n for (const ring of polygon) {\n numVertices += ring.length;\n }\n\n const segment = arrays.prepareSegment(numVertices * 5);\n\n const flattened = [];\n const holeIndices = [];\n const indices = [];\n\n for (const ring of polygon) {\n if (ring.length === 0) {\n continue;\n }\n\n if (ring !== polygon[0]) {\n holeIndices.push(flattened.length / 2);\n }\n\n let edgeDistance = 0;\n\n for (let p = 0; p < ring.length; p++) {\n const p1 = ring[p];\n\n addVertex(arrays.layoutVertexArray, p1.x, p1.y, 0, 0, 1, 1, 0);\n indices.push(segment.vertexLength++);\n\n if (p >= 1) {\n const p2 = ring[p - 1];\n\n if (!isBoundaryEdge(p1, p2)) {\n const perp = p1.sub(p2)._perp()._unit();\n\n addVertex(arrays.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance);\n addVertex(arrays.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance);\n\n edgeDistance += p2.dist(p1);\n\n addVertex(arrays.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance);\n addVertex(arrays.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance);\n\n const bottomRight = segment.vertexLength;\n\n arrays.elementArray.emplaceBack(bottomRight, bottomRight + 1, bottomRight + 2);\n arrays.elementArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3);\n\n segment.vertexLength += 4;\n segment.primitiveLength += 2;\n }\n }\n\n // convert to format used by earcut\n flattened.push(p1.x);\n flattened.push(p1.y);\n }\n }\n\n const triangleIndices = earcut(flattened, holeIndices);\n assert(triangleIndices.length % 3 === 0);\n\n for (let j = 0; j < triangleIndices.length; j += 3) {\n arrays.elementArray.emplaceBack(\n indices[triangleIndices[j]],\n indices[triangleIndices[j + 1]],\n indices[triangleIndices[j + 2]]);\n }\n\n segment.primitiveLength += triangleIndices.length / 3;\n }\n\n arrays.populatePaintArrays(feature.properties);\n }\n}\n\nFillExtrusionBucket.programInterface = fillExtrusionInterface;\n\nmodule.exports = FillExtrusionBucket;\n\nfunction isBoundaryEdge(p1, p2) {\n return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) ||\n (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT));\n}\n","'use strict';\n\nconst Bucket = require('../bucket');\nconst createVertexArrayType = require('../vertex_array_type');\nconst createElementArrayType = require('../element_array_type');\nconst loadGeometry = require('../load_geometry');\nconst EXTENT = require('../extent');\nconst VectorTileFeature = require('vector-tile').VectorTileFeature;\n\n// NOTE ON EXTRUDE SCALE:\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nconst EXTRUDE_SCALE = 63;\n\n/*\n * Sharp corners cause dashed lines to tilt because the distance along the line\n * is the same at both the inner and outer corners. To improve the appearance of\n * dashed lines we add extra points near sharp corners so that a smaller part\n * of the line is tilted.\n *\n * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an\n * extra vertex. The default is 75 degrees.\n *\n * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.\n */\nconst COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));\nconst SHARP_CORNER_OFFSET = 15;\n\n// The number of bits that is used to store the line distance in the buffer.\nconst LINE_DISTANCE_BUFFER_BITS = 15;\n\n// We don't have enough bits for the line distance as we'd like to have, so\n// use this value to scale the line distance (in tile units) down to a smaller\n// value. This lets us store longer distances while sacrificing precision.\nconst LINE_DISTANCE_SCALE = 1 / 2;\n\n// The maximum line distance, in tile units, that fits in the buffer.\nconst MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;\n\nconst lineInterface = {\n layoutVertexArrayType: createVertexArrayType([\n {name: 'a_pos', components: 2, type: 'Int16'},\n {name: 'a_data', components: 4, type: 'Uint8'}\n ]),\n paintAttributes: [\n {property: 'line-color', type: 'Uint8'},\n {property: 'line-blur', multiplier: 10, type: 'Uint8'},\n {property: 'line-opacity', multiplier: 10, type: 'Uint8'},\n {property: 'line-gap-width', multiplier: 10, type: 'Uint8', name: 'a_gapwidth'},\n {property: 'line-offset', multiplier: 1, type: 'Int8'},\n ],\n elementArrayType: createElementArrayType()\n};\n\nfunction addLineVertex(layoutVertexBuffer, point, extrude, tx, ty, dir, linesofar) {\n layoutVertexBuffer.emplaceBack(\n // a_pos\n (point.x << 1) | tx,\n (point.y << 1) | ty,\n // a_data\n // add 128 to store a byte in an unsigned byte\n Math.round(EXTRUDE_SCALE * extrude.x) + 128,\n Math.round(EXTRUDE_SCALE * extrude.y) + 128,\n // Encode the -1/0/1 direction value into the first two bits of .z of a_data.\n // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make\n // room for the direction value). The upper 8 bits of `linesofar` are placed in\n // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that\n // we can store longer distances while sacrificing precision.\n ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2),\n (linesofar * LINE_DISTANCE_SCALE) >> 6);\n}\n\n/**\n * @private\n */\nclass LineBucket extends Bucket {\n constructor(options) {\n super(options, lineInterface);\n }\n\n addFeature(feature) {\n const layout = this.layers[0].layout;\n const join = layout['line-join'];\n const cap = layout['line-cap'];\n const miterLimit = layout['line-miter-limit'];\n const roundLimit = layout['line-round-limit'];\n\n for (const line of loadGeometry(feature, LINE_DISTANCE_BUFFER_BITS)) {\n this.addLine(line, feature, join, cap, miterLimit, roundLimit);\n }\n }\n\n addLine(vertices, feature, join, cap, miterLimit, roundLimit) {\n const featureProperties = feature.properties;\n const isPolygon = VectorTileFeature.types[feature.type] === 'Polygon';\n\n // If the line has duplicate vertices at the end, adjust length to remove them.\n let len = vertices.length;\n while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {\n len--;\n }\n\n // Ignore invalid geometry.\n if (len < (isPolygon ? 3 : 2)) return;\n\n if (join === 'bevel') miterLimit = 1.05;\n\n const sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling));\n\n const firstVertex = vertices[0];\n const arrays = this.arrays;\n\n // we could be more precise, but it would only save a negligible amount of space\n const segment = arrays.prepareSegment(len * 10);\n\n this.distance = 0;\n\n const beginCap = cap,\n endCap = isPolygon ? 'butt' : cap;\n let startOfLine = true;\n let currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB;\n\n // the last three vertices added\n this.e1 = this.e2 = this.e3 = -1;\n\n if (isPolygon) {\n currentVertex = vertices[len - 2];\n nextNormal = firstVertex.sub(currentVertex)._unit()._perp();\n }\n\n for (let i = 0; i < len; i++) {\n\n nextVertex = isPolygon && i === len - 1 ?\n vertices[1] : // if the line is closed, we treat the last vertex like the first\n vertices[i + 1]; // just the next vertex\n\n // if two consecutive vertices exist, skip the current one\n if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n if (nextNormal) prevNormal = nextNormal;\n if (currentVertex) prevVertex = currentVertex;\n\n currentVertex = vertices[i];\n\n // Calculate the normal towards the next vertex in this line. In case\n // there is no next vertex, pretend that the line is continuing straight,\n // meaning that we are just using the previous normal.\n nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n // If we still don't have a previous normal, this is the beginning of a\n // non-closed line, so we're doing a straight \"join\".\n prevNormal = prevNormal || nextNormal;\n\n // Determine the normal of the join extrusion. It is the angle bisector\n // of the segments between the previous line and the next line.\n // In the case of 180° angles, the prev and next normals cancel each other out:\n // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be\n // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle\n // below will also become 0 and miterLength will become Infinity.\n let joinNormal = prevNormal.add(nextNormal);\n if (joinNormal.x !== 0 || joinNormal.y !== 0) {\n joinNormal._unit();\n }\n /* joinNormal prevNormal\n * ↖ ↑\n * .________. prevVertex\n * |\n * nextNormal ← | currentVertex\n * |\n * nextVertex !\n *\n */\n\n // Calculate the length of the miter (the ratio of the miter to the width).\n // Find the cosine of the angle between the next and join normals\n // using dot product. The inverse of that is the miter length.\n const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;\n\n const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;\n\n if (isSharpCorner && i > 0) {\n const prevSegmentLength = currentVertex.dist(prevVertex);\n if (prevSegmentLength > 2 * sharpCornerOffset) {\n const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());\n this.distance += newPrevVertex.dist(prevVertex);\n this.addCurrentVertex(newPrevVertex, this.distance, prevNormal.mult(1), 0, 0, false, segment);\n prevVertex = newPrevVertex;\n }\n }\n\n // The join if a middle vertex, otherwise the cap.\n const middleVertex = prevVertex && nextVertex;\n let currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap;\n\n if (middleVertex && currentJoin === 'round') {\n if (miterLength < roundLimit) {\n currentJoin = 'miter';\n } else if (miterLength <= 2) {\n currentJoin = 'fakeround';\n }\n }\n\n if (currentJoin === 'miter' && miterLength > miterLimit) {\n currentJoin = 'bevel';\n }\n\n if (currentJoin === 'bevel') {\n // The maximum extrude length is 128 / 63 = 2 times the width of the line\n // so if miterLength >= 2 we need to draw a different type of bevel here.\n if (miterLength > 2) currentJoin = 'flipbevel';\n\n // If the miterLength is really small and the line bevel wouldn't be visible,\n // just draw a miter join to save a triangle.\n if (miterLength < miterLimit) currentJoin = 'miter';\n }\n\n // Calculate how far along the line the currentVertex is\n if (prevVertex) this.distance += currentVertex.dist(prevVertex);\n\n if (currentJoin === 'miter') {\n\n joinNormal._mult(miterLength);\n this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false, segment);\n\n } else if (currentJoin === 'flipbevel') {\n // miter is too big, flip the direction to make a beveled join\n\n if (miterLength > 100) {\n // Almost parallel lines\n joinNormal = nextNormal.clone().mult(-1);\n\n } else {\n const direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1;\n const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n joinNormal._perp()._mult(bevelLength * direction);\n }\n this.addCurrentVertex(currentVertex, this.distance, joinNormal, 0, 0, false, segment);\n this.addCurrentVertex(currentVertex, this.distance, joinNormal.mult(-1), 0, 0, false, segment);\n\n } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n const lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0;\n const offset = -Math.sqrt(miterLength * miterLength - 1);\n if (lineTurnsLeft) {\n offsetB = 0;\n offsetA = offset;\n } else {\n offsetA = 0;\n offsetB = offset;\n }\n\n // Close previous segment with a bevel\n if (!startOfLine) {\n this.addCurrentVertex(currentVertex, this.distance, prevNormal, offsetA, offsetB, false, segment);\n }\n\n if (currentJoin === 'fakeround') {\n // The join angle is sharp enough that a round join would be visible.\n // Bevel joins fill the gap between segments with a single pie slice triangle.\n // Create a round join by adding multiple pie slices. The join isn't actually round, but\n // it looks like it is at the sizes we render lines at.\n\n // Add more triangles for sharper angles.\n // This math is just a good enough approximation. It isn't \"correct\".\n const n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8);\n let approxFractionalJoinNormal;\n\n for (let m = 0; m < n; m++) {\n approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit();\n this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft, segment);\n }\n\n this.addPieSliceVertex(currentVertex, this.distance, joinNormal, lineTurnsLeft, segment);\n\n for (let k = n - 1; k >= 0; k--) {\n approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit();\n this.addPieSliceVertex(currentVertex, this.distance, approxFractionalJoinNormal, lineTurnsLeft, segment);\n }\n }\n\n // Start next segment\n if (nextVertex) {\n this.addCurrentVertex(currentVertex, this.distance, nextNormal, -offsetA, -offsetB, false, segment);\n }\n\n } else if (currentJoin === 'butt') {\n if (!startOfLine) {\n // Close previous segment with a butt\n this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false, segment);\n }\n\n // Start next segment with a butt\n if (nextVertex) {\n this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false, segment);\n }\n\n } else if (currentJoin === 'square') {\n\n if (!startOfLine) {\n // Close previous segment with a square cap\n this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, false, segment);\n\n // The segment is done. Unset vertices to disconnect segments.\n this.e1 = this.e2 = -1;\n }\n\n // Start next segment\n if (nextVertex) {\n this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, false, segment);\n }\n\n } else if (currentJoin === 'round') {\n\n if (!startOfLine) {\n // Close previous segment with butt\n this.addCurrentVertex(currentVertex, this.distance, prevNormal, 0, 0, false, segment);\n\n // Add round cap or linejoin at end of segment\n this.addCurrentVertex(currentVertex, this.distance, prevNormal, 1, 1, true, segment);\n\n // The segment is done. Unset vertices to disconnect segments.\n this.e1 = this.e2 = -1;\n }\n\n\n // Start next segment with a butt\n if (nextVertex) {\n // Add round cap before first segment\n this.addCurrentVertex(currentVertex, this.distance, nextNormal, -1, -1, true, segment);\n\n this.addCurrentVertex(currentVertex, this.distance, nextNormal, 0, 0, false, segment);\n }\n }\n\n if (isSharpCorner && i < len - 1) {\n const nextSegmentLength = currentVertex.dist(nextVertex);\n if (nextSegmentLength > 2 * sharpCornerOffset) {\n const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());\n this.distance += newCurrentVertex.dist(currentVertex);\n this.addCurrentVertex(newCurrentVertex, this.distance, nextNormal.mult(1), 0, 0, false, segment);\n currentVertex = newCurrentVertex;\n }\n }\n\n startOfLine = false;\n }\n\n arrays.populatePaintArrays(featureProperties);\n }\n\n /**\n * Add two vertices to the buffers.\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beginning of the line to the vertex\n * @param {number} endLeft extrude to shift the left vertex along the line\n * @param {number} endRight extrude to shift the left vertex along the line\n * @param {boolean} round whether this is a round cap\n * @private\n */\n addCurrentVertex(currentVertex, distance, normal, endLeft, endRight, round, segment) {\n const tx = round ? 1 : 0;\n let extrude;\n const arrays = this.arrays;\n const layoutVertexArray = arrays.layoutVertexArray;\n const elementArray = arrays.elementArray;\n\n extrude = normal.clone();\n if (endLeft) extrude._sub(normal.perp()._mult(endLeft));\n addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 0, endLeft, distance);\n this.e3 = segment.vertexLength++;\n if (this.e1 >= 0 && this.e2 >= 0) {\n elementArray.emplaceBack(this.e1, this.e2, this.e3);\n segment.primitiveLength++;\n }\n this.e1 = this.e2;\n this.e2 = this.e3;\n\n extrude = normal.mult(-1);\n if (endRight) extrude._sub(normal.perp()._mult(endRight));\n addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 1, -endRight, distance);\n this.e3 = segment.vertexLength++;\n if (this.e1 >= 0 && this.e2 >= 0) {\n elementArray.emplaceBack(this.e1, this.e2, this.e3);\n segment.primitiveLength++;\n }\n this.e1 = this.e2;\n this.e2 = this.e3;\n\n // There is a maximum \"distance along the line\" that we can store in the buffers.\n // When we get close to the distance, reset it to zero and add the vertex again with\n // a distance of zero. The max distance is determined by the number of bits we allocate\n // to `linesofar`.\n if (distance > MAX_LINE_DISTANCE / 2) {\n this.distance = 0;\n this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round, segment);\n }\n }\n\n /**\n * Add a single new vertex and a triangle using two previous vertices.\n * This adds a pie slice triangle near a join to simulate round joins\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {Object} extrude the offset of the new vertex from the currentVertex\n * @param {boolean} whether the line is turning left or right at this angle\n * @private\n */\n addPieSliceVertex(currentVertex, distance, extrude, lineTurnsLeft, segment) {\n const ty = lineTurnsLeft ? 1 : 0;\n extrude = extrude.mult(lineTurnsLeft ? -1 : 1);\n const arrays = this.arrays;\n const layoutVertexArray = arrays.layoutVertexArray;\n const elementArray = arrays.elementArray;\n\n addLineVertex(layoutVertexArray, currentVertex, extrude, 0, ty, 0, distance);\n this.e3 = segment.vertexLength++;\n if (this.e1 >= 0 && this.e2 >= 0) {\n elementArray.emplaceBack(this.e1, this.e2, this.e3);\n segment.primitiveLength++;\n }\n\n if (lineTurnsLeft) {\n this.e2 = this.e3;\n } else {\n this.e1 = this.e3;\n }\n }\n}\n\nLineBucket.programInterface = lineInterface;\n\nmodule.exports = LineBucket;\n","'use strict';\n\nconst Point = require('point-geometry');\nconst ArrayGroup = require('../array_group');\nconst BufferGroup = require('../buffer_group');\nconst createVertexArrayType = require('../vertex_array_type');\nconst createElementArrayType = require('../element_array_type');\nconst EXTENT = require('../extent');\nconst Anchor = require('../../symbol/anchor');\nconst getAnchors = require('../../symbol/get_anchors');\nconst resolveTokens = require('../../util/token');\nconst Quads = require('../../symbol/quads');\nconst Shaping = require('../../symbol/shaping');\nconst resolveText = require('../../symbol/resolve_text');\nconst mergeLines = require('../../symbol/mergelines');\nconst clipLine = require('../../symbol/clip_line');\nconst util = require('../../util/util');\nconst scriptDetection = require('../../util/script_detection');\nconst loadGeometry = require('../load_geometry');\nconst CollisionFeature = require('../../symbol/collision_feature');\nconst findPoleOfInaccessibility = require('../../util/find_pole_of_inaccessibility');\nconst classifyRings = require('../../util/classify_rings');\nconst VectorTileFeature = require('vector-tile').VectorTileFeature;\nconst rtlTextPlugin = require('../../source/rtl_text_plugin');\n\nconst shapeText = Shaping.shapeText;\nconst shapeIcon = Shaping.shapeIcon;\nconst WritingMode = Shaping.WritingMode;\nconst getGlyphQuads = Quads.getGlyphQuads;\nconst getIconQuads = Quads.getIconQuads;\n\nconst elementArrayType = createElementArrayType();\n\nconst layoutVertexArrayType = createVertexArrayType([\n {name: 'a_pos_offset', components: 4, type: 'Int16'},\n {name: 'a_texture_pos', components: 2, type: 'Uint16'},\n {name: 'a_data', components: 4, type: 'Uint8'}\n]);\n\nconst symbolInterfaces = {\n glyph: {\n layoutVertexArrayType: layoutVertexArrayType,\n elementArrayType: elementArrayType,\n paintAttributes: [\n {name: 'a_fill_color', property: 'text-color', type: 'Uint8'},\n {name: 'a_halo_color', property: 'text-halo-color', type: 'Uint8'},\n {name: 'a_halo_width', property: 'text-halo-width', type: 'Uint16', multiplier: 10},\n {name: 'a_halo_blur', property: 'text-halo-blur', type: 'Uint16', multiplier: 10},\n {name: 'a_opacity', property: 'text-opacity', type: 'Uint8', multiplier: 255}\n ]\n },\n icon: {\n layoutVertexArrayType: layoutVertexArrayType,\n elementArrayType: elementArrayType,\n paintAttributes: [\n {name: 'a_fill_color', property: 'icon-color', type: 'Uint8'},\n {name: 'a_halo_color', property: 'icon-halo-color', type: 'Uint8'},\n {name: 'a_halo_width', property: 'icon-halo-width', type: 'Uint16', multiplier: 10},\n {name: 'a_halo_blur', property: 'icon-halo-blur', type: 'Uint16', multiplier: 10},\n {name: 'a_opacity', property: 'icon-opacity', type: 'Uint8', multiplier: 255}\n ]\n },\n collisionBox: { // used to render collision boxes for debugging purposes\n layoutVertexArrayType: createVertexArrayType([\n {name: 'a_pos', components: 2, type: 'Int16'},\n {name: 'a_extrude', components: 2, type: 'Int16'},\n {name: 'a_data', components: 2, type: 'Uint8'}\n ]),\n elementArrayType: createElementArrayType(2)\n }\n};\n\nfunction addVertex(array, x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom, labelangle) {\n array.emplaceBack(\n // a_pos_offset\n x,\n y,\n Math.round(ox * 64),\n Math.round(oy * 64),\n\n // a_texture_pos\n tx / 4, // x coordinate of symbol on glyph atlas texture\n ty / 4, // y coordinate of symbol on glyph atlas texture\n\n // a_data\n (labelminzoom || 0) * 10, // labelminzoom\n labelangle, // labelangle\n (minzoom || 0) * 10, // minzoom\n Math.min(maxzoom || 25, 25) * 10); // maxzoom\n}\n\nfunction addCollisionBoxVertex(layoutVertexArray, point, extrude, maxZoom, placementZoom) {\n return layoutVertexArray.emplaceBack(\n // pos\n point.x,\n point.y,\n // extrude\n Math.round(extrude.x),\n Math.round(extrude.y),\n // data\n maxZoom * 10,\n placementZoom * 10);\n}\n\n/*\n * Unlike other buckets, which simply implement #addFeature with type-specific\n * logic for (essentially) triangulating feature geometries, SymbolBucket\n * requires specialized behavior:\n *\n * 1. WorkerTile#parse(), the logical owner of the bucket creation process,\n * calls SymbolBucket#populate(), which resolves text and icon tokens on\n * each feature, adds each glyphs and symbols needed to the passed-in\n * collections options.glyphDependencies and options.iconDependencies, and\n * stores the feature data for use in subsequent step (this.features).\n *\n * 2. WorkerTile asynchronously requests from the main thread all of the glyphs\n * and icons needed (by this bucket and any others). When glyphs and icons\n * have been received, the WorkerTile creates a CollisionTile and invokes:\n *\n * 3. SymbolBucket#prepare(stacks, icons) to perform text shaping and layout, populating `this.symbolInstancesArray`, `this.symbolQuadsArray`, and `this.collisionBoxArray`.\n *\n * 4. SymbolBucket#place(collisionTile): taking collisions into account, decide on which labels and icons to actually draw and at which scale, populating the vertex arrays (`this.arrays.glyph`, `this.arrays.icon`) and thus completing the parsing / buffer population process.\n *\n * The reason that `prepare` and `place` are separate methods is that\n * `prepare`, being independent of pitch and orientation, only needs to happen\n * at tile load time, whereas `place` must be invoked on already-loaded tiles\n * when the pitch/orientation are changed. (See `redoPlacement`.)\n *\n */\n\nclass SymbolBucket {\n constructor(options) {\n this.collisionBoxArray = options.collisionBoxArray;\n\n this.zoom = options.zoom;\n this.overscaling = options.overscaling;\n this.layers = options.layers;\n this.index = options.index;\n this.sdfIcons = options.sdfIcons;\n this.iconsNeedLinear = options.iconsNeedLinear;\n this.adjustedTextSize = options.adjustedTextSize;\n this.adjustedIconSize = options.adjustedIconSize;\n this.fontstack = options.fontstack;\n\n if (options.arrays) {\n this.buffers = {};\n for (const id in options.arrays) {\n if (options.arrays[id]) {\n this.buffers[id] = new BufferGroup(symbolInterfaces[id], options.layers, options.zoom, options.arrays[id]);\n }\n }\n }\n }\n\n populate(features, options) {\n const layer = this.layers[0];\n const layout = layer.layout;\n const textFont = layout['text-font'];\n const iconImage = layout['icon-image'];\n\n const hasText = textFont && (!layer.isLayoutValueFeatureConstant('text-field') || layout['text-field']);\n const hasIcon = iconImage;\n\n this.features = [];\n\n if (!hasText && !hasIcon) {\n return;\n }\n\n const icons = options.iconDependencies;\n const stacks = options.glyphDependencies;\n const stack = stacks[textFont] = stacks[textFont] || {};\n\n for (let i = 0; i < features.length; i++) {\n const feature = features[i];\n if (!layer.filter(feature)) {\n continue;\n }\n\n let text;\n if (hasText) {\n text = resolveText(layer, {zoom: this.zoom}, feature.properties);\n if (rtlTextPlugin.applyArabicShaping) {\n text = rtlTextPlugin.applyArabicShaping(text);\n }\n }\n\n let icon;\n if (hasIcon) {\n icon = resolveTokens(feature.properties, iconImage);\n }\n\n if (!text && !icon) {\n continue;\n }\n\n this.features.push({\n text,\n icon,\n index: i,\n sourceLayerIndex: feature.sourceLayerIndex,\n geometry: loadGeometry(feature),\n properties: feature.properties,\n type: VectorTileFeature.types[feature.type]\n });\n\n if (icon) {\n icons[icon] = true;\n }\n\n if (text) {\n for (let i = 0; i < text.length; i++) {\n stack[text.charCodeAt(i)] = true;\n }\n }\n }\n\n if (layout['symbol-placement'] === 'line') {\n // Merge adjacent lines with the same text to improve labelling.\n // It's better to place labels on one long line than on many short segments.\n this.features = mergeLines(this.features);\n }\n }\n\n isEmpty() {\n return this.arrays.icon.isEmpty() &&\n this.arrays.glyph.isEmpty() &&\n this.arrays.collisionBox.isEmpty();\n }\n\n getPaintPropertyStatistics() {\n const statistics = {};\n for (const layer of this.layers) {\n statistics[layer.id] = util.extend({},\n this.arrays.icon.layerData[layer.id].paintPropertyStatistics,\n this.arrays.glyph.layerData[layer.id].paintPropertyStatistics\n );\n }\n return statistics;\n }\n\n serialize(transferables) {\n return {\n zoom: this.zoom,\n layerIds: this.layers.map((l) => l.id),\n sdfIcons: this.sdfIcons,\n iconsNeedLinear: this.iconsNeedLinear,\n adjustedTextSize: this.adjustedTextSize,\n adjustedIconSize: this.adjustedIconSize,\n fontstack: this.fontstack,\n arrays: util.mapObject(this.arrays, (a) => a.isEmpty() ? null : a.serialize(transferables))\n };\n }\n\n destroy() {\n if (this.buffers) {\n if (this.buffers.icon) this.buffers.icon.destroy();\n if (this.buffers.glyph) this.buffers.glyph.destroy();\n if (this.buffers.collisionBox) this.buffers.collisionBox.destroy();\n this.buffers = null;\n }\n }\n\n createArrays() {\n this.arrays = util.mapObject(symbolInterfaces, (programInterface) => {\n return new ArrayGroup(programInterface, this.layers, this.zoom);\n });\n }\n\n prepare(stacks, icons) {\n this.symbolInstances = [];\n\n // To reduce the number of labels that jump around when zooming we need\n // to use a text-size value that is the same for all zoom levels.\n // This calculates text-size at a high zoom level so that all tiles can\n // use the same value when calculating anchor positions.\n this.adjustedTextMaxSize = this.layers[0].getLayoutValue('text-size', {zoom: 18});\n this.adjustedTextSize = this.layers[0].getLayoutValue('text-size', {zoom: this.zoom + 1});\n this.adjustedIconMaxSize = this.layers[0].getLayoutValue('icon-size', {zoom: 18});\n this.adjustedIconSize = this.layers[0].getLayoutValue('icon-size', {zoom: this.zoom + 1});\n\n const tileSize = 512 * this.overscaling;\n this.tilePixelRatio = EXTENT / tileSize;\n this.compareText = {};\n this.iconsNeedLinear = false;\n\n const layout = this.layers[0].layout;\n\n let horizontalAlign = 0.5,\n verticalAlign = 0.5;\n\n switch (layout['text-anchor']) {\n case 'right':\n case 'top-right':\n case 'bottom-right':\n horizontalAlign = 1;\n break;\n case 'left':\n case 'top-left':\n case 'bottom-left':\n horizontalAlign = 0;\n break;\n }\n\n switch (layout['text-anchor']) {\n case 'bottom':\n case 'bottom-right':\n case 'bottom-left':\n verticalAlign = 1;\n break;\n case 'top':\n case 'top-right':\n case 'top-left':\n verticalAlign = 0;\n break;\n }\n\n const justify = layout['text-justify'] === 'right' ? 1 :\n layout['text-justify'] === 'left' ? 0 :\n 0.5;\n\n const oneEm = 24;\n const lineHeight = layout['text-line-height'] * oneEm;\n const maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0;\n const spacing = layout['text-letter-spacing'] * oneEm;\n const textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm];\n const fontstack = this.fontstack = layout['text-font'].join(',');\n const textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n for (const feature of this.features) {\n\n let shapedTextOrientations;\n if (feature.text) {\n const allowsVerticalWritingMode = scriptDetection.allowsVerticalWritingMode(feature.text);\n\n shapedTextOrientations = {\n [WritingMode.horizontal]: shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset, oneEm, WritingMode.horizontal),\n [WritingMode.vertical]: allowsVerticalWritingMode && textAlongLine && shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset, oneEm, WritingMode.vertical)\n };\n } else {\n shapedTextOrientations = {};\n }\n\n let shapedIcon;\n if (feature.icon) {\n const image = icons[feature.icon];\n const iconOffset = this.layers[0].getLayoutValue('icon-offset', {zoom: this.zoom}, feature.properties);\n shapedIcon = shapeIcon(image, iconOffset);\n\n if (image) {\n if (this.sdfIcons === undefined) {\n this.sdfIcons = image.sdf;\n } else if (this.sdfIcons !== image.sdf) {\n util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer');\n }\n if (image.pixelRatio !== 1) {\n this.iconsNeedLinear = true;\n } else if (layout['icon-rotate'] !== 0 || !this.layers[0].isLayoutValueFeatureConstant('icon-rotate')) {\n this.iconsNeedLinear = true;\n }\n }\n }\n\n if (shapedTextOrientations[WritingMode.horizontal] || shapedIcon) {\n this.addFeature(feature, shapedTextOrientations, shapedIcon);\n }\n }\n }\n\n addFeature(feature, shapedTextOrientations, shapedIcon) {\n const layout = this.layers[0].layout,\n glyphSize = 24,\n fontScale = this.adjustedTextSize / glyphSize,\n textMaxSize = this.adjustedTextMaxSize !== undefined ? this.adjustedTextMaxSize : this.adjustedTextSize,\n textBoxScale = this.tilePixelRatio * fontScale,\n textMaxBoxScale = this.tilePixelRatio * textMaxSize / glyphSize,\n iconBoxScale = this.tilePixelRatio * this.adjustedIconSize,\n symbolMinDistance = this.tilePixelRatio * layout['symbol-spacing'],\n avoidEdges = layout['symbol-avoid-edges'],\n textPadding = layout['text-padding'] * this.tilePixelRatio,\n iconPadding = layout['icon-padding'] * this.tilePixelRatio,\n textMaxAngle = layout['text-max-angle'] / 180 * Math.PI,\n textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n layout['text-ignore-placement'] || layout['icon-ignore-placement'],\n symbolPlacement = layout['symbol-placement'],\n textRepeatDistance = symbolMinDistance / 2;\n\n const addSymbolInstance = (line, anchor) => {\n const inside = !(anchor.x < 0 || anchor.x > EXTENT || anchor.y < 0 || anchor.y > EXTENT);\n\n if (avoidEdges && !inside) return;\n\n // Normally symbol layers are drawn across tile boundaries. Only symbols\n // with their anchors within the tile boundaries are added to the buffers\n // to prevent symbols from being drawn twice.\n //\n // Symbols in layers with overlap are sorted in the y direction so that\n // symbols lower on the canvas are drawn on top of symbols near the top.\n // To preserve this order across tile boundaries these symbols can't\n // be drawn across tile boundaries. Instead they need to be included in\n // the buffers for both tiles and clipped to tile boundaries at draw time.\n const addToBuffers = inside || mayOverlap;\n this.addSymbolInstance(anchor, line, shapedTextOrientations, shapedIcon, this.layers[0],\n addToBuffers, this.collisionBoxArray, feature.index, feature.sourceLayerIndex, this.index,\n textBoxScale, textPadding, textAlongLine,\n iconBoxScale, iconPadding, iconAlongLine, {zoom: this.zoom}, feature.properties);\n };\n\n if (symbolPlacement === 'line') {\n for (const line of clipLine(feature.geometry, 0, 0, EXTENT, EXTENT)) {\n const anchors = getAnchors(\n line,\n symbolMinDistance,\n textMaxAngle,\n shapedTextOrientations[WritingMode.vertical] || shapedTextOrientations[WritingMode.horizontal],\n shapedIcon,\n glyphSize,\n textMaxBoxScale,\n this.overscaling,\n EXTENT\n );\n for (const anchor of anchors) {\n const shapedText = shapedTextOrientations[WritingMode.horizontal];\n if (!shapedText || !this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) {\n addSymbolInstance(line, anchor);\n }\n }\n }\n } else if (feature.type === 'Polygon') {\n for (const polygon of classifyRings(feature.geometry, 0)) {\n // 16 here represents 2 pixels\n const poi = findPoleOfInaccessibility(polygon, 16);\n addSymbolInstance(polygon[0], new Anchor(poi.x, poi.y, 0));\n }\n } else if (feature.type === 'LineString') {\n // https://github.com/mapbox/mapbox-gl-js/issues/3808\n for (const line of feature.geometry) {\n addSymbolInstance(line, new Anchor(line[0].x, line[0].y, 0));\n }\n } else if (feature.type === 'Point') {\n for (const points of feature.geometry) {\n for (const point of points) {\n addSymbolInstance([point], new Anchor(point.x, point.y, 0));\n }\n }\n }\n }\n\n anchorIsTooClose(text, repeatDistance, anchor) {\n const compareText = this.compareText;\n if (!(text in compareText)) {\n compareText[text] = [];\n } else {\n const otherAnchors = compareText[text];\n for (let k = otherAnchors.length - 1; k >= 0; k--) {\n if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n // If it's within repeatDistance of one anchor, stop looking\n return true;\n }\n }\n }\n // If anchor is not within repeatDistance of any other anchor, add to array\n compareText[text].push(anchor);\n return false;\n }\n\n place(collisionTile, showCollisionBoxes) {\n // Calculate which labels can be shown and when they can be shown and\n // create the bufers used for rendering.\n\n this.createArrays();\n\n const layout = this.layers[0].layout;\n\n const maxScale = collisionTile.maxScale;\n\n const textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n const iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n const mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n layout['text-ignore-placement'] || layout['icon-ignore-placement'];\n\n // Sort symbols by their y position on the canvas so that the lower symbols\n // are drawn on top of higher symbols.\n // Don't sort symbols that won't overlap because it isn't necessary and\n // because it causes more labels to pop in and out when rotating.\n if (mayOverlap) {\n const angle = collisionTile.angle;\n\n const sin = Math.sin(angle),\n cos = Math.cos(angle);\n\n this.symbolInstances.sort((a, b) => {\n const aRotated = (sin * a.anchor.x + cos * a.anchor.y) | 0;\n const bRotated = (sin * b.anchor.x + cos * b.anchor.y) | 0;\n return (aRotated - bRotated) || (b.featureIndex - a.featureIndex);\n });\n }\n\n for (const symbolInstance of this.symbolInstances) {\n const textCollisionFeature = {\n boxStartIndex: symbolInstance.textBoxStartIndex,\n boxEndIndex: symbolInstance.textBoxEndIndex\n };\n const iconCollisionFeature = {\n boxStartIndex: symbolInstance.iconBoxStartIndex,\n boxEndIndex: symbolInstance.iconBoxEndIndex\n };\n\n const hasText = !(symbolInstance.textBoxStartIndex === symbolInstance.textBoxEndIndex);\n const hasIcon = !(symbolInstance.iconBoxStartIndex === symbolInstance.iconBoxEndIndex);\n\n const iconWithoutText = layout['text-optional'] || !hasText,\n textWithoutIcon = layout['icon-optional'] || !hasIcon;\n\n\n // Calculate the scales at which the text and icon can be placed without collision.\n\n let glyphScale = hasText ?\n collisionTile.placeCollisionFeature(textCollisionFeature,\n layout['text-allow-overlap'], layout['symbol-avoid-edges']) :\n collisionTile.minScale;\n\n let iconScale = hasIcon ?\n collisionTile.placeCollisionFeature(iconCollisionFeature,\n layout['icon-allow-overlap'], layout['symbol-avoid-edges']) :\n collisionTile.minScale;\n\n\n // Combine the scales for icons and text.\n\n if (!iconWithoutText && !textWithoutIcon) {\n iconScale = glyphScale = Math.max(iconScale, glyphScale);\n } else if (!textWithoutIcon && glyphScale) {\n glyphScale = Math.max(iconScale, glyphScale);\n } else if (!iconWithoutText && iconScale) {\n iconScale = Math.max(iconScale, glyphScale);\n }\n\n\n // Insert final placement into collision tree and add glyphs/icons to buffers\n\n if (hasText) {\n collisionTile.insertCollisionFeature(textCollisionFeature, glyphScale, layout['text-ignore-placement']);\n if (glyphScale <= maxScale) {\n this.addSymbols(this.arrays.glyph, symbolInstance.glyphQuads, glyphScale, layout['text-keep-upright'], textAlongLine, collisionTile.angle, symbolInstance.featureProperties, symbolInstance.writingModes);\n }\n }\n\n if (hasIcon) {\n collisionTile.insertCollisionFeature(iconCollisionFeature, iconScale, layout['icon-ignore-placement']);\n if (iconScale <= maxScale) {\n this.addSymbols(this.arrays.icon, symbolInstance.iconQuads, iconScale, layout['icon-keep-upright'], iconAlongLine, collisionTile.angle, symbolInstance.featureProperties);\n }\n }\n\n }\n\n if (showCollisionBoxes) this.addToDebugBuffers(collisionTile);\n }\n\n addSymbols(arrays, quads, scale, keepUpright, alongLine, placementAngle, featureProperties, writingModes) {\n const elementArray = arrays.elementArray;\n const layoutVertexArray = arrays.layoutVertexArray;\n\n const zoom = this.zoom;\n const placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0);\n\n for (const symbol of quads) {\n // drop incorrectly oriented glyphs\n const a = (symbol.anchorAngle + placementAngle + Math.PI) % (Math.PI * 2);\n if (writingModes & WritingMode.vertical) {\n if (alongLine && symbol.writingMode === WritingMode.vertical) {\n if (keepUpright && alongLine && a <= (Math.PI * 5 / 4) || a > (Math.PI * 7 / 4)) continue;\n } else if (keepUpright && alongLine && a <= (Math.PI * 3 / 4) || a > (Math.PI * 5 / 4)) continue;\n } else if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue;\n\n const tl = symbol.tl,\n tr = symbol.tr,\n bl = symbol.bl,\n br = symbol.br,\n tex = symbol.tex,\n anchorPoint = symbol.anchorPoint;\n\n let minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom);\n const maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25);\n\n if (maxZoom <= minZoom) continue;\n\n // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels\n if (minZoom === placementZoom) minZoom = 0;\n\n // Encode angle of glyph\n const glyphAngle = Math.round((symbol.glyphAngle / (Math.PI * 2)) * 256);\n\n const segment = arrays.prepareSegment(4);\n const index = segment.vertexLength;\n\n addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom, glyphAngle);\n addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom, glyphAngle);\n addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle);\n addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle);\n\n elementArray.emplaceBack(index, index + 1, index + 2);\n elementArray.emplaceBack(index + 1, index + 2, index + 3);\n\n segment.vertexLength += 4;\n segment.primitiveLength += 2;\n }\n\n arrays.populatePaintArrays(featureProperties);\n }\n\n addToDebugBuffers(collisionTile) {\n const arrays = this.arrays.collisionBox;\n const layoutVertexArray = arrays.layoutVertexArray;\n const elementArray = arrays.elementArray;\n\n const angle = -collisionTile.angle;\n const yStretch = collisionTile.yStretch;\n\n for (const symbolInstance of this.symbolInstances) {\n symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex};\n symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex};\n\n for (let i = 0; i < 2; i++) {\n const feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];\n if (!feature) continue;\n\n for (let b = feature.boxStartIndex; b < feature.boxEndIndex; b++) {\n const box = this.collisionBoxArray.get(b);\n const anchorPoint = box.anchorPoint;\n\n const tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle);\n const tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle);\n const bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle);\n const br = new Point(box.x2, box.y2 * yStretch)._rotate(angle);\n\n const maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2));\n const placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2));\n\n const segment = arrays.prepareSegment(4);\n const index = segment.vertexLength;\n\n addCollisionBoxVertex(layoutVertexArray, anchorPoint, tl, maxZoom, placementZoom);\n addCollisionBoxVertex(layoutVertexArray, anchorPoint, tr, maxZoom, placementZoom);\n addCollisionBoxVertex(layoutVertexArray, anchorPoint, br, maxZoom, placementZoom);\n addCollisionBoxVertex(layoutVertexArray, anchorPoint, bl, maxZoom, placementZoom);\n\n elementArray.emplaceBack(index, index + 1);\n elementArray.emplaceBack(index + 1, index + 2);\n elementArray.emplaceBack(index + 2, index + 3);\n elementArray.emplaceBack(index + 3, index);\n\n segment.vertexLength += 4;\n segment.primitiveLength += 4;\n }\n }\n }\n }\n\n addSymbolInstance(anchor, line, shapedTextOrientations, shapedIcon, layer, addToBuffers, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex,\n textBoxScale, textPadding, textAlongLine,\n iconBoxScale, iconPadding, iconAlongLine, globalProperties, featureProperties) {\n\n let textCollisionFeature, iconCollisionFeature;\n let iconQuads = [];\n let glyphQuads = [];\n for (const writingModeString in shapedTextOrientations) {\n const writingMode = parseInt(writingModeString, 10);\n if (!shapedTextOrientations[writingMode]) continue;\n glyphQuads = glyphQuads.concat(addToBuffers ? getGlyphQuads(anchor, shapedTextOrientations[writingMode], textBoxScale, line, layer, textAlongLine) : []);\n textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedTextOrientations[writingMode], textBoxScale, textPadding, textAlongLine, false);\n }\n\n const textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n const textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n if (shapedIcon) {\n iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layer, iconAlongLine, shapedTextOrientations[WritingMode.horizontal], globalProperties, featureProperties) : [];\n iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconAlongLine, true);\n }\n\n const iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : this.collisionBoxArray.length;\n const iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : this.collisionBoxArray.length;\n\n if (textBoxEndIndex > SymbolBucket.MAX_INSTANCES) util.warnOnce(\"Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\");\n if (iconBoxEndIndex > SymbolBucket.MAX_INSTANCES) util.warnOnce(\"Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907\");\n\n const writingModes = (\n (shapedTextOrientations[WritingMode.vertical] ? WritingMode.vertical : 0) |\n (shapedTextOrientations[WritingMode.horizontal] ? WritingMode.horizontal : 0)\n );\n\n this.symbolInstances.push({\n textBoxStartIndex,\n textBoxEndIndex,\n iconBoxStartIndex,\n iconBoxEndIndex,\n glyphQuads,\n iconQuads,\n anchor,\n featureIndex,\n featureProperties,\n writingModes\n });\n }\n}\n\nSymbolBucket.programInterfaces = symbolInterfaces;\n\n// this constant is based on the size of StructArray indexes used in a symbol\n// bucket--namely, iconBoxEndIndex and textBoxEndIndex\n// eg the max valid UInt16 is 65,535\nSymbolBucket.MAX_INSTANCES = 65535;\n\nmodule.exports = SymbolBucket;\n","'use strict';\n\n/**\n * @enum {string} AttributeType\n * @private\n * @readonly\n */\nconst AttributeType = {\n Int8: 'BYTE',\n Uint8: 'UNSIGNED_BYTE',\n Int16: 'SHORT',\n Uint16: 'UNSIGNED_SHORT'\n};\n\n/**\n * The `Buffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's\n * Struct type is converted to a WebGL atribute.\n * @private\n */\nclass Buffer {\n /**\n * @param {Object} array A serialized StructArray.\n * @param {Object} arrayType A serialized StructArrayType.\n * @param {BufferType} type\n */\n constructor(array, arrayType, type) {\n this.arrayBuffer = array.arrayBuffer;\n this.length = array.length;\n this.attributes = arrayType.members;\n this.itemSize = arrayType.bytesPerElement;\n this.type = type;\n this.arrayType = arrayType;\n }\n\n static fromStructArray(array, type) {\n return new Buffer(array.serialize(), array.constructor.serialize(), type);\n }\n\n /**\n * Bind this buffer to a WebGL context.\n * @param gl The WebGL context\n */\n bind(gl) {\n const type = gl[this.type];\n\n if (!this.buffer) {\n this.gl = gl;\n this.buffer = gl.createBuffer();\n gl.bindBuffer(type, this.buffer);\n gl.bufferData(type, this.arrayBuffer, gl.STATIC_DRAW);\n\n // dump array buffer once it's bound to gl\n this.arrayBuffer = null;\n } else {\n gl.bindBuffer(type, this.buffer);\n }\n }\n\n /**\n * Set the attribute pointers in a WebGL context\n * @param gl The WebGL context\n * @param program The active WebGL program\n * @param vertexOffset Index of the starting vertex of the segment\n */\n setVertexAttribPointers(gl, program, vertexOffset) {\n for (let j = 0; j < this.attributes.length; j++) {\n const member = this.attributes[j];\n const attribIndex = program[member.name];\n\n if (attribIndex !== undefined) {\n gl.vertexAttribPointer(\n attribIndex,\n member.components,\n gl[AttributeType[member.type]],\n false,\n this.arrayType.bytesPerElement,\n member.offset + (this.arrayType.bytesPerElement * vertexOffset || 0)\n );\n }\n }\n }\n\n /**\n * Destroy the GL buffer bound to the given WebGL context\n * @param gl The WebGL context\n */\n destroy() {\n if (this.buffer) {\n this.gl.deleteBuffer(this.buffer);\n }\n }\n}\n\n/**\n * @enum {string} BufferType\n * @private\n * @readonly\n */\nBuffer.BufferType = {\n VERTEX: 'ARRAY_BUFFER',\n ELEMENT: 'ELEMENT_ARRAY_BUFFER'\n};\n\nmodule.exports = Buffer;\n","'use strict';\n\nconst util = require('../util/util');\nconst Buffer = require('./buffer');\nconst ProgramConfiguration = require('./program_configuration');\nconst VertexArrayObject = require('../render/vertex_array_object');\n\n/**\n * A class containing vertex and element arrays for a bucket, ready for use in\n * a WebGL program. See {@link ArrayGroup} for details.\n *\n * @private\n */\nclass BufferGroup {\n constructor(programInterface, layers, zoom, arrays) {\n this.layoutVertexBuffer = new Buffer(arrays.layoutVertexArray,\n programInterface.layoutVertexArrayType.serialize(), Buffer.BufferType.VERTEX);\n\n if (arrays.elementArray) {\n this.elementBuffer = new Buffer(arrays.elementArray,\n programInterface.elementArrayType.serialize(), Buffer.BufferType.ELEMENT);\n }\n\n if (arrays.elementArray2) {\n this.elementBuffer2 = new Buffer(arrays.elementArray2,\n programInterface.elementArrayType2.serialize(), Buffer.BufferType.ELEMENT);\n }\n\n this.layerData = {};\n for (const layer of layers) {\n const array = arrays.paintVertexArrays && arrays.paintVertexArrays[layer.id];\n const programConfiguration = ProgramConfiguration.createDynamic(programInterface.paintAttributes || [], layer, zoom);\n const paintVertexBuffer = array ? new Buffer(array.array, array.type, Buffer.BufferType.VERTEX) : null;\n this.layerData[layer.id] = {programConfiguration, paintVertexBuffer};\n }\n\n this.segments = arrays.segments;\n this.segments2 = arrays.segments2;\n\n for (const segments of [this.segments, this.segments2]) {\n for (const segment of segments || []) {\n segment.vaos = util.mapObject(this.layerData, () => new VertexArrayObject());\n }\n }\n }\n\n destroy() {\n this.layoutVertexBuffer.destroy();\n\n if (this.elementBuffer) {\n this.elementBuffer.destroy();\n }\n if (this.elementBuffer2) {\n this.elementBuffer2.destroy();\n }\n for (const layerId in this.layerData) {\n const paintVertexBuffer = this.layerData[layerId].paintVertexBuffer;\n if (paintVertexBuffer) {\n paintVertexBuffer.destroy();\n }\n }\n for (const segments of [this.segments, this.segments2]) {\n for (const segment of segments || []) {\n for (const k in segment.vaos) {\n segment.vaos[k].destroy();\n }\n }\n }\n }\n}\n\nmodule.exports = BufferGroup;\n","'use strict';\n\nconst createStructArrayType = require('../util/struct_array');\n\nmodule.exports = createElementArrayType;\n\n/**\n * An element array stores Uint16 indicies of vertexes in a corresponding vertex array. With no\n * arguments, it defaults to three components per element, forming triangles.\n * @private\n */\nfunction createElementArrayType(components) {\n return createStructArrayType({\n members: [{\n type: 'Uint16',\n name: 'vertices',\n components: components || 3\n }]\n });\n}\n","'use strict';\n\n/**\n * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of\n * all source features normalized to this extent upon load.\n *\n * The value is a consequence of the following:\n *\n * * Vertex buffer store positions as signed 16 bit integers.\n * * One bit is lost for signedness to support tile buffers.\n * * One bit is lost because the line vertex buffer packs 1 bit of other data into the int.\n * * One bit is lost to support features extending past the extent on the right edge of the tile.\n * * This leaves us with 2^13 = 8192\n *\n * @private\n * @readonly\n */\nmodule.exports = 8192;\n","'use strict';\n\nconst assert = require('assert');\nconst Point = require('point-geometry');\nconst loadGeometry = require('./load_geometry');\nconst EXTENT = require('./extent');\nconst featureFilter = require('../style-spec/feature_filter');\nconst createStructArrayType = require('../util/struct_array');\nconst Grid = require('grid-index');\nconst DictionaryCoder = require('../util/dictionary_coder');\nconst vt = require('vector-tile');\nconst Protobuf = require('pbf');\nconst GeoJSONFeature = require('../util/vectortile_to_geojson');\nconst arraysIntersect = require('../util/util').arraysIntersect;\n\nconst intersection = require('../util/intersection_tests');\nconst multiPolygonIntersectsBufferedMultiPoint = intersection.multiPolygonIntersectsBufferedMultiPoint;\nconst multiPolygonIntersectsMultiPolygon = intersection.multiPolygonIntersectsMultiPolygon;\nconst multiPolygonIntersectsBufferedMultiLine = intersection.multiPolygonIntersectsBufferedMultiLine;\n\nconst FeatureIndexArray = createStructArrayType({\n members: [\n // the index of the feature in the original vectortile\n { type: 'Uint32', name: 'featureIndex' },\n // the source layer the feature appears in\n { type: 'Uint16', name: 'sourceLayerIndex' },\n // the bucket the feature appears in\n { type: 'Uint16', name: 'bucketIndex' }\n ]\n});\n\nclass FeatureIndex {\n constructor(coord, overscaling, collisionTile) {\n if (coord.grid) {\n const serialized = coord;\n const rawTileData = overscaling;\n coord = serialized.coord;\n overscaling = serialized.overscaling;\n this.grid = new Grid(serialized.grid);\n this.featureIndexArray = new FeatureIndexArray(serialized.featureIndexArray);\n this.rawTileData = rawTileData;\n this.bucketLayerIDs = serialized.bucketLayerIDs;\n this.paintPropertyStatistics = serialized.paintPropertyStatistics;\n } else {\n this.grid = new Grid(EXTENT, 16, 0);\n this.featureIndexArray = new FeatureIndexArray();\n }\n this.coord = coord;\n this.overscaling = overscaling;\n this.x = coord.x;\n this.y = coord.y;\n this.z = coord.z - Math.log(overscaling) / Math.LN2;\n this.setCollisionTile(collisionTile);\n }\n\n insert(feature, bucketIndex) {\n const key = this.featureIndexArray.length;\n this.featureIndexArray.emplaceBack(feature.index, feature.sourceLayerIndex, bucketIndex);\n const geometry = loadGeometry(feature);\n\n for (let r = 0; r < geometry.length; r++) {\n const ring = geometry[r];\n\n const bbox = [Infinity, Infinity, -Infinity, -Infinity];\n for (let i = 0; i < ring.length; i++) {\n const p = ring[i];\n bbox[0] = Math.min(bbox[0], p.x);\n bbox[1] = Math.min(bbox[1], p.y);\n bbox[2] = Math.max(bbox[2], p.x);\n bbox[3] = Math.max(bbox[3], p.y);\n }\n\n this.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]);\n }\n }\n\n setCollisionTile(collisionTile) {\n this.collisionTile = collisionTile;\n }\n\n serialize(transferables) {\n const grid = this.grid.toArrayBuffer();\n if (transferables) {\n transferables.push(grid);\n }\n return {\n coord: this.coord,\n overscaling: this.overscaling,\n grid: grid,\n featureIndexArray: this.featureIndexArray.serialize(transferables),\n bucketLayerIDs: this.bucketLayerIDs,\n paintPropertyStatistics: this.paintPropertyStatistics\n };\n }\n\n // Finds features in this tile at a particular position.\n query(args, styleLayers) {\n if (!this.vtLayers) {\n this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers;\n this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']);\n }\n\n const result = {};\n\n const params = args.params || {},\n pixelsToTileUnits = EXTENT / args.tileSize / args.scale,\n filter = featureFilter(params.filter);\n\n // Features are indexed their original geometries. The rendered geometries may\n // be buffered, translated or offset. Figure out how much the search radius needs to be\n // expanded by to include these features.\n let additionalRadius = 0;\n for (const id in styleLayers) {\n // Since FeatureIndex is owned by a particular tile, make sure we\n // only consider style layers whose data are present.\n if (!this.hasLayer(id)) continue;\n\n const styleLayer = styleLayers[id];\n\n let styleLayerDistance = 0;\n if (styleLayer.type === 'line') {\n const width = getLineWidth(this.getPaintValue('line-width', styleLayer),\n this.getPaintValue('line-gap-width', styleLayer));\n const offset = this.getPaintValue('line-offset', styleLayer);\n const translate = this.getPaintValue('line-translate', styleLayer);\n styleLayerDistance = width / 2 + Math.abs(offset) + translateDistance(translate);\n } else if (styleLayer.type === 'fill') {\n styleLayerDistance = translateDistance(this.getPaintValue('fill-translate', styleLayer));\n } else if (styleLayer.type === 'fill-extrusion') {\n styleLayerDistance = translateDistance(this.getPaintValue('fill-extrusion-translate', styleLayer));\n } else if (styleLayer.type === 'circle') {\n styleLayerDistance = this.getPaintValue('circle-radius', styleLayer) + translateDistance(this.getPaintValue('circle-translate', styleLayer));\n }\n additionalRadius = Math.max(additionalRadius, styleLayerDistance * pixelsToTileUnits);\n }\n\n const queryGeometry = args.queryGeometry.map((q) => {\n return q.map((p) => {\n return new Point(p.x, p.y);\n });\n });\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < queryGeometry.length; i++) {\n const ring = queryGeometry[i];\n for (let k = 0; k < ring.length; k++) {\n const p = ring[k];\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n }\n }\n\n const matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius);\n matching.sort(topDownFeatureComparator);\n this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n const matchingSymbols = this.collisionTile.queryRenderedSymbols(queryGeometry, args.scale);\n matchingSymbols.sort();\n this.filterMatching(result, matchingSymbols, this.collisionTile.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits);\n\n return result;\n }\n\n filterMatching(result, matching, array, queryGeometry, filter, filterLayerIDs, styleLayers, bearing, pixelsToTileUnits) {\n let previousIndex;\n for (let k = 0; k < matching.length; k++) {\n const index = matching[k];\n\n // don't check the same feature more than once\n if (index === previousIndex) continue;\n previousIndex = index;\n\n const match = array.get(index);\n\n const layerIDs = this.bucketLayerIDs[match.bucketIndex];\n if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) continue;\n\n const sourceLayerName = this.sourceLayerCoder.decode(match.sourceLayerIndex);\n const sourceLayer = this.vtLayers[sourceLayerName];\n const feature = sourceLayer.feature(match.featureIndex);\n\n if (!filter(feature)) continue;\n\n let geometry = null;\n\n for (let l = 0; l < layerIDs.length; l++) {\n const layerID = layerIDs[l];\n\n if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) {\n continue;\n }\n\n const styleLayer = styleLayers[layerID];\n if (!styleLayer) continue;\n\n let translatedPolygon;\n if (styleLayer.type !== 'symbol') {\n // all symbols already match the style\n\n if (!geometry) geometry = loadGeometry(feature);\n\n if (styleLayer.type === 'line') {\n translatedPolygon = translate(queryGeometry,\n this.getPaintValue('line-translate', styleLayer, feature),\n this.getPaintValue('line-translate-anchor', styleLayer, feature),\n bearing, pixelsToTileUnits);\n const halfWidth = pixelsToTileUnits / 2 * getLineWidth(\n this.getPaintValue('line-width', styleLayer, feature),\n this.getPaintValue('line-gap-width', styleLayer, feature));\n const lineOffset = this.getPaintValue('line-offset', styleLayer, feature);\n if (lineOffset) {\n geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits);\n }\n if (!multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth)) continue;\n\n } else if (styleLayer.type === 'fill' || styleLayer.type === 'fill-extrusion') {\n const typePrefix = styleLayer.type;\n translatedPolygon = translate(queryGeometry,\n this.getPaintValue(`${typePrefix}-translate`, styleLayer, feature),\n this.getPaintValue(`${typePrefix}-translate-anchor`, styleLayer, feature),\n bearing, pixelsToTileUnits);\n if (!multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry)) continue;\n\n } else if (styleLayer.type === 'circle') {\n translatedPolygon = translate(queryGeometry,\n this.getPaintValue('circle-translate', styleLayer, feature),\n this.getPaintValue('circle-translate-anchor', styleLayer, feature),\n bearing, pixelsToTileUnits);\n const circleRadius = this.getPaintValue('circle-radius', styleLayer, feature) * pixelsToTileUnits;\n if (!multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, circleRadius)) continue;\n }\n }\n\n const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y);\n geojsonFeature.layer = styleLayer.serialize();\n let layerResult = result[layerID];\n if (layerResult === undefined) {\n layerResult = result[layerID] = [];\n }\n layerResult.push(geojsonFeature);\n }\n }\n }\n\n hasLayer(id) {\n for (const index in this.bucketLayerIDs) {\n for (const layerID of this.bucketLayerIDs[index]) {\n if (id === layerID) return true;\n }\n }\n\n return false;\n }\n\n // Get the given paint property value; if a feature is not provided and the\n // property is data-driven, then default to the maximum value that the\n // property takes in the (tile, layer) that this FeatureIndex is associated with\n getPaintValue(property, layer, feature) {\n const featureConstant = layer.isPaintValueFeatureConstant(property);\n if (featureConstant || feature) {\n const featureProperties = feature ? feature.properties : {};\n return layer.getPaintValue(property, { zoom: this.z }, featureProperties);\n }\n\n assert(property in this.paintPropertyStatistics[layer.id]);\n return this.paintPropertyStatistics[layer.id][property].max;\n }\n\n}\n\nmodule.exports = FeatureIndex;\n\nfunction translateDistance(translate) {\n return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]);\n}\n\nfunction topDownFeatureComparator(a, b) {\n return b - a;\n}\n\nfunction getLineWidth(lineWidth, lineGapWidth) {\n if (lineGapWidth > 0) {\n return lineGapWidth + 2 * lineWidth;\n } else {\n return lineWidth;\n }\n}\n\nfunction translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) {\n if (!translate[0] && !translate[1]) {\n return queryGeometry;\n }\n\n translate = Point.convert(translate);\n\n if (translateAnchor === \"viewport\") {\n translate._rotate(-bearing);\n }\n\n const translated = [];\n for (let i = 0; i < queryGeometry.length; i++) {\n const ring = queryGeometry[i];\n const translatedRing = [];\n for (let k = 0; k < ring.length; k++) {\n translatedRing.push(ring[k].sub(translate._mult(pixelsToTileUnits)));\n }\n translated.push(translatedRing);\n }\n return translated;\n}\n\nfunction offsetLine(rings, offset) {\n const newRings = [];\n const zero = new Point(0, 0);\n for (let k = 0; k < rings.length; k++) {\n const ring = rings[k];\n const newRing = [];\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i - 1];\n const b = ring[i];\n const c = ring[i + 1];\n const aToB = i === 0 ? zero : b.sub(a)._unit()._perp();\n const bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp();\n const extrude = aToB._add(bToC)._unit();\n\n const cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y;\n extrude._mult(1 / cosHalfAngle);\n\n newRing.push(extrude._mult(offset)._add(b));\n }\n newRings.push(newRing);\n }\n return newRings;\n}\n","'use strict';\n\nconst util = require('../util/util');\nconst EXTENT = require('./extent');\nconst assert = require('assert');\n\n\n// These bounds define the minimum and maximum supported coordinate values.\n// While visible coordinates are within [0, EXTENT], tiles may theoretically\n// contain cordinates within [-Infinity, Infinity]. Our range is limited by the\n// number of bits used to represent the coordinate.\nfunction createBounds(bits) {\n return {\n min: -1 * Math.pow(2, bits - 1),\n max: Math.pow(2, bits - 1) - 1\n };\n}\n\nconst boundsLookup = {\n 15: createBounds(15),\n 16: createBounds(16)\n};\n\n/**\n * Loads a geometry from a VectorTileFeature and scales it to the common extent\n * used internally.\n * @param {VectorTileFeature} feature\n * @param {number} [bits=16] The number of signed integer bits available to store\n * each coordinate. A warning will be issued if any coordinate will not fits\n * in the specified number of bits.\n * @private\n */\nmodule.exports = function loadGeometry(feature, bits) {\n const bounds = boundsLookup[bits || 16];\n assert(bounds);\n\n const scale = EXTENT / feature.extent;\n const geometry = feature.loadGeometry();\n for (let r = 0; r < geometry.length; r++) {\n const ring = geometry[r];\n for (let p = 0; p < ring.length; p++) {\n const point = ring[p];\n // round here because mapbox-gl-native uses integers to represent\n // points and we need to do the same to avoid renering differences.\n point.x = Math.round(point.x * scale);\n point.y = Math.round(point.y * scale);\n\n if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) {\n util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size');\n }\n }\n }\n return geometry;\n};\n","'use strict';\n\nconst createStructArrayType = require('../util/struct_array');\n\nconst PosArray = createStructArrayType({\n members: [{ name: 'a_pos', type: 'Int16', components: 2 }]\n});\n\nmodule.exports = PosArray;\n","'use strict';\n\nconst assert = require('assert');\nconst createVertexArrayType = require('./vertex_array_type');\nconst util = require('../util/util');\n\n/**\n * ProgramConfiguration contains the logic for binding style layer properties and tile\n * layer feature data into GL program uniforms and vertex attributes.\n *\n * Non-data-driven property values are bound to shader uniforms. Data-driven property\n * values are bound to vertex attributes. In order to support a uniform GLSL syntax over\n * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma`\n * abstraction, which ProgramConfiguration is responsible for implementing. At runtime,\n * it examines the attributes of a particular layer, combines this with fixed knowledge\n * about how layers of the particular type are implemented, and determines which uniforms\n * and vertex attributes will be required. It can then substitute the appropriate text\n * into the shader source code, create and link a program, and bind the uniforms and\n * vertex attributes in preparation for drawing.\n *\n * When a vector tile is parsed, this same configuration information is used to\n * populate the attribute buffers needed for data-driven styling using the zoom\n * level and feature property data.\n *\n * @private\n */\nclass ProgramConfiguration {\n\n constructor() {\n this.attributes = [];\n this.uniforms = [];\n this.interpolationUniforms = [];\n this.pragmas = {vertex: {}, fragment: {}};\n this.cacheKey = '';\n }\n\n static createDynamic(attributes, layer, zoom) {\n const self = new ProgramConfiguration();\n\n for (const attributeConfig of attributes) {\n const attribute = normalizePaintAttribute(attributeConfig, layer);\n assert(/^a_/.test(attribute.name));\n const name = attribute.name.slice(2);\n\n if (layer.isPaintValueFeatureConstant(attribute.property)) {\n self.addZoomAttribute(name, attribute);\n } else if (layer.isPaintValueZoomConstant(attribute.property)) {\n self.addPropertyAttribute(name, attribute);\n } else {\n self.addZoomAndPropertyAttribute(name, attribute, layer, zoom);\n }\n }\n self.PaintVertexArray = createVertexArrayType(self.attributes);\n\n return self;\n }\n\n static createStatic(uniformNames) {\n const self = new ProgramConfiguration();\n\n for (const name of uniformNames) {\n self.addUniform(name, `u_${name}`);\n }\n return self;\n }\n\n addUniform(name, inputName) {\n const pragmas = this.getPragmas(name);\n\n pragmas.define.push(`uniform {precision} {type} ${inputName};`);\n pragmas.initialize.push(`{precision} {type} ${name} = ${inputName};`);\n\n this.cacheKey += `/u_${name}`;\n }\n\n addZoomAttribute(name, attribute) {\n this.uniforms.push(attribute);\n this.addUniform(name, attribute.name);\n }\n\n addPropertyAttribute(name, attribute) {\n const pragmas = this.getPragmas(name);\n\n this.attributes.push(attribute);\n\n pragmas.define.push(`varying {precision} {type} ${name};`);\n\n pragmas.vertex.define.push(`attribute {precision} {type} ${attribute.name};`);\n pragmas.vertex.initialize.push(`${name} = ${attribute.name} / ${attribute.multiplier}.0;`);\n\n this.cacheKey += `/a_${name}`;\n }\n\n addZoomAndPropertyAttribute(name, attribute, layer, zoom) {\n const pragmas = this.getPragmas(name);\n\n pragmas.define.push(`varying {precision} {type} ${name};`);\n\n // Pick the index of the first offset to add to the buffers.\n let numStops = 0;\n const zoomLevels = layer.getPaintValueStopZoomLevels(attribute.property);\n while (numStops < zoomLevels.length && zoomLevels[numStops] < zoom) numStops++;\n const stopOffset = Math.max(0, Math.min(zoomLevels.length - 4, numStops - 2));\n\n const tName = `u_${name}_t`;\n\n pragmas.vertex.define.push(`uniform lowp float ${tName};`);\n\n this.interpolationUniforms.push({\n name: tName,\n property: attribute.property,\n stopOffset\n });\n\n // Find the four closest stops, ideally with two on each side of the zoom level.\n const zoomStops = [];\n for (let s = 0; s < 4; s++) {\n zoomStops.push(zoomLevels[Math.min(stopOffset + s, zoomLevels.length - 1)]);\n }\n\n const componentNames = [];\n\n if (attribute.components === 1) {\n this.attributes.push(util.extend({}, attribute, {\n components: 4,\n zoomStops\n }));\n pragmas.vertex.define.push(`attribute {precision} vec4 ${attribute.name};`);\n componentNames.push(attribute.name);\n\n } else {\n for (let k = 0; k < 4; k++) {\n const componentName = attribute.name + k;\n componentNames.push(componentName);\n\n this.attributes.push(util.extend({}, attribute, {\n name: componentName,\n zoomStops: [zoomStops[k]]\n }));\n pragmas.vertex.define.push(`attribute {precision} {type} ${componentName};`);\n }\n }\n pragmas.vertex.initialize.push(`${name} = evaluate_zoom_function_${attribute.components}(\\\n ${componentNames.join(', ')}, ${tName}) / ${attribute.multiplier}.0;`);\n\n this.cacheKey += `/z_${name}`;\n }\n\n getPragmas(name) {\n if (!this.pragmas[name]) {\n this.pragmas[name] = {define: [], initialize: []};\n this.pragmas[name].fragment = {define: [], initialize: []};\n this.pragmas[name].vertex = {define: [], initialize: []};\n }\n return this.pragmas[name];\n }\n\n applyPragmas(source, shaderType) {\n return source.replace(/#pragma mapbox: ([\\w]+) ([\\w]+) ([\\w]+) ([\\w]+)/g, (match, operation, precision, type, name) => {\n return this.pragmas[name][operation].concat(this.pragmas[name][shaderType][operation])\n .join('\\n')\n .replace(/{type}/g, type)\n .replace(/{precision}/g, precision);\n });\n }\n\n // Since this object is accessed frequently during populatePaintArray, it\n // is helpful to initialize it ahead of time to avoid recalculating\n // 'hidden class' optimizations to take effect\n createPaintPropertyStatistics() {\n const paintPropertyStatistics = {};\n for (const attribute of this.attributes) {\n if (attribute.dimensions !== 1) continue;\n paintPropertyStatistics[attribute.property] = {\n max: -Infinity\n };\n }\n return paintPropertyStatistics;\n }\n\n populatePaintArray(layer, paintArray, paintPropertyStatistics, length, globalProperties, featureProperties) {\n const start = paintArray.length;\n paintArray.resize(length);\n\n for (const attribute of this.attributes) {\n const value = getPaintAttributeValue(attribute, layer, globalProperties, featureProperties);\n\n for (let i = start; i < length; i++) {\n const vertex = paintArray.get(i);\n if (attribute.components === 4) {\n for (let c = 0; c < 4; c++) {\n vertex[attribute.name + c] = value[c] * attribute.multiplier;\n }\n } else {\n vertex[attribute.name] = value * attribute.multiplier;\n }\n if (attribute.dimensions === 1) {\n const stats = paintPropertyStatistics[attribute.property];\n stats.max = Math.max(stats.max,\n attribute.components === 1 ? value : Math.max.apply(Math, value));\n }\n }\n }\n }\n\n setUniforms(gl, program, layer, globalProperties) {\n for (const uniform of this.uniforms) {\n const value = layer.getPaintValue(uniform.property, globalProperties);\n if (uniform.components === 4) {\n gl.uniform4fv(program[uniform.name], value);\n } else {\n gl.uniform1f(program[uniform.name], value);\n }\n }\n for (const uniform of this.interpolationUniforms) {\n // stopInterp indicates which stops need to be interpolated.\n // If stopInterp is 3.5 then interpolate half way between stops 3 and 4.\n const stopInterp = layer.getPaintInterpolationT(uniform.property, globalProperties);\n // We can only store four stop values in the buffers. stopOffset is the number of stops that come\n // before the stops that were added to the buffers.\n gl.uniform1f(program[uniform.name], Math.max(0, Math.min(4, stopInterp - uniform.stopOffset)));\n }\n }\n}\n\nfunction getPaintAttributeValue(attribute, layer, globalProperties, featureProperties) {\n if (!attribute.zoomStops) {\n return layer.getPaintValue(attribute.property, globalProperties, featureProperties);\n }\n // add one multi-component value like color0, or pack multiple single-component values into a four component attribute\n const values = attribute.zoomStops.map((zoom) => layer.getPaintValue(\n attribute.property, util.extend({}, globalProperties, {zoom}), featureProperties));\n\n return values.length === 1 ? values[0] : values;\n}\n\nfunction normalizePaintAttribute(attribute, layer) {\n let name = attribute.name;\n\n // by default, construct the shader variable name for paint attribute\n // `layertype-some-property` as `some_property`\n if (!name) {\n name = attribute.property.replace(`${layer.type}-`, '').replace(/-/g, '_');\n }\n const isColor = layer._paintSpecifications[attribute.property].type === 'color';\n\n return util.extend({\n name: `a_${name}`,\n components: isColor ? 4 : 1,\n multiplier: isColor ? 255 : 1,\n // distinct from `components`, because components can be overridden for\n // zoom interpolation\n dimensions: isColor ? 4 : 1\n }, attribute);\n}\n\nmodule.exports = ProgramConfiguration;\n","'use strict';\n\nconst createStructArrayType = require('../util/struct_array');\n\nconst RasterBoundsArray = createStructArrayType({\n members: [\n { name: 'a_pos', type: 'Int16', components: 2 },\n { name: 'a_texture_pos', type: 'Int16', components: 2 }\n ]\n});\n\nmodule.exports = RasterBoundsArray;\n","'use strict';\n\nconst createStructArrayType = require('../util/struct_array');\n\nmodule.exports = createVertexArrayType;\n\n/**\n * A vertex array stores data for each vertex in a geometry. Elements are aligned to 4 byte\n * boundaries for best performance in WebGL.\n * @private\n */\nfunction createVertexArrayType(members) {\n return createStructArrayType({\n members: members,\n alignment: 4\n });\n}\n","'use strict';\n// \n\n/**\n * A coordinate is a column, row, zoom combination, often used\n * as the data component of a tile.\n *\n * @param {number} column\n * @param {number} row\n * @param {number} zoom\n * @private\n */\nclass Coordinate {\n \n \n \n constructor(column , row , zoom ) {\n this.column = column;\n this.row = row;\n this.zoom = zoom;\n }\n\n /**\n * Create a clone of this coordinate that can be mutated without\n * changing the original coordinate\n *\n * @returns {Coordinate} clone\n * @private\n * var coord = new Coordinate(0, 0, 0);\n * var c2 = coord.clone();\n * // since coord is cloned, modifying a property of c2 does\n * // not modify it.\n * c2.zoom = 2;\n */\n clone() {\n return new Coordinate(this.column, this.row, this.zoom);\n }\n\n /**\n * Zoom this coordinate to a given zoom level. This returns a new\n * coordinate object, not mutating the old one.\n *\n * @param {number} zoom\n * @returns {Coordinate} zoomed coordinate\n * @private\n * @example\n * var coord = new Coordinate(0, 0, 0);\n * var c2 = coord.zoomTo(1);\n * c2 // equals new Coordinate(0, 0, 1);\n */\n zoomTo(zoom ) { return this.clone()._zoomTo(zoom); }\n\n /**\n * Subtract the column and row values of this coordinate from those\n * of another coordinate. The other coordinat will be zoomed to the\n * same level as `this` before the subtraction occurs\n *\n * @param {Coordinate} c other coordinate\n * @returns {Coordinate} result\n * @private\n */\n sub(c ) { return this.clone()._sub(c); }\n\n _zoomTo(zoom ) {\n const scale = Math.pow(2, zoom - this.zoom);\n this.column *= scale;\n this.row *= scale;\n this.zoom = zoom;\n return this;\n }\n\n _sub(c ) {\n c = c.zoomTo(this.zoom);\n this.column -= c.column;\n this.row -= c.row;\n return this;\n }\n}\n\nmodule.exports = Coordinate;\n","'use strict';\n\nconst wrap = require('../util/util').wrap;\n\n/**\n * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees.\n *\n * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON.\n *\n * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option\n * can also accept an `Array` of two numbers and will perform an implicit conversion.\n * This flexible type is documented as [`LngLatLike`](#LngLatLike).\n *\n * @param {number} lng Longitude, measured in degrees.\n * @param {number} lat Latitude, measured in degrees.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/)\n * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/)\n * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/)\n */\nclass LngLat {\n constructor(lng, lat) {\n if (isNaN(lng) || isNaN(lat)) {\n throw new Error(`Invalid LngLat object: (${lng}, ${lat})`);\n }\n this.lng = +lng;\n this.lat = +lat;\n if (this.lat > 90 || this.lat < -90) {\n throw new Error('Invalid LngLat latitude value: must be between -90 and 90');\n }\n }\n\n /**\n * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180).\n *\n * @returns {LngLat} The wrapped `LngLat` object.\n * @example\n * var ll = new mapboxgl.LngLat(286.0251, 40.7736);\n * var wrapped = ll.wrap();\n * wrapped.lng; // = -73.9749\n */\n wrap() {\n return new LngLat(wrap(this.lng, -180, 180), this.lat);\n }\n\n /**\n * Returns the coordinates represented as an array of two numbers.\n *\n * @returns {Array} The coordinates represeted as an array of longitude and latitude.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toArray(); // = [-73.9749, 40.7736]\n */\n toArray() {\n return [this.lng, this.lat];\n }\n\n /**\n * Returns the coordinates represent as a string.\n *\n * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`.\n * @example\n * var ll = new mapboxgl.LngLat(-73.9749, 40.7736);\n * ll.toString(); // = \"LngLat(-73.9749, 40.7736)\"\n */\n toString() {\n return `LngLat(${this.lng}, ${this.lat})`;\n }\n}\n\n/**\n * Converts an array of two numbers to a `LngLat` object.\n *\n * If a `LngLat` object is passed in, the function returns it unchanged.\n *\n * @param {LngLatLike} input An array of two numbers to convert, or a `LngLat` object to return.\n * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object.\n * @example\n * var arr = [-73.9749, 40.7736];\n * var ll = mapboxgl.LngLat.convert(arr);\n * ll; // = LngLat {lng: -73.9749, lat: 40.7736}\n */\nLngLat.convert = function (input) {\n if (input instanceof LngLat) {\n return input;\n } else if (input && input.hasOwnProperty('lng') && input.hasOwnProperty('lat')) {\n return new LngLat(input.lng, input.lat);\n } else if (Array.isArray(input) && input.length === 2) {\n return new LngLat(input[0], input[1]);\n } else {\n throw new Error(\"`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, or an array of [, ]\");\n }\n};\n\nmodule.exports = LngLat;\n","'use strict';\n\nconst LngLat = require('./lng_lat');\n\n/**\n * A `LngLatBounds` object represents a geographical bounding box,\n * defined by its southwest and northeast points in longitude and latitude.\n *\n * If no arguments are provided to the constructor, a `null` bounding box is created.\n *\n * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option\n * can also accept an `Array` of two [`LngLatLike`](#LngLatLike) constructs and will perform an implicit conversion.\n * This flexible type is documented as [`LngLatBoundsLike`](#LngLatBoundsLike).\n *\n * @param {LngLatLike} [sw] The southwest corner of the bounding box.\n * @param {LngLatLike} [ne] The northeast corner of the bounding box.\n * @example\n * var sw = new mapboxgl.LngLat(-73.9876, 40.7661);\n * var ne = new mapboxgl.LngLat(-73.9397, 40.8002);\n * var llb = new mapboxgl.LngLatBounds(sw, ne);\n */\nclass LngLatBounds {\n constructor(sw, ne) {\n if (!sw) {\n return;\n } else if (ne) {\n this.setSouthWest(sw).setNorthEast(ne);\n } else if (sw.length === 4) {\n this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]);\n } else {\n this.setSouthWest(sw[0]).setNorthEast(sw[1]);\n }\n }\n\n /**\n * Set the northeast corner of the bounding box\n *\n * @param {LngLatLike} ne\n * @returns {LngLatBounds} `this`\n */\n setNorthEast(ne) {\n this._ne = LngLat.convert(ne);\n return this;\n }\n\n /**\n * Set the southwest corner of the bounding box\n *\n * @param {LngLatLike} sw\n * @returns {LngLatBounds} `this`\n */\n setSouthWest(sw) {\n this._sw = LngLat.convert(sw);\n return this;\n }\n\n /**\n * Extend the bounds to include a given LngLat or LngLatBounds.\n *\n * @param {LngLat|LngLatBounds} obj object to extend to\n * @returns {LngLatBounds} `this`\n */\n extend(obj) {\n const sw = this._sw,\n ne = this._ne;\n let sw2, ne2;\n\n if (obj instanceof LngLat) {\n sw2 = obj;\n ne2 = obj;\n\n } else if (obj instanceof LngLatBounds) {\n sw2 = obj._sw;\n ne2 = obj._ne;\n\n if (!sw2 || !ne2) return this;\n\n } else {\n if (Array.isArray(obj)) {\n if (obj.every(Array.isArray)) {\n return this.extend(LngLatBounds.convert(obj));\n } else {\n return this.extend(LngLat.convert(obj));\n }\n }\n return this;\n }\n\n if (!sw && !ne) {\n this._sw = new LngLat(sw2.lng, sw2.lat);\n this._ne = new LngLat(ne2.lng, ne2.lat);\n\n } else {\n sw.lng = Math.min(sw2.lng, sw.lng);\n sw.lat = Math.min(sw2.lat, sw.lat);\n ne.lng = Math.max(ne2.lng, ne.lng);\n ne.lat = Math.max(ne2.lat, ne.lat);\n }\n\n return this;\n }\n\n /**\n * Returns the geographical coordinate equidistant from the bounding box's corners.\n *\n * @returns {LngLat} The bounding box's center.\n * @example\n * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315}\n */\n getCenter() {\n return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2);\n }\n\n /**\n * Returns the southwest corner of the bounding box.\n *\n * @returns {LngLat} The southwest corner of the bounding box.\n */\n getSouthWest() { return this._sw; }\n\n /**\n * Returns the northeast corner of the bounding box.\n *\n * @returns {LngLat} The northeast corner of the bounding box.\n */\n getNorthEast() { return this._ne; }\n\n /**\n * Returns the northwest corner of the bounding box.\n *\n * @returns {LngLat} The northwest corner of the bounding box.\n */\n getNorthWest() { return new LngLat(this.getWest(), this.getNorth()); }\n\n /**\n * Returns the southeast corner of the bounding box.\n *\n * @returns {LngLat} The southeast corner of the bounding box.\n */\n getSouthEast() { return new LngLat(this.getEast(), this.getSouth()); }\n\n /**\n * Returns the west edge of the bounding box.\n *\n * @returns {number} The west edge of the bounding box.\n */\n getWest() { return this._sw.lng; }\n\n /**\n * Returns the south edge of the bounding box.\n *\n * @returns {number} The south edge of the bounding box.\n */\n getSouth() { return this._sw.lat; }\n\n /**\n * Returns the east edge of the bounding box.\n *\n * @returns {number} The east edge of the bounding box.\n */\n getEast() { return this._ne.lng; }\n\n /**\n * Returns the north edge of the bounding box.\n *\n * @returns {number} The north edge of the bounding box.\n */\n getNorth() { return this._ne.lat; }\n\n /**\n * Returns the bounding box represented as an array.\n *\n * @returns {Array>} The bounding box represented as an array, consisting of the\n * southwest and northeast coordinates of the bounding represented as arrays of numbers.\n * @example\n * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]]\n */\n toArray () {\n return [this._sw.toArray(), this._ne.toArray()];\n }\n\n /**\n * Return the bounding box represented as a string.\n *\n * @returns {string} The bounding box represents as a string of the format\n * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`.\n * @example\n * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]);\n * llb.toString(); // = \"LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))\"\n */\n toString () {\n return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`;\n }\n}\n\n/**\n * Converts an array to a `LngLatBounds` object.\n *\n * If a `LngLatBounds` object is passed in, the function returns it unchanged.\n *\n * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values.\n *\n * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return.\n * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object.\n * @example\n * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n * var llb = mapboxgl.LngLatBounds.convert(arr);\n * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}}\n */\nLngLatBounds.convert = function (input) {\n if (!input || input instanceof LngLatBounds) return input;\n return new LngLatBounds(input);\n};\n\nmodule.exports = LngLatBounds;\n","'use strict';\n\nconst LngLat = require('./lng_lat'),\n Point = require('point-geometry'),\n Coordinate = require('./coordinate'),\n util = require('../util/util'),\n interp = require('../util/interpolate'),\n TileCoord = require('../source/tile_coord'),\n EXTENT = require('../data/extent'),\n glmatrix = require('@mapbox/gl-matrix');\n\nconst vec4 = glmatrix.vec4,\n mat4 = glmatrix.mat4,\n mat2 = glmatrix.mat2;\n\n/**\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n * @private\n */\nclass Transform {\n constructor(minZoom, maxZoom, renderWorldCopies) {\n this.tileSize = 512; // constant\n\n this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies;\n this._minZoom = minZoom || 0;\n this._maxZoom = maxZoom || 22;\n\n this.latRange = [-85.05113, 85.05113];\n\n this.width = 0;\n this.height = 0;\n this._center = new LngLat(0, 0);\n this.zoom = 0;\n this.angle = 0;\n this._fov = 0.6435011087932844;\n this._pitch = 0;\n this._unmodified = true;\n }\n\n get minZoom() { return this._minZoom; }\n set minZoom(zoom) {\n if (this._minZoom === zoom) return;\n this._minZoom = zoom;\n this.zoom = Math.max(this.zoom, zoom);\n }\n\n get maxZoom() { return this._maxZoom; }\n set maxZoom(zoom) {\n if (this._maxZoom === zoom) return;\n this._maxZoom = zoom;\n this.zoom = Math.min(this.zoom, zoom);\n }\n\n get worldSize() {\n return this.tileSize * this.scale;\n }\n\n get centerPoint() {\n return this.size._div(2);\n }\n\n get size() {\n return new Point(this.width, this.height);\n }\n\n get bearing() {\n return -this.angle / Math.PI * 180;\n }\n set bearing(bearing) {\n const b = -util.wrap(bearing, -180, 180) * Math.PI / 180;\n if (this.angle === b) return;\n this._unmodified = false;\n this.angle = b;\n this._calcMatrices();\n\n // 2x2 matrix for rotating points\n this.rotationMatrix = mat2.create();\n mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle);\n }\n\n get pitch() {\n return this._pitch / Math.PI * 180;\n }\n set pitch(pitch) {\n const p = util.clamp(pitch, 0, 60) / 180 * Math.PI;\n if (this._pitch === p) return;\n this._unmodified = false;\n this._pitch = p;\n this._calcMatrices();\n }\n\n get fov() {\n return this._fov / Math.PI * 180;\n }\n set fov(fov) {\n fov = Math.max(0.01, Math.min(60, fov));\n if (this._fov === fov) return;\n this._unmodified = false;\n this._fov = fov / 180 * Math.PI;\n this._calcMatrices();\n }\n\n get zoom() { return this._zoom; }\n set zoom(zoom) {\n const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n if (this._zoom === z) return;\n this._unmodified = false;\n this._zoom = z;\n this.scale = this.zoomScale(z);\n this.tileZoom = Math.floor(z);\n this.zoomFraction = z - this.tileZoom;\n this._constrain();\n this._calcMatrices();\n }\n\n get center() { return this._center; }\n set center(center) {\n if (center.lat === this._center.lat && center.lng === this._center.lng) return;\n this._unmodified = false;\n this._center = center;\n this._constrain();\n this._calcMatrices();\n }\n\n /**\n * Return a zoom level that will cover all tiles the transform\n * @param {Object} options\n * @param {number} options.tileSize\n * @param {boolean} options.roundZoom\n * @returns {number} zoom level\n */\n coveringZoomLevel(options) {\n return (options.roundZoom ? Math.round : Math.floor)(\n this.zoom + this.scaleZoom(this.tileSize / options.tileSize)\n );\n }\n\n /**\n * Return all coordinates that could cover this transform for a covering\n * zoom level.\n * @param {Object} options\n * @param {number} options.tileSize\n * @param {number} options.minzoom\n * @param {number} options.maxzoom\n * @param {boolean} options.roundZoom\n * @param {boolean} options.reparseOverscaled\n * @param {boolean} options.renderWorldCopies\n * @returns {Array} tiles\n */\n coveringTiles(options) {\n let z = this.coveringZoomLevel(options);\n const actualZ = z;\n\n if (z < options.minzoom) return [];\n if (z > options.maxzoom) z = options.maxzoom;\n\n const centerCoord = this.pointCoordinate(this.centerPoint, z);\n const centerPoint = new Point(centerCoord.column - 0.5, centerCoord.row - 0.5);\n const cornerCoords = [\n this.pointCoordinate(new Point(0, 0), z),\n this.pointCoordinate(new Point(this.width, 0), z),\n this.pointCoordinate(new Point(this.width, this.height), z),\n this.pointCoordinate(new Point(0, this.height), z)\n ];\n return TileCoord.cover(z, cornerCoords, options.reparseOverscaled ? actualZ : z, this._renderWorldCopies)\n .sort((a, b) => centerPoint.dist(a) - centerPoint.dist(b));\n }\n\n resize(width, height) {\n this.width = width;\n this.height = height;\n\n this.pixelsToGLUnits = [2 / width, -2 / height];\n this._constrain();\n this._calcMatrices();\n }\n\n get unmodified() { return this._unmodified; }\n\n zoomScale(zoom) { return Math.pow(2, zoom); }\n scaleZoom(scale) { return Math.log(scale) / Math.LN2; }\n\n project(lnglat) {\n return new Point(\n this.lngX(lnglat.lng),\n this.latY(lnglat.lat));\n }\n\n unproject(point) {\n return new LngLat(\n this.xLng(point.x),\n this.yLat(point.y));\n }\n\n get x() { return this.lngX(this.center.lng); }\n get y() { return this.latY(this.center.lat); }\n\n get point() { return new Point(this.x, this.y); }\n\n /**\n * latitude to absolute x coord\n * @param {number} lon\n * @returns {number} pixel coordinate\n */\n lngX(lng) {\n return (180 + lng) * this.worldSize / 360;\n }\n /**\n * latitude to absolute y coord\n * @param {number} lat\n * @returns {number} pixel coordinate\n */\n latY(lat) {\n const y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360));\n return (180 - y) * this.worldSize / 360;\n }\n\n xLng(x) {\n return x * 360 / this.worldSize - 180;\n }\n yLat(y) {\n const y2 = 180 - y * 360 / this.worldSize;\n return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n }\n\n setLocationAtPoint(lnglat, point) {\n const translate = this.pointCoordinate(point)._sub(this.pointCoordinate(this.centerPoint));\n this.center = this.coordinateLocation(this.locationCoordinate(lnglat)._sub(translate));\n }\n\n /**\n * Given a location, return the screen point that corresponds to it\n * @param {LngLat} lnglat location\n * @returns {Point} screen point\n */\n locationPoint(lnglat) {\n return this.coordinatePoint(this.locationCoordinate(lnglat));\n }\n\n /**\n * Given a point on screen, return its lnglat\n * @param {Point} p screen point\n * @returns {LngLat} lnglat location\n */\n pointLocation(p) {\n return this.coordinateLocation(this.pointCoordinate(p));\n }\n\n /**\n * Given a geographical lnglat, return an unrounded\n * coordinate that represents it at this transform's zoom level.\n * @param {LngLat} lnglat\n * @returns {Coordinate}\n */\n locationCoordinate(lnglat) {\n return new Coordinate(\n this.lngX(lnglat.lng) / this.tileSize,\n this.latY(lnglat.lat) / this.tileSize,\n this.zoom).zoomTo(this.tileZoom);\n }\n\n /**\n * Given a Coordinate, return its geographical position.\n * @param {Coordinate} coord\n * @returns {LngLat} lnglat\n */\n coordinateLocation(coord) {\n const zoomedCoord = coord.zoomTo(this.zoom);\n return new LngLat(\n this.xLng(zoomedCoord.column * this.tileSize),\n this.yLat(zoomedCoord.row * this.tileSize));\n }\n\n pointCoordinate(p, zoom) {\n if (zoom === undefined) zoom = this.tileZoom;\n\n const targetZ = 0;\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that\n // line with z=0\n\n const coord0 = [p.x, p.y, 0, 1];\n const coord1 = [p.x, p.y, 1, 1];\n\n vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse);\n vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse);\n\n const w0 = coord0[3];\n const w1 = coord1[3];\n const x0 = coord0[0] / w0;\n const x1 = coord1[0] / w1;\n const y0 = coord0[1] / w0;\n const y1 = coord1[1] / w1;\n const z0 = coord0[2] / w0;\n const z1 = coord1[2] / w1;\n\n const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n\n return new Coordinate(\n interp(x0, x1, t) / this.tileSize,\n interp(y0, y1, t) / this.tileSize,\n this.zoom)._zoomTo(zoom);\n }\n\n /**\n * Given a coordinate, return the screen point that corresponds to it\n * @param {Coordinate} coord\n * @returns {Point} screen point\n */\n coordinatePoint(coord) {\n const zoomedCoord = coord.zoomTo(this.zoom);\n const p = [zoomedCoord.column * this.tileSize, zoomedCoord.row * this.tileSize, 0, 1];\n vec4.transformMat4(p, p, this.pixelMatrix);\n return new Point(p[0] / p[3], p[1] / p[3]);\n }\n\n /**\n * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map.\n * @param {TileCoord} tileCoord\n * @param {number} maxZoom maximum source zoom to account for overscaling\n */\n calculatePosMatrix(tileCoord, maxZoom) {\n // if z > maxzoom then the tile is actually a overscaled maxzoom tile,\n // so calculate the matrix the maxzoom tile would use.\n const coord = tileCoord.toCoordinate(maxZoom);\n const scale = this.worldSize / this.zoomScale(coord.zoom);\n\n const posMatrix = mat4.identity(new Float64Array(16));\n mat4.translate(posMatrix, posMatrix, [coord.column * scale, coord.row * scale, 0]);\n mat4.scale(posMatrix, posMatrix, [scale / EXTENT, scale / EXTENT, 1]);\n mat4.multiply(posMatrix, this.projMatrix, posMatrix);\n\n return new Float32Array(posMatrix);\n }\n\n _constrain() {\n if (!this.center || !this.width || !this.height || this._constraining) return;\n\n this._constraining = true;\n\n let minY, maxY, minX, maxX, sy, sx, x2, y2;\n const size = this.size,\n unmodified = this._unmodified;\n\n if (this.latRange) {\n minY = this.latY(this.latRange[1]);\n maxY = this.latY(this.latRange[0]);\n sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;\n }\n\n if (this.lngRange) {\n minX = this.lngX(this.lngRange[0]);\n maxX = this.lngX(this.lngRange[1]);\n sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;\n }\n\n // how much the map should scale to fit the screen into given latitude/longitude ranges\n const s = Math.max(sx || 0, sy || 0);\n\n if (s) {\n this.center = this.unproject(new Point(\n sx ? (maxX + minX) / 2 : this.x,\n sy ? (maxY + minY) / 2 : this.y));\n this.zoom += this.scaleZoom(s);\n this._unmodified = unmodified;\n this._constraining = false;\n return;\n }\n\n if (this.latRange) {\n const y = this.y,\n h2 = size.y / 2;\n\n if (y - h2 < minY) y2 = minY + h2;\n if (y + h2 > maxY) y2 = maxY - h2;\n }\n\n if (this.lngRange) {\n const x = this.x,\n w2 = size.x / 2;\n\n if (x - w2 < minX) x2 = minX + w2;\n if (x + w2 > maxX) x2 = maxX - w2;\n }\n\n // pan the map if the screen goes off the range\n if (x2 !== undefined || y2 !== undefined) {\n this.center = this.unproject(new Point(\n x2 !== undefined ? x2 : this.x,\n y2 !== undefined ? y2 : this.y));\n }\n\n this._unmodified = unmodified;\n this._constraining = false;\n }\n\n _calcMatrices() {\n if (!this.height) return;\n\n this.cameraToCenterDistance = 0.5 / Math.tan(this._fov / 2) * this.height;\n\n // Find the distance from the center point [width/2, height/2] to the\n // center top point [width/2, 0] in Z units, using the law of sines.\n // 1 Z unit is equivalent to 1 horizontal px at the center of the map\n // (the distance between[width/2, height/2] and [width/2 + 1, height/2])\n const halfFov = this._fov / 2;\n const groundAngle = Math.PI / 2 + this._pitch;\n const topHalfSurfaceDistance = Math.sin(halfFov) * this.cameraToCenterDistance / Math.sin(Math.PI - groundAngle - halfFov);\n\n // Calculate z distance of the farthest fragment that should be rendered.\n const furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance;\n // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance`\n const farZ = furthestDistance * 1.01;\n\n // matrix for conversion from location to GL coordinates (-1 .. 1)\n let m = new Float64Array(16);\n mat4.perspective(m, this._fov, this.width / this.height, 1, farZ);\n\n mat4.scale(m, m, [1, -1, 1]);\n mat4.translate(m, m, [0, 0, -this.cameraToCenterDistance]);\n mat4.rotateX(m, m, this._pitch);\n mat4.rotateZ(m, m, this.angle);\n mat4.translate(m, m, [-this.x, -this.y, 0]);\n\n // scale vertically to meters per pixel (inverse of ground resolution):\n // worldSize / (circumferenceOfEarth * cos(lat * π / 180))\n const verticalScale = this.worldSize / (2 * Math.PI * 6378137 * Math.abs(Math.cos(this.center.lat * (Math.PI / 180))));\n mat4.scale(m, m, [1, 1, verticalScale, 1]);\n\n this.projMatrix = m;\n\n // matrix for conversion from location to screen coordinates\n m = mat4.create();\n mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n mat4.translate(m, m, [1, -1, 0]);\n this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix);\n\n // inverse matrix for conversion from screen coordinaes to location\n m = mat4.invert(new Float64Array(16), this.pixelMatrix);\n if (!m) throw new Error(\"failed to invert matrix\");\n this.pixelMatrixInverse = m;\n\n }\n}\n\nmodule.exports = Transform;\n","'use strict';\n\nconst browser = require('./util/browser');\n\n// jshint -W079\nconst mapboxgl = module.exports = {};\n\nmapboxgl.version = require('../package.json').version;\nmapboxgl.workerCount = Math.max(Math.floor(browser.hardwareConcurrency / 2), 1);\n\nmapboxgl.Map = require('./ui/map');\nmapboxgl.NavigationControl = require('./ui/control/navigation_control');\nmapboxgl.GeolocateControl = require('./ui/control/geolocate_control');\nmapboxgl.AttributionControl = require('./ui/control/attribution_control');\nmapboxgl.ScaleControl = require('./ui/control/scale_control');\nmapboxgl.FullscreenControl = require('./ui/control/fullscreen_control');\nmapboxgl.Popup = require('./ui/popup');\nmapboxgl.Marker = require('./ui/marker');\n\nmapboxgl.Style = require('./style/style');\n\nmapboxgl.LngLat = require('./geo/lng_lat');\nmapboxgl.LngLatBounds = require('./geo/lng_lat_bounds');\nmapboxgl.Point = require('point-geometry');\n\nmapboxgl.Evented = require('./util/evented');\nmapboxgl.supported = require('./util/browser').supported;\n\nconst config = require('./util/config');\nmapboxgl.config = config;\n\nconst rtlTextPlugin = require('./source/rtl_text_plugin');\n\nmapboxgl.setRTLTextPlugin = rtlTextPlugin.setRTLTextPlugin;\n\n /**\n * Sets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text).\n * Necessary for supporting languages like Arabic and Hebrew that are written right-to-left.\n *\n * @function setRTLTextPlugin\n * @param {string} pluginURL URL pointing to the Mapbox RTL text plugin source.\n * @param {Function} callback Called with an error argument if there is an error.\n * @example\n * mapboxgl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.1.0/mapbox-gl-rtl-text.js');\n * @see [Add support for right-to-left scripts](https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-rtl-text/)\n */\n\nObject.defineProperty(mapboxgl, 'accessToken', {\n get: function() { return config.ACCESS_TOKEN; },\n set: function(token) { config.ACCESS_TOKEN = token; }\n});\n\n/**\n * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/).\n *\n * @var {string} accessToken\n * @example\n * mapboxgl.accessToken = myAccessToken;\n * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/)\n */\n\n/**\n * The version of Mapbox GL JS in use as specified in `package.json`,\n * `CHANGELOG.md`, and the GitHub release.\n *\n * @var {string} version\n */\n\n/**\n * Returns a Boolean indicating whether the browser [supports Mapbox GL JS](https://www.mapbox.com/help/mapbox-browser-support/#mapbox-gl-js).\n *\n * @function supported\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`,\n * the function will return `false` if the performance of Mapbox GL JS would\n * be dramatically worse than expected (i.e. a software renderer would be used).\n * @return {boolean}\n * @example\n * mapboxgl.supported() // = true\n * @see [Check for browser support](https://www.mapbox.com/mapbox-gl-js/example/check-for-support/)\n */\n","'use strict';\n\nconst pattern = require('./pattern');\n\nmodule.exports = drawBackground;\n\nfunction drawBackground(painter, sourceCache, layer) {\n const gl = painter.gl;\n const transform = painter.transform;\n const tileSize = transform.tileSize;\n const color = layer.paint['background-color'];\n const image = layer.paint['background-pattern'];\n const opacity = layer.paint['background-opacity'];\n\n const isOpaque = !image && color[3] === 1 && opacity === 1;\n if (painter.isOpaquePass !== isOpaque) return;\n\n gl.disable(gl.STENCIL_TEST);\n\n painter.setDepthSublayer(0);\n\n let program;\n if (image) {\n program = painter.useProgram('fillPattern', painter.basicFillProgramConfiguration);\n pattern.prepare(image, painter, program);\n painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer);\n } else {\n program = painter.useProgram('fill', painter.basicFillProgramConfiguration);\n gl.uniform4fv(program.u_color, color);\n painter.tileExtentVAO.bind(gl, program, painter.tileExtentBuffer);\n }\n\n gl.uniform1f(program.u_opacity, opacity);\n\n const coords = transform.coveringTiles({tileSize});\n\n for (const coord of coords) {\n if (image) {\n pattern.setTile({coord, tileSize}, painter, program);\n }\n gl.uniformMatrix4fv(program.u_matrix, false, painter.transform.calculatePosMatrix(coord));\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length);\n }\n}\n","'use strict';\n\nconst browser = require('../util/browser');\n\nmodule.exports = drawCircles;\n\nfunction drawCircles(painter, sourceCache, layer, coords) {\n if (painter.isOpaquePass) return;\n\n const gl = painter.gl;\n\n painter.setDepthSublayer(0);\n painter.depthMask(false);\n\n // Allow circles to be drawn across boundaries, so that\n // large circles are not clipped to tiles\n gl.disable(gl.STENCIL_TEST);\n\n for (let i = 0; i < coords.length; i++) {\n const coord = coords[i];\n\n const tile = sourceCache.getTile(coord);\n const bucket = tile.getBucket(layer);\n if (!bucket) continue;\n\n const buffers = bucket.buffers;\n const layerData = buffers.layerData[layer.id];\n const programConfiguration = layerData.programConfiguration;\n const program = painter.useProgram('circle', programConfiguration);\n programConfiguration.setUniforms(gl, program, layer, {zoom: painter.transform.zoom});\n\n if (layer.paint['circle-pitch-scale'] === 'map') {\n gl.uniform1i(program.u_scale_with_map, true);\n gl.uniform2f(program.u_extrude_scale,\n painter.transform.pixelsToGLUnits[0] * painter.transform.cameraToCenterDistance,\n painter.transform.pixelsToGLUnits[1] * painter.transform.cameraToCenterDistance);\n } else {\n gl.uniform1i(program.u_scale_with_map, false);\n gl.uniform2fv(program.u_extrude_scale, painter.transform.pixelsToGLUnits);\n }\n\n gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio);\n\n gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n coord.posMatrix,\n tile,\n layer.paint['circle-translate'],\n layer.paint['circle-translate-anchor']\n ));\n\n for (const segment of buffers.segments) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset);\n gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2);\n }\n }\n}\n","'use strict';\n\nmodule.exports = drawCollisionDebug;\n\nfunction drawCollisionDebug(painter, sourceCache, layer, coords) {\n const gl = painter.gl;\n gl.enable(gl.STENCIL_TEST);\n const program = painter.useProgram('collisionBox');\n\n for (let i = 0; i < coords.length; i++) {\n const coord = coords[i];\n const tile = sourceCache.getTile(coord);\n const bucket = tile.getBucket(layer);\n if (!bucket) continue;\n const buffers = bucket.buffers.collisionBox;\n if (!buffers) continue;\n\n gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n painter.enableTileClippingMask(coord);\n\n painter.lineWidth(1);\n gl.uniform1f(program.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z));\n gl.uniform1f(program.u_zoom, painter.transform.zoom * 10);\n gl.uniform1f(program.u_maxzoom, (tile.coord.z + 1) * 10);\n\n for (const segment of buffers.segments) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, null, segment.vertexOffset);\n gl.drawElements(gl.LINES, segment.primitiveLength * 2, gl.UNSIGNED_SHORT, segment.primitiveOffset * 2 * 2);\n }\n }\n}\n","'use strict';\n\nconst browser = require('../util/browser');\nconst mat4 = require('@mapbox/gl-matrix').mat4;\nconst EXTENT = require('../data/extent');\nconst Buffer = require('../data/buffer');\nconst VertexArrayObject = require('./vertex_array_object');\nconst PosArray = require('../data/pos_array');\n\nmodule.exports = drawDebug;\n\nfunction drawDebug(painter, sourceCache, coords) {\n for (let i = 0; i < coords.length; i++) {\n drawDebugTile(painter, sourceCache, coords[i]);\n }\n}\n\nfunction drawDebugTile(painter, sourceCache, coord) {\n const gl = painter.gl;\n\n gl.disable(gl.STENCIL_TEST);\n painter.lineWidth(1 * browser.devicePixelRatio);\n\n const posMatrix = coord.posMatrix;\n const program = painter.useProgram('debug');\n\n gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n gl.uniform4f(program.u_color, 1, 0, 0, 1);\n painter.debugVAO.bind(gl, program, painter.debugBuffer);\n gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length);\n\n const vertices = createTextVerticies(coord.toString(), 50, 200, 5);\n const debugTextArray = new PosArray();\n for (let v = 0; v < vertices.length; v += 2) {\n debugTextArray.emplaceBack(vertices[v], vertices[v + 1]);\n }\n const debugTextBuffer = Buffer.fromStructArray(debugTextArray, Buffer.BufferType.VERTEX);\n const debugTextVAO = new VertexArrayObject();\n debugTextVAO.bind(gl, program, debugTextBuffer);\n gl.uniform4f(program.u_color, 1, 1, 1, 1);\n\n // Draw the halo with multiple 1px lines instead of one wider line because\n // the gl spec doesn't guarantee support for lines with width > 1.\n const tileSize = sourceCache.getTile(coord).tileSize;\n const onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.z) * tileSize);\n const translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]];\n for (let i = 0; i < translations.length; i++) {\n const translation = translations[i];\n gl.uniformMatrix4fv(program.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0]));\n gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n }\n\n gl.uniform4f(program.u_color, 0, 0, 0, 1);\n gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n gl.drawArrays(gl.LINES, 0, debugTextBuffer.length);\n}\n\n// Font data From Hershey Simplex Font\n// http://paulbourke.net/dataformats/hershey/\nconst simplexFont = {\n \" \": [16, []],\n \"!\": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n \"\\\"\": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]],\n \"#\": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]],\n \"$\": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n \"%\": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]],\n \"&\": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]],\n \"'\": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]],\n \"(\": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]],\n \")\": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]],\n \"*\": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]],\n \"+\": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]],\n \",\": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n \"-\": [26, [4, 9, 22, 9]],\n \".\": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n \"/\": [22, [20, 25, 2, -7]],\n \"0\": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]],\n \"1\": [20, [6, 17, 8, 18, 11, 21, 11, 0]],\n \"2\": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]],\n \"3\": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n \"4\": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]],\n \"5\": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n \"6\": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]],\n \"7\": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]],\n \"8\": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]],\n \"9\": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]],\n \":\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n \";\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n \"<\": [24, [20, 18, 4, 9, 20, 0]],\n \"=\": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]],\n \">\": [24, [4, 18, 20, 9, 4, 0]],\n \"?\": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]],\n \"@\": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]],\n \"A\": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]],\n \"B\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]],\n \"C\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]],\n \"D\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]],\n \"E\": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]],\n \"F\": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]],\n \"G\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]],\n \"H\": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]],\n \"I\": [8, [4, 21, 4, 0]],\n \"J\": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]],\n \"K\": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]],\n \"L\": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]],\n \"M\": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]],\n \"N\": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]],\n \"O\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]],\n \"P\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]],\n \"Q\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]],\n \"R\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]],\n \"S\": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n \"T\": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]],\n \"U\": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]],\n \"V\": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]],\n \"W\": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]],\n \"X\": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]],\n \"Y\": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]],\n \"Z\": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]],\n \"[\": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]],\n \"\\\\\": [14, [0, 21, 14, -3]],\n \"]\": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]],\n \"^\": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]],\n \"_\": [16, [0, -2, 16, -2]],\n \"`\": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]],\n \"a\": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"b\": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n \"c\": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"d\": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"e\": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"f\": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]],\n \"g\": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"h\": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n \"i\": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]],\n \"j\": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]],\n \"k\": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]],\n \"l\": [8, [4, 21, 4, 0]],\n \"m\": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]],\n \"n\": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n \"o\": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]],\n \"p\": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n \"q\": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"r\": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]],\n \"s\": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]],\n \"t\": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]],\n \"u\": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]],\n \"v\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]],\n \"w\": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]],\n \"x\": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]],\n \"y\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]],\n \"z\": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]],\n \"{\": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]],\n \"|\": [8, [4, 25, 4, -7]],\n \"}\": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]],\n \"~\": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]]\n};\n\nfunction createTextVerticies(text, left, baseline, scale) {\n scale = scale || 1;\n\n const strokes = [];\n let i, len, j, len2, glyph, x, y, prev;\n\n for (i = 0, len = text.length; i < len; i++) {\n glyph = simplexFont[text[i]];\n if (!glyph) continue;\n prev = null;\n\n for (j = 0, len2 = glyph[1].length; j < len2; j += 2) {\n if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) {\n prev = null;\n\n } else {\n x = left + glyph[1][j] * scale;\n y = baseline - glyph[1][j + 1] * scale;\n if (prev) {\n strokes.push(prev.x, prev.y, x, y);\n }\n prev = {x: x, y: y};\n }\n }\n left += glyph[0] * scale;\n }\n\n return strokes;\n}\n","'use strict';\n\nconst pattern = require('./pattern');\n\nmodule.exports = drawFill;\n\nfunction drawFill(painter, sourceCache, layer, coords) {\n const gl = painter.gl;\n gl.enable(gl.STENCIL_TEST);\n\n const isOpaque =\n !layer.paint['fill-pattern'] &&\n layer.isPaintValueFeatureConstant('fill-color') &&\n layer.isPaintValueFeatureConstant('fill-opacity') &&\n layer.paint['fill-color'][3] === 1 &&\n layer.paint['fill-opacity'] === 1;\n\n // Draw fill\n if (painter.isOpaquePass === isOpaque) {\n // Once we switch to earcut drawing we can pull most of the WebGL setup\n // outside of this coords loop.\n painter.setDepthSublayer(1);\n drawFillTiles(painter, sourceCache, layer, coords, drawFillTile);\n }\n\n // Draw stroke\n if (!painter.isOpaquePass && layer.paint['fill-antialias']) {\n painter.lineWidth(2);\n painter.depthMask(false);\n\n // If we defined a different color for the fill outline, we are\n // going to ignore the bits in 0x07 and just care about the global\n // clipping mask.\n // Otherwise, we only want to drawFill the antialiased parts that are\n // *outside* the current shape. This is important in case the fill\n // or stroke color is translucent. If we wouldn't clip to outside\n // the current shape, some pixels from the outline stroke overlapped\n // the (non-antialiased) fill.\n painter.setDepthSublayer(layer.getPaintProperty('fill-outline-color') ? 2 : 0);\n drawFillTiles(painter, sourceCache, layer, coords, drawStrokeTile);\n }\n}\n\nfunction drawFillTiles(painter, sourceCache, layer, coords, drawFn) {\n let firstTile = true;\n for (const coord of coords) {\n const tile = sourceCache.getTile(coord);\n const bucket = tile.getBucket(layer);\n if (!bucket) continue;\n\n painter.enableTileClippingMask(coord);\n drawFn(painter, sourceCache, layer, tile, coord, bucket.buffers, firstTile);\n firstTile = false;\n }\n}\n\nfunction drawFillTile(painter, sourceCache, layer, tile, coord, buffers, firstTile) {\n const gl = painter.gl;\n const layerData = buffers.layerData[layer.id];\n\n const program = setFillProgram('fill', layer.paint['fill-pattern'], painter, layerData, layer, tile, coord, firstTile);\n\n for (const segment of buffers.segments) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset);\n gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2);\n }\n}\n\nfunction drawStrokeTile(painter, sourceCache, layer, tile, coord, buffers, firstTile) {\n const gl = painter.gl;\n const layerData = buffers.layerData[layer.id];\n const usePattern = layer.paint['fill-pattern'] && !layer.getPaintProperty('fill-outline-color');\n\n const program = setFillProgram('fillOutline', usePattern, painter, layerData, layer, tile, coord, firstTile);\n gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n for (const segment of buffers.segments2) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer2, layerData.paintVertexBuffer, segment.vertexOffset);\n gl.drawElements(gl.LINES, segment.primitiveLength * 2, gl.UNSIGNED_SHORT, segment.primitiveOffset * 2 * 2);\n }\n}\n\nfunction setFillProgram(programId, usePattern, painter, layerData, layer, tile, coord, firstTile) {\n let program;\n const prevProgram = painter.currentProgram;\n if (!usePattern) {\n program = painter.useProgram(programId, layerData.programConfiguration);\n if (firstTile || program !== prevProgram) {\n layerData.programConfiguration.setUniforms(painter.gl, program, layer, {zoom: painter.transform.zoom});\n }\n } else {\n program = painter.useProgram(`${programId}Pattern`, layerData.programConfiguration);\n if (firstTile || program !== prevProgram) {\n layerData.programConfiguration.setUniforms(painter.gl, program, layer, {zoom: painter.transform.zoom});\n pattern.prepare(layer.paint['fill-pattern'], painter, program);\n }\n pattern.setTile(tile, painter, program);\n }\n painter.gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n coord.posMatrix, tile,\n layer.paint['fill-translate'],\n layer.paint['fill-translate-anchor']\n ));\n return program;\n}\n","'use strict';\n\nconst glMatrix = require('@mapbox/gl-matrix');\nconst Buffer = require('../data/buffer');\nconst VertexArrayObject = require('./vertex_array_object');\nconst PosArray = require('../data/pos_array');\nconst pattern = require('./pattern');\nconst mat3 = glMatrix.mat3;\nconst mat4 = glMatrix.mat4;\nconst vec3 = glMatrix.vec3;\n\nmodule.exports = draw;\n\nfunction draw(painter, source, layer, coords) {\n if (layer.paint['fill-extrusion-opacity'] === 0) return;\n const gl = painter.gl;\n gl.disable(gl.STENCIL_TEST);\n gl.enable(gl.DEPTH_TEST);\n painter.depthMask(true);\n\n // Create a new texture to which to render the extrusion layer. This approach\n // allows us to adjust opacity on a per-layer basis (eliminating the interior\n // walls per-feature opacity problem)\n const texture = new ExtrusionTexture(gl, painter, layer);\n texture.bindFramebuffer();\n\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n\n for (let i = 0; i < coords.length; i++) {\n drawExtrusion(painter, source, layer, coords[i]);\n }\n\n // Unbind the framebuffer as a render target and render it to the map\n texture.unbindFramebuffer();\n texture.renderToMap();\n}\n\nfunction ExtrusionTexture(gl, painter, layer) {\n this.gl = gl;\n this.width = painter.width;\n this.height = painter.height;\n this.painter = painter;\n this.layer = layer;\n\n this.texture = null;\n this.fbo = null;\n this.fbos = this.painter.preFbos[this.width] && this.painter.preFbos[this.width][this.height];\n}\n\nExtrusionTexture.prototype.bindFramebuffer = function() {\n const gl = this.gl;\n\n this.texture = this.painter.getViewportTexture(this.width, this.height);\n\n gl.activeTexture(gl.TEXTURE1);\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n this.texture.width = this.width;\n this.texture.height = this.height;\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n }\n\n if (!this.fbos) {\n this.fbo = gl.createFramebuffer();\n const stencil = gl.createRenderbuffer();\n const depthRenderBuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, stencil);\n gl.bindRenderbuffer(gl.RENDERBUFFER, depthRenderBuffer);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, this.width, this.height);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, this.width, this.height);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, stencil);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRenderBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);\n } else {\n this.fbo = this.fbos.pop();\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0);\n }\n};\n\nExtrusionTexture.prototype.unbindFramebuffer = function() {\n this.painter.bindDefaultFramebuffer();\n if (this.fbos) {\n this.fbos.push(this.fbo);\n } else {\n if (!this.painter.preFbos[this.width]) this.painter.preFbos[this.width] = {};\n this.painter.preFbos[this.width][this.height] = [this.fbo];\n }\n this.painter.saveViewportTexture(this.texture);\n};\n\nExtrusionTexture.prototype.renderToMap = function() {\n const gl = this.gl;\n const painter = this.painter;\n const program = painter.useProgram('extrusionTexture');\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n gl.uniform1f(program.u_opacity, this.layer.paint['fill-extrusion-opacity']);\n gl.uniform1i(program.u_texture, 1);\n\n gl.uniformMatrix4fv(program.u_matrix, false, mat4.ortho(\n mat4.create(),\n 0,\n painter.width,\n painter.height,\n 0,\n 0,\n 1)\n );\n\n gl.disable(gl.DEPTH_TEST);\n\n gl.uniform1i(program.u_xdim, painter.width);\n gl.uniform1i(program.u_ydim, painter.height);\n\n const array = new PosArray();\n array.emplaceBack(0, 0);\n array.emplaceBack(painter.width, 0);\n array.emplaceBack(0, painter.height);\n array.emplaceBack(painter.width, painter.height);\n const buffer = Buffer.fromStructArray(array, Buffer.BufferType.VERTEX);\n\n const vao = new VertexArrayObject();\n vao.bind(gl, program, buffer);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n gl.enable(gl.DEPTH_TEST);\n};\n\nfunction drawExtrusion(painter, source, layer, coord) {\n if (painter.isOpaquePass) return;\n\n const tile = source.getTile(coord);\n const bucket = tile.getBucket(layer);\n if (!bucket) return;\n\n const buffers = bucket.buffers;\n const gl = painter.gl;\n\n const image = layer.paint['fill-extrusion-pattern'];\n\n const layerData = buffers.layerData[layer.id];\n const programConfiguration = layerData.programConfiguration;\n const program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration);\n programConfiguration.setUniforms(gl, program, layer, {zoom: painter.transform.zoom});\n\n if (image) {\n pattern.prepare(image, painter, program);\n pattern.setTile(tile, painter, program);\n gl.uniform1f(program.u_height_factor, -Math.pow(2, coord.z) / tile.tileSize / 8);\n }\n\n painter.gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix(\n coord.posMatrix,\n tile,\n layer.paint['fill-extrusion-translate'],\n layer.paint['fill-extrusion-translate-anchor']\n ));\n\n setLight(program, painter);\n\n for (const segment of buffers.segments) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset);\n gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2);\n }\n}\n\nfunction setLight(program, painter) {\n const gl = painter.gl;\n const light = painter.style.light;\n\n const _lp = light.calculated.position,\n lightPos = [_lp.x, _lp.y, _lp.z];\n const lightMat = mat3.create();\n if (light.calculated.anchor === 'viewport') mat3.fromRotation(lightMat, -painter.transform.angle);\n vec3.transformMat3(lightPos, lightPos, lightMat);\n\n gl.uniform3fv(program.u_lightpos, lightPos);\n gl.uniform1f(program.u_lightintensity, light.calculated.intensity);\n gl.uniform3fv(program.u_lightcolor, light.calculated.color.slice(0, 3));\n}\n","'use strict';\n\nconst browser = require('../util/browser');\nconst pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\n/**\n * Draw a line. Under the hood this will read elements from\n * a tile, dash textures from a lineAtlas, and style properties from a layer.\n * @param {Object} painter\n * @param {Object} layer\n * @param {Object} posMatrix\n * @param {Tile} tile\n * @returns {undefined} draws with the painter\n * @private\n */\nmodule.exports = function drawLine(painter, sourceCache, layer, coords) {\n if (painter.isOpaquePass) return;\n painter.setDepthSublayer(0);\n painter.depthMask(false);\n\n const gl = painter.gl;\n gl.enable(gl.STENCIL_TEST);\n\n // don't draw zero-width lines\n if (layer.paint['line-width'] <= 0) return;\n\n const programId =\n layer.paint['line-dasharray'] ? 'lineSDF' :\n layer.paint['line-pattern'] ? 'linePattern' : 'line';\n\n let prevTileZoom;\n let firstTile = true;\n\n for (const coord of coords) {\n const tile = sourceCache.getTile(coord);\n const bucket = tile.getBucket(layer);\n if (!bucket) continue;\n\n const layerData = bucket.buffers.layerData[layer.id];\n const prevProgram = painter.currentProgram;\n const program = painter.useProgram(programId, layerData.programConfiguration);\n const programChanged = firstTile || program !== prevProgram;\n const tileRatioChanged = prevTileZoom !== tile.coord.z;\n\n if (programChanged) {\n layerData.programConfiguration.setUniforms(painter.gl, program, layer, {zoom: painter.transform.zoom});\n }\n drawLineTile(program, painter, tile, bucket.buffers, layer, coord, layerData, programChanged, tileRatioChanged);\n prevTileZoom = tile.coord.z;\n firstTile = false;\n }\n};\n\nfunction drawLineTile(program, painter, tile, buffers, layer, coord, layerData, programChanged, tileRatioChanged) {\n const gl = painter.gl;\n const dasharray = layer.paint['line-dasharray'];\n const image = layer.paint['line-pattern'];\n\n let posA, posB, imagePosA, imagePosB;\n\n if (programChanged || tileRatioChanged) {\n const tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom);\n\n if (dasharray) {\n posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round');\n posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round');\n\n const widthA = posA.width * dasharray.fromScale;\n const widthB = posB.width * dasharray.toScale;\n\n gl.uniform2f(program.u_patternscale_a, tileRatio / widthA, -posA.height / 2);\n gl.uniform2f(program.u_patternscale_b, tileRatio / widthB, -posB.height / 2);\n gl.uniform1f(program.u_sdfgamma, painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2);\n\n } else if (image) {\n imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n if (!imagePosA || !imagePosB) return;\n\n gl.uniform2f(program.u_pattern_size_a, imagePosA.size[0] * image.fromScale / tileRatio, imagePosB.size[1]);\n gl.uniform2f(program.u_pattern_size_b, imagePosB.size[0] * image.toScale / tileRatio, imagePosB.size[1]);\n }\n\n gl.uniform2f(program.u_gl_units_to_pixels, 1 / painter.transform.pixelsToGLUnits[0], 1 / painter.transform.pixelsToGLUnits[1]);\n }\n\n if (programChanged) {\n\n if (dasharray) {\n gl.uniform1i(program.u_image, 0);\n gl.activeTexture(gl.TEXTURE0);\n painter.lineAtlas.bind(gl);\n\n gl.uniform1f(program.u_tex_y_a, posA.y);\n gl.uniform1f(program.u_tex_y_b, posB.y);\n gl.uniform1f(program.u_mix, dasharray.t);\n\n } else if (image) {\n gl.uniform1i(program.u_image, 0);\n gl.activeTexture(gl.TEXTURE0);\n painter.spriteAtlas.bind(gl, true);\n\n gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n gl.uniform1f(program.u_fade, image.t);\n }\n gl.uniform1f(program.u_width, layer.paint['line-width']);\n }\n\n painter.enableTileClippingMask(coord);\n\n const posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']);\n gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n gl.uniform1f(program.u_ratio, 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom));\n\n for (const segment of buffers.segments) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset);\n gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2);\n }\n}\n","'use strict';\n\nconst util = require('../util/util');\n\nmodule.exports = drawRaster;\n\nfunction drawRaster(painter, sourceCache, layer, coords) {\n if (painter.isOpaquePass) return;\n\n const gl = painter.gl;\n\n gl.enable(gl.DEPTH_TEST);\n painter.depthMask(true);\n\n // Change depth function to prevent double drawing in areas where tiles overlap.\n gl.depthFunc(gl.LESS);\n\n const minTileZ = coords.length && coords[0].z;\n\n for (let i = 0; i < coords.length; i++) {\n const coord = coords[i];\n // set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers\n painter.setDepthSublayer(coord.z - minTileZ);\n drawRasterTile(painter, sourceCache, layer, coord);\n }\n\n gl.depthFunc(gl.LEQUAL);\n}\n\nfunction drawRasterTile(painter, sourceCache, layer, coord) {\n\n const gl = painter.gl;\n\n gl.disable(gl.STENCIL_TEST);\n\n const tile = sourceCache.getTile(coord);\n const posMatrix = painter.transform.calculatePosMatrix(coord, sourceCache.getSource().maxzoom);\n\n tile.registerFadeDuration(painter.style.animationLoop, layer.paint['raster-fade-duration']);\n\n const program = painter.useProgram('raster');\n gl.uniformMatrix4fv(program.u_matrix, false, posMatrix);\n\n // color parameters\n gl.uniform1f(program.u_brightness_low, layer.paint['raster-brightness-min']);\n gl.uniform1f(program.u_brightness_high, layer.paint['raster-brightness-max']);\n gl.uniform1f(program.u_saturation_factor, saturationFactor(layer.paint['raster-saturation']));\n gl.uniform1f(program.u_contrast_factor, contrastFactor(layer.paint['raster-contrast']));\n gl.uniform3fv(program.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate']));\n\n const parentTile = tile.sourceCache && tile.sourceCache.findLoadedParent(coord, 0, {}),\n fade = getFadeValues(tile, parentTile, layer, painter.transform);\n\n let parentScaleBy, parentTL;\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n\n gl.activeTexture(gl.TEXTURE1);\n\n if (parentTile) {\n gl.bindTexture(gl.TEXTURE_2D, parentTile.texture);\n parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z);\n parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1];\n\n } else {\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n }\n\n // cross-fade parameters\n gl.uniform2fv(program.u_tl_parent, parentTL || [0, 0]);\n gl.uniform1f(program.u_scale_parent, parentScaleBy || 1);\n gl.uniform1f(program.u_buffer_scale, 1);\n gl.uniform1f(program.u_fade_t, fade.mix);\n gl.uniform1f(program.u_opacity, fade.opacity * layer.paint['raster-opacity']);\n gl.uniform1i(program.u_image0, 0);\n gl.uniform1i(program.u_image1, 1);\n\n const buffer = tile.boundsBuffer || painter.rasterBoundsBuffer;\n const vao = tile.boundsVAO || painter.rasterBoundsVAO;\n vao.bind(gl, program, buffer);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length);\n}\n\nfunction spinWeights(angle) {\n angle *= Math.PI / 180;\n const s = Math.sin(angle);\n const c = Math.cos(angle);\n return [\n (2 * c + 1) / 3,\n (-Math.sqrt(3) * s - c + 1) / 3,\n (Math.sqrt(3) * s - c + 1) / 3\n ];\n}\n\nfunction contrastFactor(contrast) {\n return contrast > 0 ?\n 1 / (1 - contrast) :\n 1 + contrast;\n}\n\nfunction saturationFactor(saturation) {\n return saturation > 0 ?\n 1 - 1 / (1.001 - saturation) :\n -saturation;\n}\n\nfunction getFadeValues(tile, parentTile, layer, transform) {\n const fadeDuration = layer.paint['raster-fade-duration'];\n\n if (tile.sourceCache && fadeDuration > 0) {\n const now = Date.now();\n const sinceTile = (now - tile.timeAdded) / fadeDuration;\n const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n const source = tile.sourceCache.getSource();\n const idealZ = transform.coveringZoomLevel({\n tileSize: source.tileSize,\n roundZoom: source.roundZoom\n });\n\n // if no parent or parent is older, fade in; if parent is younger, fade out\n const fadeIn = !parentTile || Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ);\n\n const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : util.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1);\n\n // we don't crossfade tiles that were just refreshed upon expiring:\n // once they're old enough to pass the crossfading threshold\n // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't\n // incorrectly fail to crossfade them when zooming\n if (tile.refreshedUponExpiration && sinceTile >= 1) tile.refreshedUponExpiration = false;\n\n if (parentTile) {\n return {\n opacity: 1,\n mix: 1 - childOpacity\n };\n } else {\n return {\n opacity: childOpacity,\n mix: 0\n };\n }\n } else {\n return {\n opacity: 1,\n mix: 0\n };\n }\n}\n","'use strict';\n\nconst browser = require('../util/browser');\nconst drawCollisionDebug = require('./draw_collision_debug');\nconst pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\nmodule.exports = drawSymbols;\n\nfunction drawSymbols(painter, sourceCache, layer, coords) {\n if (painter.isOpaquePass) return;\n\n const drawAcrossEdges =\n !layer.layout['text-allow-overlap'] &&\n !layer.layout['icon-allow-overlap'] &&\n !layer.layout['text-ignore-placement'] &&\n !layer.layout['icon-ignore-placement'];\n\n const gl = painter.gl;\n\n // Disable the stencil test so that labels aren't clipped to tile boundaries.\n //\n // Layers with features that may be drawn overlapping aren't clipped. These\n // layers are sorted in the y direction, and to draw the correct ordering near\n // tile edges the icons are included in both tiles and clipped when drawing.\n if (drawAcrossEdges) {\n gl.disable(gl.STENCIL_TEST);\n } else {\n gl.enable(gl.STENCIL_TEST);\n }\n\n painter.setDepthSublayer(0);\n painter.depthMask(false);\n\n drawLayerSymbols(painter, sourceCache, layer, coords, false,\n layer.paint['icon-translate'],\n layer.paint['icon-translate-anchor'],\n layer.layout['icon-rotation-alignment'],\n // icon-pitch-alignment is not yet implemented\n // and we simply inherit the rotation alignment\n layer.layout['icon-rotation-alignment'],\n layer.layout['icon-size']\n );\n\n drawLayerSymbols(painter, sourceCache, layer, coords, true,\n layer.paint['text-translate'],\n layer.paint['text-translate-anchor'],\n layer.layout['text-rotation-alignment'],\n layer.layout['text-pitch-alignment'],\n layer.layout['text-size']\n );\n\n if (sourceCache.map.showCollisionBoxes) {\n drawCollisionDebug(painter, sourceCache, layer, coords);\n }\n}\n\nfunction drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor,\n rotationAlignment, pitchAlignment, size) {\n\n if (!isText && painter.style.sprite && !painter.style.sprite.loaded())\n return;\n\n const gl = painter.gl;\n\n const rotateWithMap = rotationAlignment === 'map';\n const pitchWithMap = pitchAlignment === 'map';\n\n const depthOn = pitchWithMap;\n\n if (depthOn) {\n gl.enable(gl.DEPTH_TEST);\n } else {\n gl.disable(gl.DEPTH_TEST);\n }\n\n let program, prevFontstack;\n\n for (const coord of coords) {\n const tile = sourceCache.getTile(coord);\n const bucket = tile.getBucket(layer);\n if (!bucket) continue;\n const buffers = isText ? bucket.buffers.glyph : bucket.buffers.icon;\n if (!buffers || !buffers.segments.length) continue;\n const layerData = buffers.layerData[layer.id];\n const programConfiguration = layerData.programConfiguration;\n\n const isSDF = isText || bucket.sdfIcons;\n\n if (!program || bucket.fontstack !== prevFontstack) {\n program = painter.useProgram(isSDF ? 'symbolSDF' : 'symbolIcon', programConfiguration);\n programConfiguration.setUniforms(gl, program, layer, {zoom: painter.transform.zoom});\n\n setSymbolDrawState(program, painter, isText, isSDF, rotateWithMap, pitchWithMap, bucket.fontstack, size,\n bucket.iconsNeedLinear, isText ? bucket.adjustedTextSize : bucket.adjustedIconSize);\n }\n\n painter.enableTileClippingMask(coord);\n\n gl.uniformMatrix4fv(program.u_matrix, false,\n painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor));\n\n drawTileSymbols(program, painter, layer, tile, buffers, isText, isSDF,\n pitchWithMap, size);\n\n prevFontstack = bucket.fontstack;\n }\n\n if (!depthOn) gl.enable(gl.DEPTH_TEST);\n}\n\nfunction setSymbolDrawState(program, painter, isText, isSDF, rotateWithMap, pitchWithMap, fontstack, size,\n iconsNeedLinear, adjustedSize) {\n\n const gl = painter.gl;\n const tr = painter.transform;\n\n gl.uniform1i(program.u_rotate_with_map, rotateWithMap);\n gl.uniform1i(program.u_pitch_with_map, pitchWithMap);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.uniform1i(program.u_texture, 0);\n\n if (isText) {\n // use the fonstack used when parsing the tile, not the fontstack\n // at the current zoom level (layout['text-font']).\n const glyphAtlas = fontstack && painter.glyphSource.getGlyphAtlas(fontstack);\n if (!glyphAtlas) return;\n\n glyphAtlas.updateTexture(gl);\n gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4);\n } else {\n const mapMoving = painter.options.rotating || painter.options.zooming;\n const iconScaled = size !== 1 || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear;\n const iconTransformed = pitchWithMap || tr.pitch;\n painter.spriteAtlas.bind(gl, isSDF || mapMoving || iconScaled || iconTransformed);\n gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4);\n }\n\n gl.activeTexture(gl.TEXTURE1);\n painter.frameHistory.bind(gl);\n gl.uniform1i(program.u_fadetexture, 1);\n\n // adjust min/max zooms for variable font sizes\n const zoomAdjust = Math.log(size / adjustedSize) / Math.LN2 || 0;\n gl.uniform1f(program.u_zoom, (tr.zoom - zoomAdjust) * 10); // current zoom level\n\n gl.uniform1f(program.u_pitch, tr.pitch / 360 * 2 * Math.PI);\n gl.uniform1f(program.u_bearing, tr.bearing / 360 * 2 * Math.PI);\n gl.uniform1f(program.u_aspect_ratio, tr.width / tr.height);\n}\n\nfunction drawTileSymbols(program, painter, layer, tile, buffers, isText, isSDF,\n pitchWithMap, size) {\n\n const gl = painter.gl;\n const tr = painter.transform;\n\n const fontScale = size / (isText ? 24 : 1);\n\n if (pitchWithMap) {\n const s = pixelsToTileUnits(tile, fontScale, tr.zoom);\n gl.uniform2f(program.u_extrude_scale, s, s);\n } else {\n const s = tr.cameraToCenterDistance * fontScale;\n gl.uniform2f(program.u_extrude_scale, tr.pixelsToGLUnits[0] * s, tr.pixelsToGLUnits[1] * s);\n }\n\n if (isSDF) {\n const haloWidthProperty = `${isText ? 'text' : 'icon'}-halo-width`;\n const hasHalo = !layer.isPaintValueFeatureConstant(haloWidthProperty) || layer.paint[haloWidthProperty];\n const gammaScale = fontScale * (pitchWithMap ? Math.cos(tr._pitch) : 1) * tr.cameraToCenterDistance;\n gl.uniform1f(program.u_font_scale, fontScale);\n gl.uniform1f(program.u_gamma_scale, gammaScale);\n\n if (hasHalo) { // Draw halo underneath the text.\n gl.uniform1f(program.u_is_halo, 1);\n drawSymbolElements(buffers, layer, gl, program);\n }\n\n gl.uniform1f(program.u_is_halo, 0);\n }\n\n drawSymbolElements(buffers, layer, gl, program);\n}\n\nfunction drawSymbolElements(buffers, layer, gl, program) {\n const layerData = buffers.layerData[layer.id];\n const paintVertexBuffer = layerData && layerData.paintVertexBuffer;\n\n for (const segment of buffers.segments) {\n segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, paintVertexBuffer, segment.vertexOffset);\n gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2);\n }\n}\n","'use strict';\n\nclass FrameHistory {\n\n constructor() {\n this.changeTimes = new Float64Array(256);\n this.changeOpacities = new Uint8Array(256);\n this.opacities = new Uint8ClampedArray(256);\n this.array = new Uint8Array(this.opacities.buffer);\n\n this.previousZoom = 0;\n this.firstFrame = true;\n }\n\n record(now, zoom, duration) {\n if (this.firstFrame) {\n now = 0;\n this.firstFrame = false;\n }\n\n zoom = Math.floor(zoom * 10);\n\n let z;\n if (zoom < this.previousZoom) {\n for (z = zoom + 1; z <= this.previousZoom; z++) {\n this.changeTimes[z] = now;\n this.changeOpacities[z] = this.opacities[z];\n }\n } else {\n for (z = zoom; z > this.previousZoom; z--) {\n this.changeTimes[z] = now;\n this.changeOpacities[z] = this.opacities[z];\n }\n }\n\n for (z = 0; z < 256; z++) {\n const timeSince = now - this.changeTimes[z];\n const opacityChange = (duration ? timeSince / duration : 1) * 255;\n if (z <= zoom) {\n this.opacities[z] = this.changeOpacities[z] + opacityChange;\n } else {\n this.opacities[z] = this.changeOpacities[z] - opacityChange;\n }\n }\n\n this.changed = true;\n this.previousZoom = zoom;\n }\n\n bind(gl) {\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, 256, 1, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n if (this.changed) {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 1, gl.ALPHA, gl.UNSIGNED_BYTE, this.array);\n this.changed = false;\n }\n }\n }\n}\n\nmodule.exports = FrameHistory;\n","'use strict';\n\nconst util = require('../util/util');\n\n/**\n * A LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nclass LineAtlas {\n constructor(width, height) {\n this.width = width;\n this.height = height;\n this.nextRow = 0;\n\n this.bytes = 4;\n this.data = new Uint8Array(this.width * this.height * this.bytes);\n\n this.positions = {};\n }\n\n setSprite(sprite) {\n this.sprite = sprite;\n }\n\n /**\n * Get or create a dash line pattern.\n *\n * @param {Array} dasharray\n * @param {boolean} round whether to add circle caps in between dash segments\n * @returns {Object} position of dash texture in { y, height, width }\n * @private\n */\n getDash(dasharray, round) {\n const key = dasharray.join(\",\") + round;\n\n if (!this.positions[key]) {\n this.positions[key] = this.addDash(dasharray, round);\n }\n return this.positions[key];\n }\n\n addDash(dasharray, round) {\n\n const n = round ? 7 : 0;\n const height = 2 * n + 1;\n const offset = 128;\n\n if (this.nextRow + height > this.height) {\n util.warnOnce('LineAtlas out of space');\n return null;\n }\n\n let length = 0;\n for (let i = 0; i < dasharray.length; i++) {\n length += dasharray[i];\n }\n\n const stretch = this.width / length;\n const halfWidth = stretch / 2;\n\n // If dasharray has an odd length, both the first and last parts\n // are dashes and should be joined seamlessly.\n const oddLength = dasharray.length % 2 === 1;\n\n for (let y = -n; y <= n; y++) {\n const row = this.nextRow + n + y;\n const index = this.width * row;\n\n let left = oddLength ? -dasharray[dasharray.length - 1] : 0;\n let right = dasharray[0];\n let partIndex = 1;\n\n for (let x = 0; x < this.width; x++) {\n\n while (right < x / stretch) {\n left = right;\n right = right + dasharray[partIndex];\n\n if (oddLength && partIndex === dasharray.length - 1) {\n right += dasharray[0];\n }\n\n partIndex++;\n }\n\n const distLeft = Math.abs(x - left * stretch);\n const distRight = Math.abs(x - right * stretch);\n const dist = Math.min(distLeft, distRight);\n const inside = (partIndex % 2) === 1;\n let signedDistance;\n\n if (round) {\n // Add circle caps\n const distMiddle = n ? y / n * (halfWidth + 1) : 0;\n if (inside) {\n const distEdge = halfWidth - Math.abs(distMiddle);\n signedDistance = Math.sqrt(dist * dist + distEdge * distEdge);\n } else {\n signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle);\n }\n } else {\n signedDistance = (inside ? 1 : -1) * dist;\n }\n\n this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset));\n }\n }\n\n const pos = {\n y: (this.nextRow + n + 0.5) / this.height,\n height: 2 * n / this.height,\n width: length\n };\n\n this.nextRow += height;\n this.dirty = true;\n\n return pos;\n }\n\n bind(gl) {\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n if (this.dirty) {\n this.dirty = false;\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n }\n }\n }\n}\n\nmodule.exports = LineAtlas;\n","'use strict';\n\nconst browser = require('../util/browser');\nconst mat4 = require('@mapbox/gl-matrix').mat4;\nconst FrameHistory = require('./frame_history');\nconst SourceCache = require('../source/source_cache');\nconst EXTENT = require('../data/extent');\nconst pixelsToTileUnits = require('../source/pixels_to_tile_units');\nconst util = require('../util/util');\nconst Buffer = require('../data/buffer');\nconst VertexArrayObject = require('./vertex_array_object');\nconst RasterBoundsArray = require('../data/raster_bounds_array');\nconst PosArray = require('../data/pos_array');\nconst ProgramConfiguration = require('../data/program_configuration');\nconst shaders = require('./shaders');\nconst assert = require('assert');\n\nconst draw = {\n symbol: require('./draw_symbol'),\n circle: require('./draw_circle'),\n line: require('./draw_line'),\n fill: require('./draw_fill'),\n 'fill-extrusion': require('./draw_fill_extrusion'),\n raster: require('./draw_raster'),\n background: require('./draw_background'),\n debug: require('./draw_debug')\n};\n\n/**\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n * @private\n */\nclass Painter {\n constructor(gl, transform) {\n this.gl = gl;\n this.transform = transform;\n\n this.reusableTextures = {\n tiles: {},\n viewport: null\n };\n this.preFbos = {};\n\n this.frameHistory = new FrameHistory();\n\n this.setup();\n\n // Within each layer there are multiple distinct z-planes that can be drawn to.\n // This is implemented using the WebGL depth buffer.\n this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1;\n this.depthEpsilon = 1 / Math.pow(2, 16);\n\n this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n\n this.basicFillProgramConfiguration = ProgramConfiguration.createStatic(['color', 'opacity']);\n this.emptyProgramConfiguration = new ProgramConfiguration();\n }\n\n /*\n * Update the GL viewport, projection matrix, and transforms to compensate\n * for a new width and height value.\n */\n resize(width, height) {\n const gl = this.gl;\n\n this.width = width * browser.devicePixelRatio;\n this.height = height * browser.devicePixelRatio;\n gl.viewport(0, 0, this.width, this.height);\n }\n\n setup() {\n const gl = this.gl;\n\n gl.verbose = true;\n\n // We are blending the new pixels *behind* the existing pixels. That way we can\n // draw front-to-back and use then stencil buffer to cull opaque pixels early.\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n gl.enable(gl.STENCIL_TEST);\n\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n\n this._depthMask = false;\n gl.depthMask(false);\n\n const tileExtentArray = new PosArray();\n tileExtentArray.emplaceBack(0, 0);\n tileExtentArray.emplaceBack(EXTENT, 0);\n tileExtentArray.emplaceBack(0, EXTENT);\n tileExtentArray.emplaceBack(EXTENT, EXTENT);\n this.tileExtentBuffer = Buffer.fromStructArray(tileExtentArray, Buffer.BufferType.VERTEX);\n this.tileExtentVAO = new VertexArrayObject();\n this.tileExtentPatternVAO = new VertexArrayObject();\n\n const debugArray = new PosArray();\n debugArray.emplaceBack(0, 0);\n debugArray.emplaceBack(EXTENT, 0);\n debugArray.emplaceBack(EXTENT, EXTENT);\n debugArray.emplaceBack(0, EXTENT);\n debugArray.emplaceBack(0, 0);\n this.debugBuffer = Buffer.fromStructArray(debugArray, Buffer.BufferType.VERTEX);\n this.debugVAO = new VertexArrayObject();\n\n const rasterBoundsArray = new RasterBoundsArray();\n rasterBoundsArray.emplaceBack(0, 0, 0, 0);\n rasterBoundsArray.emplaceBack(EXTENT, 0, 32767, 0);\n rasterBoundsArray.emplaceBack(0, EXTENT, 0, 32767);\n rasterBoundsArray.emplaceBack(EXTENT, EXTENT, 32767, 32767);\n this.rasterBoundsBuffer = Buffer.fromStructArray(rasterBoundsArray, Buffer.BufferType.VERTEX);\n this.rasterBoundsVAO = new VertexArrayObject();\n }\n\n /*\n * Reset the color buffers of the drawing canvas.\n */\n clearColor() {\n const gl = this.gl;\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n /*\n * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n * new tiles at the same location, while retaining previously drawn pixels.\n */\n clearStencil() {\n const gl = this.gl;\n gl.clearStencil(0x0);\n gl.stencilMask(0xFF);\n gl.clear(gl.STENCIL_BUFFER_BIT);\n }\n\n clearDepth() {\n const gl = this.gl;\n gl.clearDepth(1);\n this.depthMask(true);\n gl.clear(gl.DEPTH_BUFFER_BIT);\n }\n\n _renderTileClippingMasks(coords) {\n const gl = this.gl;\n gl.colorMask(false, false, false, false);\n this.depthMask(false);\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.STENCIL_TEST);\n\n // Only write clipping IDs to the last 5 bits. The first three are used for drawing fills.\n gl.stencilMask(0xF8);\n // Tests will always pass, and ref value will be written to stencil buffer.\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n\n let idNext = 1;\n this._tileClippingMaskIDs = {};\n\n for (const coord of coords) {\n const id = this._tileClippingMaskIDs[coord.id] = (idNext++) << 3;\n\n gl.stencilFunc(gl.ALWAYS, id, 0xF8);\n\n const program = this.useProgram('fill', this.basicFillProgramConfiguration);\n gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix);\n\n // Draw the clipping mask\n this.tileExtentVAO.bind(gl, program, this.tileExtentBuffer);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.length);\n }\n\n gl.stencilMask(0x00);\n gl.colorMask(true, true, true, true);\n this.depthMask(true);\n gl.enable(gl.DEPTH_TEST);\n }\n\n enableTileClippingMask(coord) {\n const gl = this.gl;\n gl.stencilFunc(gl.EQUAL, this._tileClippingMaskIDs[coord.id], 0xF8);\n }\n\n // Overridden by headless tests.\n prepareBuffers() {}\n\n bindDefaultFramebuffer() {\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n render(style, options) {\n this.style = style;\n this.options = options;\n\n this.lineAtlas = style.lineAtlas;\n\n this.spriteAtlas = style.spriteAtlas;\n this.spriteAtlas.setSprite(style.sprite);\n\n this.glyphSource = style.glyphSource;\n\n this.frameHistory.record(Date.now(), this.transform.zoom, style.getTransition().duration);\n\n this.prepareBuffers();\n this.clearColor();\n this.clearDepth();\n\n this.showOverdrawInspector(options.showOverdrawInspector);\n\n this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon;\n\n this.isOpaquePass = true;\n this.renderPass();\n this.isOpaquePass = false;\n this.renderPass();\n\n if (this.options.showTileBoundaries) {\n const sourceCache = this.style.sourceCaches[Object.keys(this.style.sourceCaches)[0]];\n if (sourceCache) {\n draw.debug(this, sourceCache, sourceCache.getVisibleCoordinates());\n }\n }\n }\n\n renderPass() {\n const layerIds = this.style._order;\n\n let sourceCache, coords;\n\n this.currentLayer = this.isOpaquePass ? layerIds.length - 1 : 0;\n\n if (this.isOpaquePass) {\n if (!this._showOverdrawInspector) {\n this.gl.disable(this.gl.BLEND);\n }\n } else {\n this.gl.enable(this.gl.BLEND);\n }\n\n for (let i = 0; i < layerIds.length; i++) {\n const layer = this.style._layers[layerIds[this.currentLayer]];\n\n if (layer.source !== (sourceCache && sourceCache.id)) {\n sourceCache = this.style.sourceCaches[layer.source];\n coords = [];\n\n if (sourceCache) {\n if (sourceCache.prepare) sourceCache.prepare();\n this.clearStencil();\n coords = sourceCache.getVisibleCoordinates();\n if (sourceCache.getSource().isTileClipped) {\n this._renderTileClippingMasks(coords);\n }\n }\n\n if (!this.isOpaquePass) {\n coords.reverse();\n }\n }\n\n this.renderLayer(this, sourceCache, layer, coords);\n this.currentLayer += this.isOpaquePass ? -1 : 1;\n }\n }\n\n depthMask(mask) {\n if (mask !== this._depthMask) {\n this._depthMask = mask;\n this.gl.depthMask(mask);\n }\n }\n\n renderLayer(painter, sourceCache, layer, coords) {\n if (layer.isHidden(this.transform.zoom)) return;\n if (layer.type !== 'background' && !coords.length) return;\n this.id = layer.id;\n\n draw[layer.type](painter, sourceCache, layer, coords);\n }\n\n setDepthSublayer(n) {\n const farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;\n const nearDepth = farDepth - 1 + this.depthRange;\n this.gl.depthRange(nearDepth, farDepth);\n }\n\n translatePosMatrix(matrix, tile, translate, anchor) {\n if (!translate[0] && !translate[1]) return matrix;\n\n if (anchor === 'viewport') {\n const sinA = Math.sin(-this.transform.angle);\n const cosA = Math.cos(-this.transform.angle);\n translate = [\n translate[0] * cosA - translate[1] * sinA,\n translate[0] * sinA + translate[1] * cosA\n ];\n }\n\n const translation = [\n pixelsToTileUnits(tile, translate[0], this.transform.zoom),\n pixelsToTileUnits(tile, translate[1], this.transform.zoom),\n 0\n ];\n\n const translatedMatrix = new Float32Array(16);\n mat4.translate(translatedMatrix, matrix, translation);\n return translatedMatrix;\n }\n\n saveTileTexture(texture) {\n const textures = this.reusableTextures.tiles[texture.size];\n if (!textures) {\n this.reusableTextures.tiles[texture.size] = [texture];\n } else {\n textures.push(texture);\n }\n }\n\n saveViewportTexture(texture) {\n this.reusableTextures.viewport = texture;\n }\n\n getTileTexture(size) {\n const textures = this.reusableTextures.tiles[size];\n return textures && textures.length > 0 ? textures.pop() : null;\n }\n\n getViewportTexture(width, height) {\n const texture = this.reusableTextures.viewport;\n if (!texture) return;\n\n if (texture.width === width && texture.height === height) {\n return texture;\n } else {\n this.gl.deleteTexture(texture);\n this.reusableTextures.viewport = null;\n return;\n }\n }\n\n lineWidth(width) {\n this.gl.lineWidth(util.clamp(width, this.lineWidthRange[0], this.lineWidthRange[1]));\n }\n\n showOverdrawInspector(enabled) {\n if (!enabled && !this._showOverdrawInspector) return;\n this._showOverdrawInspector = enabled;\n\n const gl = this.gl;\n if (enabled) {\n gl.blendFunc(gl.CONSTANT_COLOR, gl.ONE);\n const numOverdrawSteps = 8;\n const a = 1 / numOverdrawSteps;\n gl.blendColor(a, a, a, 0);\n gl.clearColor(0, 0, 0, 1);\n gl.clear(gl.COLOR_BUFFER_BIT);\n } else {\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n }\n }\n\n createProgram(name, configuration) {\n const gl = this.gl;\n const program = gl.createProgram();\n const definition = shaders[name];\n\n let definesSource = `#define MAPBOX_GL_JS\\n#define DEVICE_PIXEL_RATIO ${browser.devicePixelRatio.toFixed(1)}\\n`;\n if (this._showOverdrawInspector) {\n definesSource += '#define OVERDRAW_INSPECTOR;\\n';\n }\n\n const fragmentSource = configuration.applyPragmas(definesSource + shaders.prelude.fragmentSource + definition.fragmentSource, 'fragment');\n const vertexSource = configuration.applyPragmas(definesSource + shaders.prelude.vertexSource + definition.vertexSource, 'vertex');\n\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader));\n gl.attachShader(program, fragmentShader);\n\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader));\n gl.attachShader(program, vertexShader);\n\n gl.linkProgram(program);\n assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program));\n\n const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n const result = {program, numAttributes};\n\n for (let i = 0; i < numAttributes; i++) {\n const attribute = gl.getActiveAttrib(program, i);\n result[attribute.name] = gl.getAttribLocation(program, attribute.name);\n }\n const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n for (let i = 0; i < numUniforms; i++) {\n const uniform = gl.getActiveUniform(program, i);\n result[uniform.name] = gl.getUniformLocation(program, uniform.name);\n }\n return result;\n }\n\n _createProgramCached(name, programConfiguration) {\n this.cache = this.cache || {};\n const key = `${name}${programConfiguration.cacheKey || ''}${this._showOverdrawInspector ? '/overdraw' : ''}`;\n if (!this.cache[key]) {\n this.cache[key] = this.createProgram(name, programConfiguration);\n }\n return this.cache[key];\n }\n\n useProgram(name, programConfiguration) {\n const gl = this.gl;\n const nextProgram = this._createProgramCached(name, programConfiguration || this.emptyProgramConfiguration);\n\n if (this.currentProgram !== nextProgram) {\n gl.useProgram(nextProgram.program);\n this.currentProgram = nextProgram;\n }\n\n return nextProgram;\n }\n}\n\nmodule.exports = Painter;\n","'use strict';\n\nconst pixelsToTileUnits = require('../source/pixels_to_tile_units');\n\nexports.prepare = function (image, painter, program) {\n const gl = painter.gl;\n\n const imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n const imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n if (!imagePosA || !imagePosB) return;\n\n gl.uniform1i(program.u_image, 0);\n gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl);\n gl.uniform2fv(program.u_pattern_br_a, imagePosA.br);\n gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl);\n gl.uniform2fv(program.u_pattern_br_b, imagePosB.br);\n gl.uniform1f(program.u_mix, image.t);\n gl.uniform2fv(program.u_pattern_size_a, imagePosA.size);\n gl.uniform2fv(program.u_pattern_size_b, imagePosB.size);\n gl.uniform1f(program.u_scale_a, image.fromScale);\n gl.uniform1f(program.u_scale_b, image.toScale);\n\n gl.activeTexture(gl.TEXTURE0);\n painter.spriteAtlas.bind(gl, true);\n};\n\nexports.setTile = function (tile, painter, program) {\n const gl = painter.gl;\n\n gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom));\n\n const numTiles = Math.pow(2, tile.coord.z);\n const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles;\n\n const pixelX = tileSizeAtNearestZoom * (tile.coord.x + tile.coord.w * numTiles);\n const pixelY = tileSizeAtNearestZoom * tile.coord.y;\n\n // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision.\n gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16);\n gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF);\n};\n","'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\n\n// readFileSync calls must be written out long-form for brfs.\nmodule.exports = {\n prelude: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/_prelude.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/_prelude.vertex.glsl'), 'utf8')\n },\n circle: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/circle.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/circle.vertex.glsl'), 'utf8')\n },\n collisionBox: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/collision_box.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/collision_box.vertex.glsl'), 'utf8')\n },\n debug: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/debug.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/debug.vertex.glsl'), 'utf8')\n },\n fill: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill.vertex.glsl'), 'utf8')\n },\n fillOutline: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline.vertex.glsl'), 'utf8')\n },\n fillOutlinePattern: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline_pattern.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline_pattern.vertex.glsl'), 'utf8')\n },\n fillPattern: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_pattern.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_pattern.vertex.glsl'), 'utf8')\n },\n fillExtrusion: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion.vertex.glsl'), 'utf8')\n },\n fillExtrusionPattern: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion_pattern.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion_pattern.vertex.glsl'), 'utf8')\n },\n extrusionTexture: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/extrusion_texture.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/extrusion_texture.vertex.glsl'), 'utf8')\n },\n line: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/line.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/line.vertex.glsl'), 'utf8')\n },\n linePattern: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/line_pattern.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/line_pattern.vertex.glsl'), 'utf8')\n },\n lineSDF: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/line_sdf.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/line_sdf.vertex.glsl'), 'utf8')\n },\n raster: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/raster.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/raster.vertex.glsl'), 'utf8')\n },\n symbolIcon: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_icon.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_icon.vertex.glsl'), 'utf8')\n },\n symbolSDF: {\n fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_sdf.fragment.glsl'), 'utf8'),\n vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_sdf.vertex.glsl'), 'utf8')\n }\n};\n","'use strict';\n\nconst assert = require('assert');\n\nclass VertexArrayObject {\n constructor() {\n this.boundProgram = null;\n this.boundVertexBuffer = null;\n this.boundVertexBuffer2 = null;\n this.boundElementBuffer = null;\n this.boundVertexOffset = null;\n this.vao = null;\n }\n\n bind(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2, vertexOffset) {\n\n if (gl.extVertexArrayObject === undefined) {\n gl.extVertexArrayObject = gl.getExtension(\"OES_vertex_array_object\");\n }\n\n const isFreshBindRequired = (\n !this.vao ||\n this.boundProgram !== program ||\n this.boundVertexBuffer !== layoutVertexBuffer ||\n this.boundVertexBuffer2 !== vertexBuffer2 ||\n this.boundElementBuffer !== elementBuffer ||\n this.boundVertexOffset !== vertexOffset\n );\n\n if (!gl.extVertexArrayObject || isFreshBindRequired) {\n this.freshBind(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2, vertexOffset);\n this.gl = gl;\n } else {\n gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n }\n }\n\n freshBind(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2, vertexOffset) {\n let numPrevAttributes;\n const numNextAttributes = program.numAttributes;\n\n if (gl.extVertexArrayObject) {\n if (this.vao) this.destroy();\n this.vao = gl.extVertexArrayObject.createVertexArrayOES();\n gl.extVertexArrayObject.bindVertexArrayOES(this.vao);\n numPrevAttributes = 0;\n\n // store the arguments so that we can verify them when the vao is bound again\n this.boundProgram = program;\n this.boundVertexBuffer = layoutVertexBuffer;\n this.boundVertexBuffer2 = vertexBuffer2;\n this.boundElementBuffer = elementBuffer;\n this.boundVertexOffset = vertexOffset;\n\n } else {\n numPrevAttributes = gl.currentNumAttributes || 0;\n\n // Disable all attributes from the previous program that aren't used in\n // the new program. Note: attribute indices are *not* program specific!\n for (let i = numNextAttributes; i < numPrevAttributes; i++) {\n // WebGL breaks if you disable attribute 0.\n // http://stackoverflow.com/questions/20305231\n assert(i !== 0);\n gl.disableVertexAttribArray(i);\n }\n }\n\n // Enable all attributes for the new program.\n for (let j = numPrevAttributes; j < numNextAttributes; j++) {\n gl.enableVertexAttribArray(j);\n }\n\n layoutVertexBuffer.bind(gl);\n layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset);\n if (vertexBuffer2) {\n vertexBuffer2.bind(gl);\n vertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset);\n }\n if (elementBuffer) {\n elementBuffer.bind(gl);\n }\n\n gl.currentNumAttributes = numNextAttributes;\n }\n\n destroy() {\n if (this.vao) {\n this.gl.extVertexArrayObject.deleteVertexArrayOES(this.vao);\n this.vao = null;\n }\n }\n}\n\nmodule.exports = VertexArrayObject;\n","'use strict';\n\nconst ImageSource = require('./image_source');\nconst window = require('../util/window');\n\n/**\n * A data source containing the contents of an HTML canvas.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-canvas) for detailed documentation of options.)\n * @interface CanvasSource\n * @example\n * // add to map\n * map.addSource('some id', {\n * type: 'canvas',\n * canvas: 'idOfMyHTMLCanvas',\n * animate: true,\n * coordinates: [\n * [-76.54, 39.18],\n * [-76.52, 39.18],\n * [-76.52, 39.17],\n * [-76.54, 39.17]\n * ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n * [-76.54335737228394, 39.18579907229748],\n * [-76.52803659439087, 39.1838364847587],\n * [-76.5295386314392, 39.17683392507606],\n * [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id'); // remove\n */\nclass CanvasSource extends ImageSource {\n\n constructor(id, options, dispatcher, eventedParent) {\n super(id, options, dispatcher, eventedParent);\n this.options = options;\n this.animate = options.hasOwnProperty('animate') ? options.animate : true;\n }\n\n load() {\n this.canvas = this.canvas || window.document.getElementById(this.options.canvas);\n this.width = this.canvas.width;\n this.height = this.canvas.height;\n if (this._hasInvalidDimensions()) return this.fire('error', new Error('Canvas dimensions cannot be less than or equal to zero.'));\n\n let loopID;\n\n this.play = function() {\n loopID = this.map.style.animationLoop.set(Infinity);\n this.map._rerender();\n };\n\n this.pause = function() {\n this.map.style.animationLoop.cancel(loopID);\n };\n\n this._finishLoading();\n }\n\n /**\n * Returns the HTML `canvas` element.\n *\n * @returns {HTMLCanvasElement} The HTML `canvas` element.\n */\n getCanvas() {\n return this.canvas;\n }\n\n onAdd(map) {\n if (this.map) return;\n this.map = map;\n this.load();\n if (this.canvas) {\n if (this.animate) this.play();\n }\n }\n\n /**\n * Sets the canvas's coordinates and re-renders the map.\n *\n * @method setCoordinates\n * @param {Array>} coordinates Four geographical coordinates,\n * represented as arrays of longitude and latitude numbers, which define the corners of the canvas.\n * The coordinates start at the top left corner of the canvas and proceed in clockwise order.\n * They do not have to represent a rectangle.\n * @returns {CanvasSource} this\n */\n // setCoordinates inherited from ImageSource\n\n prepare() {\n let resize = false;\n if (this.canvas.width !== this.width) {\n this.width = this.canvas.width;\n resize = true;\n }\n if (this.canvas.height !== this.height) {\n this.height = this.canvas.height;\n resize = true;\n }\n if (this._hasInvalidDimensions()) return;\n\n if (!this.tile) return; // not enough data for current position\n this._prepareImage(this.map.painter.gl, this.canvas, resize);\n }\n\n serialize() {\n return {\n type: 'canvas',\n canvas: this.canvas,\n coordinates: this.coordinates\n };\n }\n\n _hasInvalidDimensions() {\n for (const x of [this.canvas.width, this.canvas.height]) {\n if (isNaN(x) || x <= 0) return true;\n }\n return false;\n }\n}\n\nmodule.exports = CanvasSource;\n","'use strict';\n\nconst Evented = require('../util/evented');\nconst util = require('../util/util');\nconst window = require('../util/window');\nconst EXTENT = require('../data/extent');\n\n/**\n * A source containing GeoJSON.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options.)\n *\n * @interface GeoJSONSource\n * @example\n *\n * map.addSource('some id', {\n * type: 'geojson',\n * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson'\n * });\n *\n * @example\n * map.addSource('some id', {\n * type: 'geojson',\n * data: {\n * \"type\": \"FeatureCollection\",\n * \"features\": [{\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [\n * -76.53063297271729,\n * 39.18174077994108\n * ]\n * }\n * }]\n * }\n * });\n *\n * @example\n * map.getSource('some id').setData({\n * \"type\": \"FeatureCollection\",\n * \"features\": [{\n * \"type\": \"Feature\",\n * \"properties\": { \"name\": \"Null Island\" },\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [ 0, 0 ]\n * }\n * }]\n * });\n * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/)\n * @see [Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/)\n * @see [Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/)\n */\nclass GeoJSONSource extends Evented {\n\n constructor(id, options, dispatcher, eventedParent) {\n super();\n options = options || {};\n this.id = id;\n\n // `type` is a property rather than a constant to make it easy for 3rd\n // parties to use GeoJSONSource to build their own source types.\n this.type = 'geojson';\n\n this.minzoom = 0;\n this.maxzoom = 18;\n this.tileSize = 512;\n this.isTileClipped = true;\n this.reparseOverscaled = true;\n\n this.dispatcher = dispatcher;\n this.setEventedParent(eventedParent);\n\n this._data = options.data;\n\n if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n if (options.type) this.type = options.type;\n\n const scale = EXTENT / this.tileSize;\n\n // sent to the worker, along with `url: ...` or `data: literal geojson`,\n // so that it can load/parse/index the geojson data\n // extending with `options.workerOptions` helps to make it easy for\n // third-party sources to hack/reuse GeoJSONSource.\n this.workerOptions = util.extend({\n source: this.id,\n cluster: options.cluster || false,\n geojsonVtOptions: {\n buffer: (options.buffer !== undefined ? options.buffer : 128) * scale,\n tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale,\n extent: EXTENT,\n maxZoom: this.maxzoom\n },\n superclusterOptions: {\n maxZoom: Math.min(options.clusterMaxZoom, this.maxzoom) || (this.maxzoom - 1),\n aggregateBy: options.aggregateBy,\n extent: EXTENT,\n radius: (options.clusterRadius || 50) * scale,\n log: false\n }\n }, options.workerOptions);\n }\n\n load() {\n this.fire('dataloading', {dataType: 'source'});\n this._updateWorkerData((err) => {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache\n // know its ok to start requesting tiles.\n this.fire('data', {dataType: 'source', sourceDataType: 'metadata'});\n });\n }\n\n onAdd(map) {\n this.load();\n this.map = map;\n }\n\n /**\n * Sets the GeoJSON data and re-renders the map.\n *\n * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files.\n * @returns {GeoJSONSource} this\n */\n setData(data) {\n this._data = data;\n this.fire('dataloading', {dataType: 'source'});\n this._updateWorkerData((err) => {\n if (err) {\n return this.fire('error', { error: err });\n }\n this.fire('data', {dataType: 'source', sourceDataType: 'content'});\n });\n\n return this;\n }\n\n getLeaves(clusterId, clusterZoom, limit, offset, callback){\n const options = util.extend({clusterId: clusterId, clusterZoom: Math.ceil(clusterZoom), limit: limit || 10, offset: offset || 0}, this.workerOptions);\n\n this.dispatcher.send(`${this.type}.getLeaves`, options, (err, leaves) => {\n if (err) {\n callback({success: false});\n return this.fire('error', { error: err });\n }\n callback({success: true, leaves: leaves});\n }, this.workerID);\n }\n\n /*\n * Responsible for invoking WorkerSource's geojson.loadData target, which\n * handles loading the geojson data and preparing to serve it up as tiles,\n * using geojson-vt or supercluster as appropriate.\n */\n _updateWorkerData(callback) {\n const options = util.extend({}, this.workerOptions);\n const data = this._data;\n if (typeof data === 'string') {\n options.url = resolveURL(data);\n } else {\n options.data = JSON.stringify(data);\n }\n\n // target {this.type}.loadData rather than literally geojson.loadData,\n // so that other geojson-like source types can easily reuse this\n // implementation\n this.workerID = this.dispatcher.send(`${this.type}.loadData`, options, (err) => {\n this._loaded = true;\n callback(err);\n\n });\n }\n\n loadTile(tile, callback) {\n const overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n const params = {\n type: this.type,\n uid: tile.uid,\n coord: tile.coord,\n zoom: tile.coord.z,\n maxZoom: this.maxzoom,\n tileSize: this.tileSize,\n source: this.id,\n overscaling: overscaling,\n angle: this.map.transform.angle,\n pitch: this.map.transform.pitch,\n showCollisionBoxes: this.map.showCollisionBoxes\n };\n\n tile.workerID = this.dispatcher.send('loadTile', params, (err, data) => {\n\n tile.unloadVectorData();\n\n if (tile.aborted)\n return;\n\n if (err) {\n return callback(err);\n }\n\n tile.loadVectorData(data, this.map.painter);\n\n if (tile.redoWhenDone) {\n tile.redoWhenDone = false;\n tile.redoPlacement(this);\n }\n\n return callback(null);\n\n }, this.workerID);\n }\n\n abortTile(tile) {\n tile.aborted = true;\n }\n\n unloadTile(tile) {\n tile.unloadVectorData();\n this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, () => {}, tile.workerID);\n }\n\n onRemove() {\n this.dispatcher.broadcast('removeSource', { type: this.type, source: this.id }, () => {});\n }\n\n serialize() {\n return {\n type: this.type,\n data: this._data\n };\n }\n}\n\nfunction resolveURL(url) {\n const a = window.document.createElement('a');\n a.href = url;\n return a.href;\n}\n\nmodule.exports = GeoJSONSource;\n","'use strict';\n\nconst ajax = require('../util/ajax');\nconst rewind = require('geojson-rewind');\nconst GeoJSONWrapper = require('./geojson_wrapper');\nconst vtpbf = require('vt-pbf');\nconst supercluster = require('supercluster');\nconst geojsonvt = require('geojson-vt');\n\nconst VectorTileWorkerSource = require('./vector_tile_worker_source');\n\n/**\n * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}.\n * This class is designed to be easily reused to support custom source types\n * for data formats that can be parsed/converted into an in-memory GeoJSON\n * representation. To do so, create it with\n * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`. For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson).\n *\n * @private\n */\nclass GeoJSONWorkerSource extends VectorTileWorkerSource {\n /**\n * @param {Function} [loadGeoJSON] Optional method for custom loading/parsing of GeoJSON based on parameters passed from the main-thread Source. See {@link GeoJSONWorkerSource#loadGeoJSON}.\n */\n constructor (actor, layerIndex, loadGeoJSON) {\n super(actor, layerIndex);\n if (loadGeoJSON) {\n this.loadGeoJSON = loadGeoJSON;\n }\n // object mapping source ids to geojson-vt-like tile indexes\n this._geoJSONIndexes = {};\n }\n\n /**\n * See {@link VectorTileWorkerSource#loadTile}.\n */\n loadVectorData(params, callback) {\n const source = params.source,\n coord = params.coord;\n\n if (!this._geoJSONIndexes[source]) {\n return callback(null, null); // we couldn't load the file\n }\n\n const geoJSONTile = this._geoJSONIndexes[source].getTile(Math.min(coord.z, params.maxZoom), coord.x, coord.y);\n if (!geoJSONTile) {\n return callback(null, null); // nothing in the given tile\n }\n\n const geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features);\n geojsonWrapper.name = '_geojsonTileLayer';\n let pbf = vtpbf({ layers: { '_geojsonTileLayer': geojsonWrapper }});\n if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) {\n // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35)\n pbf = new Uint8Array(pbf);\n }\n geojsonWrapper.rawData = pbf.buffer;\n callback(null, geojsonWrapper);\n } \n\n getLeaves(params, callback) {\n const superclusterInstance = this._geoJSONIndexes[params.source];\n const leaves = superclusterInstance.getLeaves(params.clusterId, params.clusterZoom, params.limit, params.offset);\n\n callback(null, leaves);\n }\n\n /**\n * Fetches (if appropriate), parses, and index geojson data into tiles. This\n * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile}\n * can correctly serve up tiles.\n *\n * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing,\n * expecting `callback(error, data)` to be called with either an error or a\n * parsed GeoJSON object.\n * @param {Object} params\n * @param {string} params.source The id of the source.\n * @param {Function} callback\n */\n loadData(params, callback) {\n const handleData = function(err, data) {\n if (err) return callback(err);\n if (typeof data != 'object') {\n return callback(new Error(\"Input data is not a valid GeoJSON object.\"));\n }\n rewind(data, true);\n this._indexData(data, params, (err, indexed) => {\n if (err) { return callback(err); }\n this._geoJSONIndexes[params.source] = indexed;\n callback(null);\n });\n }.bind(this);\n\n this.loadGeoJSON(params, handleData);\n }\n\n /**\n * Fetch and parse GeoJSON according to the given params. Calls `callback`\n * with `(err, data)`, where `data` is a parsed GeoJSON object.\n *\n * GeoJSON is loaded and parsed from `params.url` if it exists, or else\n * expected as a literal (string or object) `params.data`.\n *\n * @param {Object} params\n * @param {string} [params.url] A URL to the remote GeoJSON data.\n * @param {Object} [params.data] Literal GeoJSON data. Must be provided if `params.url` is not.\n */\n loadGeoJSON(params, callback) {\n // Because of same origin issues, urls must either include an explicit\n // origin or absolute path.\n // ie: /foo/bar.json or http://example.com/bar.json\n // but not ../foo/bar.json\n if (params.url) {\n ajax.getJSON(params.url, callback);\n } else if (typeof params.data === 'string') {\n try {\n return callback(null, JSON.parse(params.data));\n } catch (e) {\n return callback(new Error(\"Input data is not a valid GeoJSON object.\"));\n }\n } else {\n return callback(new Error(\"Input data is not a valid GeoJSON object.\"));\n }\n }\n\n removeSource(params) {\n if (this._geoJSONIndexes[params.source]) {\n delete this._geoJSONIndexes[params.source];\n }\n }\n\n /**\n * Index the data using either geojson-vt or supercluster\n * @param {GeoJSON} data\n * @param {Object} params forwarded from loadTile.\n * @param {callback} (err, indexedData)\n * @private\n */\n _indexData(data, params, callback) {\n var superclusterOptions;\n try {\n if (params.cluster) {\n superclusterOptions = params.superclusterOptions;\n if (superclusterOptions.aggregateBy) {\n superclusterOptions.reduce = function (accumulated, props) {\n accumulated.sum += props.sum;\n };\n superclusterOptions.map = function (props) {\n return {sum: props[superclusterOptions.aggregateBy] || 1};\n };\n superclusterOptions.initial = function () {\n return {sum: 0};\n };\n }\n callback(null, supercluster(superclusterOptions).load(data.features));\n } else {\n callback(null, geojsonvt(data, params.geojsonVtOptions));\n }\n } catch (err) {\n return callback(err);\n }\n }\n}\n\nmodule.exports = GeoJSONWorkerSource;\n","'use strict';\n\nconst Point = require('point-geometry');\nconst VectorTileFeature = require('vector-tile').VectorTileFeature;\nconst EXTENT = require('../data/extent');\n\nclass FeatureWrapper {\n\n constructor(feature) {\n this.type = feature.type;\n if (feature.type === 1) {\n this.rawGeometry = [];\n for (let i = 0; i < feature.geometry.length; i++) {\n this.rawGeometry.push([feature.geometry[i]]);\n }\n } else {\n this.rawGeometry = feature.geometry;\n }\n this.properties = feature.tags;\n if ('id' in feature) {\n this.id = feature.id;\n }\n this.extent = EXTENT;\n }\n\n loadGeometry() {\n const rings = this.rawGeometry;\n this.geometry = [];\n\n for (let i = 0; i < rings.length; i++) {\n const ring = rings[i],\n newRing = [];\n for (let j = 0; j < ring.length; j++) {\n newRing.push(new Point(ring[j][0], ring[j][1]));\n }\n this.geometry.push(newRing);\n }\n return this.geometry;\n }\n\n bbox() {\n if (!this.geometry) this.loadGeometry();\n\n const rings = this.geometry;\n let x1 = Infinity,\n x2 = -Infinity,\n y1 = Infinity,\n y2 = -Infinity;\n\n for (let i = 0; i < rings.length; i++) {\n const ring = rings[i];\n\n for (let j = 0; j < ring.length; j++) {\n const coord = ring[j];\n\n x1 = Math.min(x1, coord.x);\n x2 = Math.max(x2, coord.x);\n y1 = Math.min(y1, coord.y);\n y2 = Math.max(y2, coord.y);\n }\n }\n\n return [x1, y1, x2, y2];\n }\n\n toGeoJSON() {\n VectorTileFeature.prototype.toGeoJSON.call(this);\n }\n}\n\n// conform to vectortile api\nclass GeoJSONWrapper {\n\n constructor(features) {\n this.features = features;\n this.length = features.length;\n this.extent = EXTENT;\n }\n\n feature(i) {\n return new FeatureWrapper(this.features[i]);\n }\n}\n\nmodule.exports = GeoJSONWrapper;\n","'use strict';\n\nconst util = require('../util/util');\nconst window = require('../util/window');\nconst TileCoord = require('./tile_coord');\nconst LngLat = require('../geo/lng_lat');\nconst Point = require('point-geometry');\nconst Evented = require('../util/evented');\nconst ajax = require('../util/ajax');\nconst EXTENT = require('../data/extent');\nconst RasterBoundsArray = require('../data/raster_bounds_array');\nconst Buffer = require('../data/buffer');\nconst VertexArrayObject = require('../render/vertex_array_object');\n\n/**\n * A data source containing an image.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.)\n *\n * @interface ImageSource\n * @example\n * // add to map\n * map.addSource('some id', {\n * type: 'image',\n * url: 'https://www.mapbox.com/images/foo.png',\n * coordinates: [\n * [-76.54, 39.18],\n * [-76.52, 39.18],\n * [-76.52, 39.17],\n * [-76.54, 39.17]\n * ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n * [-76.54335737228394, 39.18579907229748],\n * [-76.52803659439087, 39.1838364847587],\n * [-76.5295386314392, 39.17683392507606],\n * [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id'); // remove\n * @see [Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/)\n */\nclass ImageSource extends Evented {\n\n constructor(id, options, dispatcher, eventedParent) {\n super();\n this.id = id;\n this.dispatcher = dispatcher;\n this.coordinates = options.coordinates;\n\n this.type = 'image';\n this.minzoom = 0;\n this.maxzoom = 22;\n this.tileSize = 512;\n\n this.setEventedParent(eventedParent);\n\n this.options = options;\n }\n\n load() {\n this.fire('dataloading', {dataType: 'source'});\n\n this.url = this.options.url;\n\n ajax.getImage(this.options.url, (err, image) => {\n if (err) return this.fire('error', {error: err});\n\n this.image = image;\n\n this._finishLoading();\n });\n }\n\n _finishLoading() {\n if (this.map) {\n this.setCoordinates(this.coordinates);\n this.fire('data', {dataType: 'source', sourceDataType: 'metadata'});\n }\n }\n\n onAdd(map) {\n this.load();\n this.map = map;\n if (this.image) {\n this.setCoordinates(this.coordinates);\n }\n }\n\n /**\n * Sets the image's coordinates and re-renders the map.\n *\n * @param {Array>} coordinates Four geographical coordinates,\n * represented as arrays of longitude and latitude numbers, which define the corners of the image.\n * The coordinates start at the top left corner of the image and proceed in clockwise order.\n * They do not have to represent a rectangle.\n * @returns {ImageSource} this\n */\n setCoordinates(coordinates) {\n this.coordinates = coordinates;\n\n // Calculate which mercator tile is suitable for rendering the video in\n // and create a buffer with the corner coordinates. These coordinates\n // may be outside the tile, because raster tiles aren't clipped when rendering.\n\n const map = this.map;\n const cornerZ0Coords = coordinates.map((coord) => {\n return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0);\n });\n\n const centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords);\n centerCoord.column = Math.round(centerCoord.column);\n centerCoord.row = Math.round(centerCoord.row);\n\n this.minzoom = this.maxzoom = centerCoord.zoom;\n this.coord = new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row);\n this._tileCoords = cornerZ0Coords.map((coord) => {\n const zoomedCoord = coord.zoomTo(centerCoord.zoom);\n return new Point(\n Math.round((zoomedCoord.column - centerCoord.column) * EXTENT),\n Math.round((zoomedCoord.row - centerCoord.row) * EXTENT));\n });\n\n this.fire('data', {dataType:'source', sourceDataType: 'content'});\n return this;\n }\n\n _setTile(tile) {\n this.tile = tile;\n const maxInt16 = 32767;\n const array = new RasterBoundsArray();\n array.emplaceBack(this._tileCoords[0].x, this._tileCoords[0].y, 0, 0);\n array.emplaceBack(this._tileCoords[1].x, this._tileCoords[1].y, maxInt16, 0);\n array.emplaceBack(this._tileCoords[3].x, this._tileCoords[3].y, 0, maxInt16);\n array.emplaceBack(this._tileCoords[2].x, this._tileCoords[2].y, maxInt16, maxInt16);\n\n this.tile.buckets = {};\n\n this.tile.boundsBuffer = Buffer.fromStructArray(array, Buffer.BufferType.VERTEX);\n this.tile.boundsVAO = new VertexArrayObject();\n }\n\n prepare() {\n if (!this.tile || !this.image) return;\n this._prepareImage(this.map.painter.gl, this.image);\n }\n\n _prepareImage(gl, image, resize) {\n if (this.tile.state !== 'loaded') {\n this.tile.state = 'loaded';\n this.tile.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n } else if (resize) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n } else if (image instanceof window.HTMLVideoElement || image instanceof window.ImageData || image instanceof window.HTMLCanvasElement) {\n gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, image);\n }\n }\n\n loadTile(tile, callback) {\n // We have a single tile -- whoose coordinates are this.coord -- that\n // covers the image we want to render. If that's the one being\n // requested, set it up with the image; otherwise, mark the tile as\n // `errored` to indicate that we have no data for it.\n if (this.coord && this.coord.toString() === tile.coord.toString()) {\n this._setTile(tile);\n callback(null);\n } else {\n tile.state = 'errored';\n callback(null);\n }\n }\n\n serialize() {\n return {\n type: 'image',\n urls: this.url,\n coordinates: this.coordinates\n };\n }\n}\n\nmodule.exports = ImageSource;\n","'use strict';\nconst util = require('../util/util');\nconst ajax = require('../util/ajax');\nconst browser = require('../util/browser');\nconst normalizeURL = require('../util/mapbox').normalizeSourceURL;\n\nmodule.exports = function(options, callback) {\n const loaded = function(err, tileJSON) {\n if (err) {\n return callback(err);\n }\n\n const result = util.pick(tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo']);\n\n if (tileJSON.vector_layers) {\n result.vectorLayers = tileJSON.vector_layers;\n result.vectorLayerIds = result.vectorLayers.map((layer) => { return layer.id; });\n }\n\n callback(null, result);\n };\n\n if (options.url) {\n ajax.getJSON(normalizeURL(options.url), loaded);\n } else {\n browser.frame(loaded.bind(null, null, options));\n }\n};\n\n","'use strict';\n\nconst EXTENT = require('../data/extent');\n\n/**\n * Converts a pixel value at a the given zoom level to tile units.\n *\n * The shaders mostly calculate everything in tile units so style\n * properties need to be converted from pixels to tile units using this.\n *\n * For example, a translation by 30 pixels at zoom 6.5 will be a\n * translation by pixelsToTileUnits(30, 6.5) tile units.\n *\n * @param {Object} tile a {Tile object} will work well, but any object that follows the format {coord: {TileCord object}, tileSize: {number}} will work\n * @param {number} pixelValue\n * @param {number} z\n * @returns {number} value in tile units\n * @private\n */\nmodule.exports = function(tile, pixelValue, z) {\n return pixelValue * (EXTENT / (tile.tileSize * Math.pow(2, z - tile.coord.z)));\n};\n","'use strict';\nconst TileCoord = require('./tile_coord');\n\nexports.rendered = function(sourceCache, styleLayers, queryGeometry, params, zoom, bearing) {\n const tilesIn = sourceCache.tilesIn(queryGeometry);\n\n tilesIn.sort(sortTilesIn);\n\n const renderedFeatureLayers = [];\n for (let r = 0; r < tilesIn.length; r++) {\n const tileIn = tilesIn[r];\n if (!tileIn.tile.featureIndex) continue;\n\n renderedFeatureLayers.push(tileIn.tile.featureIndex.query({\n queryGeometry: tileIn.queryGeometry,\n scale: tileIn.scale,\n tileSize: tileIn.tile.tileSize,\n bearing: bearing,\n params: params\n }, styleLayers));\n }\n return mergeRenderedFeatureLayers(renderedFeatureLayers);\n};\n\nexports.source = function(sourceCache, params) {\n const tiles = sourceCache.getRenderableIds().map((id) => {\n return sourceCache.getTileByID(id);\n });\n\n const result = [];\n\n const dataTiles = {};\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n const dataID = new TileCoord(Math.min(tile.sourceMaxZoom, tile.coord.z), tile.coord.x, tile.coord.y, 0).id;\n if (!dataTiles[dataID]) {\n dataTiles[dataID] = true;\n tile.querySourceFeatures(result, params);\n }\n }\n\n return result;\n};\n\nfunction sortTilesIn(a, b) {\n const coordA = a.coord;\n const coordB = b.coord;\n return (coordA.z - coordB.z) || (coordA.y - coordB.y) || (coordA.w - coordB.w) || (coordA.x - coordB.x);\n}\n\nfunction mergeRenderedFeatureLayers(tiles) {\n const result = tiles[0] || {};\n for (let i = 1; i < tiles.length; i++) {\n const tile = tiles[i];\n for (const layerID in tile) {\n const tileFeatures = tile[layerID];\n let resultFeatures = result[layerID];\n if (resultFeatures === undefined) {\n resultFeatures = result[layerID] = tileFeatures;\n } else {\n for (let f = 0; f < tileFeatures.length; f++) {\n resultFeatures.push(tileFeatures[f]);\n }\n }\n }\n }\n return result;\n}\n\n","'use strict';\n\nconst util = require('../util/util');\nconst ajax = require('../util/ajax');\nconst Evented = require('../util/evented');\nconst loadTileJSON = require('./load_tilejson');\nconst normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nclass RasterTileSource extends Evented {\n\n constructor(id, options, dispatcher, eventedParent) {\n super();\n this.id = id;\n this.dispatcher = dispatcher;\n this.setEventedParent(eventedParent);\n\n this.type = 'raster';\n this.minzoom = 0;\n this.maxzoom = 22;\n this.roundZoom = true;\n this.scheme = 'xyz';\n this.tileSize = 512;\n this._loaded = false;\n this.options = options;\n util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n }\n\n load() {\n this.fire('dataloading', {dataType: 'source'});\n loadTileJSON(this.options, (err, tileJSON) => {\n if (err) {\n return this.fire('error', err);\n }\n util.extend(this, tileJSON);\n\n // `content` is included here to prevent a race condition where `Style#_updateSources` is called\n // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives\n // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088\n this.fire('data', {dataType: 'source', sourceDataType: 'metadata'});\n this.fire('data', {dataType: 'source', sourceDataType: 'content'});\n\n });\n }\n\n onAdd(map) {\n this.load();\n this.map = map;\n }\n\n serialize() {\n return {\n type: 'raster',\n url: this.url,\n tileSize: this.tileSize,\n tiles: this.tiles\n };\n }\n\n loadTile(tile, callback) {\n const url = normalizeURL(tile.coord.url(this.tiles, null, this.scheme), this.url, this.tileSize);\n\n tile.request = ajax.getImage(url, done.bind(this));\n\n function done(err, img) {\n delete tile.request;\n\n if (tile.aborted) {\n this.state = 'unloaded';\n return callback(null);\n }\n\n if (err) {\n this.state = 'errored';\n return callback(err);\n }\n\n if (!this.map._refreshExpiredTiles) tile.setExpiryData(img);\n delete img.cacheControl;\n delete img.expires;\n\n const gl = this.map.painter.gl;\n tile.texture = this.map.painter.getTileTexture(img.width);\n if (tile.texture) {\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);\n } else {\n tile.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n tile.texture.size = img.width;\n }\n gl.generateMipmap(gl.TEXTURE_2D);\n\n tile.state = 'loaded';\n\n callback(null);\n }\n }\n\n abortTile(tile) {\n if (tile.request) {\n tile.request.abort();\n delete tile.request;\n }\n }\n\n unloadTile(tile) {\n if (tile.texture) this.map.painter.saveTileTexture(tile.texture);\n }\n}\n\nmodule.exports = RasterTileSource;\n","'use strict';\n\nconst ajax = require('../util/ajax');\nconst Evented = require('../util/evented');\nconst window = require('../util/window');\n\nlet pluginRequested = false;\nlet pluginBlobURL = null;\n\nmodule.exports.evented = new Evented();\n\nmodule.exports.registerForPluginAvailability = function(callback) {\n if (pluginBlobURL) {\n callback(pluginBlobURL, module.exports.errorCallback);\n } else {\n module.exports.evented.once('pluginAvailable', callback);\n }\n return callback;\n};\n\nmodule.exports.setRTLTextPlugin = function(pluginURL, callback) {\n if (pluginRequested) {\n throw new Error('setRTLTextPlugin cannot be called multiple times.');\n }\n pluginRequested = true;\n module.exports.errorCallback = callback;\n ajax.getArrayBuffer(pluginURL, (err, response) => {\n if (err) {\n callback(err);\n } else {\n pluginBlobURL =\n window.URL.createObjectURL(new window.Blob([response.data]), {type: \"text/javascript\"});\n\n module.exports.evented.fire('pluginAvailable', { pluginBlobURL: pluginBlobURL, errorCallback: callback });\n }\n });\n};\n","'use strict';\n\nconst util = require('../util/util');\n\nconst sourceTypes = {\n 'vector': require('../source/vector_tile_source'),\n 'raster': require('../source/raster_tile_source'),\n 'geojson': require('../source/geojson_source'),\n 'video': require('../source/video_source'),\n 'image': require('../source/image_source'),\n 'canvas': require('../source/canvas_source')\n};\n\n/*\n * Creates a tiled data source instance given an options object.\n *\n * @param {string} id\n * @param {Object} source A source definition object compliant with [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, with that type's requirements.\n * @param {string} options.type A source type like `raster`, `vector`, `video`, etc.\n * @param {Dispatcher} dispatcher\n * @returns {Source}\n */\nexports.create = function(id, source, dispatcher, eventedParent) {\n source = new sourceTypes[source.type](id, source, dispatcher, eventedParent);\n\n if (source.id !== id) {\n throw new Error(`Expected Source id to be ${id} instead of ${source.id}`);\n }\n\n util.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source);\n return source;\n};\n\nexports.getType = function (name) {\n return sourceTypes[name];\n};\n\nexports.setType = function (name, type) {\n sourceTypes[name] = type;\n};\n\n/**\n * The `Source` interface must be implemented by each source type, including \"core\" types (`vector`, `raster`, `video`, etc.) and all custom, third-party types.\n *\n * @class Source\n * @private\n *\n * @param {string} id The id for the source. Must not be used by any existing source.\n * @param {Object} options Source options, specific to the source type (except for `options.type`, which is always required).\n * @param {string} options.type The source type, matching the value of `name` used in {@link Style#addSourceType}.\n * @param {Dispatcher} dispatcher A {@link Dispatcher} instance, which can be used to send messages to the workers.\n *\n * @fires data with `{dataType: 'source', sourceDataType: 'metadata'}` to indicate that any necessary metadata\n * has been loaded so that it's okay to call `loadTile`; and with `{dataType: 'source', sourceDataType: 'content'}`\n * to indicate that the source data has changed, so that any current caches should be flushed.\n * @property {string} id The id for the source. Must match the id passed to the constructor.\n * @property {number} minzoom\n * @property {number} maxzoom\n * @property {boolean} isTileClipped `false` if tiles can be drawn outside their boundaries, `true` if they cannot.\n * @property {boolean} reparseOverscaled `true` if tiles should be sent back to the worker for each overzoomed zoom level, `false` if not.\n * @property {boolean} roundZoom `true` if zoom levels are rounded to the nearest integer in the source data, `false` if they are floor-ed to the nearest integer.\n */\n\n/**\n * An optional URL to a script which, when run by a Worker, registers a {@link WorkerSource} implementation for this Source type by calling `self.registerWorkerSource(workerSource: WorkerSource)`.\n *\n * @member {URL|undefined} workerSourceURL\n * @memberof Source\n * @static\n */\n\n/**\n * @method\n * @name loadTile\n * @param {Tile} tile\n * @param {Funtion} callback Called when tile has been loaded\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name abortTile\n * @param {Tile} tile\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name unloadTile\n * @param {Tile} tile\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name serialize\n * @returns {Object} A plain (stringifiable) JS object representing the current state of the source. Creating a source using the returned object as the `options` should result in a Source that is equivalent to this one.\n * @memberof Source\n * @instance\n */\n\n/**\n * @method\n * @name prepare\n * @memberof Source\n * @instance\n */\n\n\n\n/**\n * May be implemented by custom source types to provide code that can be run on\n * the WebWorkers. In addition to providing a custom\n * {@link WorkerSource#loadTile}, any other methods attached to a `WorkerSource`\n * implementation may also be targeted by the {@link Source} via\n * `dispatcher.send('source-type.methodname', params, callback)`.\n *\n * @see {@link Map#addSourceType}\n * @private\n *\n * @class WorkerSource\n * @param {Actor} actor\n * @param {StyleLayerIndex} layerIndex\n */\n\n/**\n * Loads a tile from the given params and parse it into buckets ready to send\n * back to the main thread for rendering. Should call the callback with:\n * `{ buckets, featureIndex, collisionTile, rawTileData}`.\n *\n * @method\n * @name loadTile\n * @param {Object} params Parameters sent by the main-thread Source identifying the tile to load.\n * @param {Function} callback\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Re-parses a tile that has already been loaded. Yields the same data as\n * {@link WorkerSource#loadTile}.\n *\n * @method\n * @name reloadTile\n * @param {Object} params\n * @param {Function} callback\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Aborts loading a tile that is in progress.\n * @method\n * @name abortTile\n * @param {Object} params\n * @memberof WorkerSource\n * @instance\n */\n\n/**\n * Removes this tile from any local caches.\n * @method\n * @name removeTile\n * @memberof WorkerSource\n * @instance\n */\n","'use strict';\n\nconst Source = require('./source');\nconst Tile = require('./tile');\nconst Evented = require('../util/evented');\nconst TileCoord = require('./tile_coord');\nconst Cache = require('../util/lru_cache');\nconst Coordinate = require('../geo/coordinate');\nconst util = require('../util/util');\nconst EXTENT = require('../data/extent');\n\n/**\n * `SourceCache` is responsible for\n *\n * - creating an instance of `Source`\n * - forwarding events from `Source`\n * - caching tiles loaded from an instance of `Source`\n * - loading the tiles needed to render a given viewport\n * - unloading the cached tiles not needed to render a given viewport\n *\n * @private\n */\nclass SourceCache extends Evented {\n\n constructor(id, options, dispatcher) {\n super();\n this.id = id;\n this.dispatcher = dispatcher;\n\n this.on('data', function(e) {\n // this._sourceLoaded signifies that the TileJSON is loaded if applicable.\n // if the source type does not come with a TileJSON, the flag signifies the\n // source data has loaded (i.e geojson has been tiled on the worker and is ready)\n if (e.dataType === 'source' && e.sourceDataType === 'metadata') this._sourceLoaded = true;\n\n // for sources with mutable data, this event fires when the underlying data\n // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates)\n if (this._sourceLoaded && e.dataType === \"source\" && e.sourceDataType === 'content') {\n this.reload();\n if (this.transform) {\n this.update(this.transform);\n }\n }\n });\n\n this.on('error', function() {\n this._sourceErrored = true;\n });\n\n this._source = Source.create(id, options, dispatcher, this);\n\n this._tiles = {};\n this._cache = new Cache(0, this.unloadTile.bind(this));\n this._timers = {};\n this._cacheTimers = {};\n\n this._isIdRenderable = this._isIdRenderable.bind(this);\n }\n\n onAdd(map) {\n this.map = map;\n if (this._source && this._source.onAdd) {\n this._source.onAdd(map);\n }\n }\n\n onRemove(map) {\n if (this._source && this._source.onRemove) {\n this._source.onRemove(map);\n }\n }\n\n /**\n * Return true if no tile data is pending, tiles will not change unless\n * an additional API call is received.\n * @returns {boolean}\n * @private\n */\n loaded() {\n if (this._sourceErrored) { return true; }\n if (!this._sourceLoaded) { return false; }\n for (const t in this._tiles) {\n const tile = this._tiles[t];\n if (tile.state !== 'loaded' && tile.state !== 'errored')\n return false;\n }\n return true;\n }\n\n /**\n * @returns {Source} The underlying source object\n * @private\n */\n getSource() {\n return this._source;\n }\n\n loadTile(tile, callback) {\n return this._source.loadTile(tile, callback);\n }\n\n unloadTile(tile) {\n if (this._source.unloadTile)\n return this._source.unloadTile(tile);\n }\n\n abortTile(tile) {\n if (this._source.abortTile)\n return this._source.abortTile(tile);\n }\n\n serialize() {\n return this._source.serialize();\n }\n\n\n prepare() {\n if (this._sourceLoaded && this._source.prepare)\n return this._source.prepare();\n }\n\n /**\n * Return all tile ids ordered with z-order, and cast to numbers\n * @returns {Array} ids\n * @private\n */\n getIds() {\n return Object.keys(this._tiles).map(Number).sort(compareKeyZoom);\n }\n\n getRenderableIds() {\n return this.getIds().filter(this._isIdRenderable);\n }\n\n _isIdRenderable(id) {\n return this._tiles[id].hasData() && !this._coveredTiles[id];\n }\n\n reload() {\n this._cache.reset();\n for (const i in this._tiles) {\n this.reloadTile(i, 'reloading');\n }\n }\n\n reloadTile(id, state) {\n const tile = this._tiles[id];\n\n // this potentially does not address all underlying\n // issues https://github.com/mapbox/mapbox-gl-js/issues/4252\n // - hard to tell without repro steps\n if (!tile) return;\n\n // The difference between \"loading\" tiles and \"reloading\" or \"expired\"\n // tiles is that \"reloading\"/\"expired\" tiles are \"renderable\".\n // Therefore, a \"loading\" tile cannot become a \"reloading\" tile without\n // first becoming a \"loaded\" tile.\n if (tile.state !== 'loading') {\n tile.state = state;\n }\n\n this.loadTile(tile, this._tileLoaded.bind(this, tile, id, state));\n }\n\n _tileLoaded(tile, id, previousState, err) {\n if (err) {\n tile.state = 'errored';\n this._source.fire('error', {tile: tile, error: err});\n return;\n }\n\n tile.sourceCache = this;\n tile.timeAdded = new Date().getTime();\n if (previousState === 'expired') tile.refreshedUponExpiration = true;\n this._setTileReloadTimer(id, tile);\n this._source.fire('data', {dataType: 'source', tile: tile, coord: tile.coord});\n\n // HACK this is necessary to fix https://github.com/mapbox/mapbox-gl-js/issues/2986\n if (this.map) this.map.painter.tileExtentVAO.vao = null;\n }\n\n /**\n * Get a specific tile by TileCoordinate\n * @param {TileCoordinate} coord\n * @returns {Object} tile\n * @private\n */\n getTile(coord) {\n return this.getTileByID(coord.id);\n }\n\n /**\n * Get a specific tile by id\n * @param {number|string} id\n * @returns {Object} tile\n * @private\n */\n getTileByID(id) {\n return this._tiles[id];\n }\n\n /**\n * get the zoom level adjusted for the difference in map and source tilesizes\n * @param {Object} transform\n * @returns {number} zoom level\n * @private\n */\n getZoom(transform) {\n return transform.zoom + transform.scaleZoom(transform.tileSize / this._source.tileSize);\n }\n\n /**\n * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded;\n * adds found tiles to retain object; returns true if any child is found.\n *\n * @param {Coordinate} coord\n * @param {number} maxCoveringZoom\n * @param {boolean} retain\n * @returns {boolean} whether the operation was complete\n * @private\n */\n findLoadedChildren(coord, maxCoveringZoom, retain) {\n let found = false;\n\n for (const id in this._tiles) {\n let tile = this._tiles[id];\n\n // only consider renderable tiles on higher zoom levels (up to maxCoveringZoom)\n if (retain[id] || !tile.hasData() || tile.coord.z <= coord.z || tile.coord.z > maxCoveringZoom) continue;\n\n // disregard tiles that are not descendants of the given tile coordinate\n const z2 = Math.pow(2, Math.min(tile.coord.z, this._source.maxzoom) - Math.min(coord.z, this._source.maxzoom));\n if (Math.floor(tile.coord.x / z2) !== coord.x ||\n Math.floor(tile.coord.y / z2) !== coord.y)\n continue;\n\n // found loaded child\n retain[id] = true;\n found = true;\n\n // loop through parents; retain the topmost loaded one if found\n while (tile && tile.coord.z - 1 > coord.z) {\n const parentId = tile.coord.parent(this._source.maxzoom).id;\n tile = this._tiles[parentId];\n\n if (tile && tile.hasData()) {\n delete retain[id];\n retain[parentId] = true;\n }\n }\n }\n return found;\n }\n\n /**\n * Find a loaded parent of the given tile (up to minCoveringZoom);\n * adds the found tile to retain object and returns the tile if found\n *\n * @param {Coordinate} coord\n * @param {number} minCoveringZoom\n * @param {boolean} retain\n * @returns {Tile} tile object\n * @private\n */\n findLoadedParent(coord, minCoveringZoom, retain) {\n for (let z = coord.z - 1; z >= minCoveringZoom; z--) {\n coord = coord.parent(this._source.maxzoom);\n const tile = this._tiles[coord.id];\n if (tile && tile.hasData()) {\n retain[coord.id] = true;\n return tile;\n }\n if (this._cache.has(coord.id)) {\n retain[coord.id] = true;\n return this._cache.getWithoutRemoving(coord.id);\n }\n }\n }\n\n /**\n * Resizes the tile cache based on the current viewport's size.\n *\n * Larger viewports use more tiles and need larger caches. Larger viewports\n * are more likely to be found on devices with more memory and on pages where\n * the map is more important.\n *\n * @private\n */\n updateCacheSize(transform) {\n const widthInTiles = Math.ceil(transform.width / transform.tileSize) + 1;\n const heightInTiles = Math.ceil(transform.height / transform.tileSize) + 1;\n const approxTilesInView = widthInTiles * heightInTiles;\n const commonZoomRange = 5;\n this._cache.setMaxSize(Math.floor(approxTilesInView * commonZoomRange));\n }\n\n /**\n * Removes tiles that are outside the viewport and adds new tiles that\n * are inside the viewport.\n * @private\n */\n update(transform) {\n this.transform = transform;\n if (!this._sourceLoaded) { return; }\n let i;\n let coord;\n let tile;\n let parentTile;\n\n this.updateCacheSize(transform);\n\n // Determine the overzooming/underzooming amounts.\n const zoom = (this._source.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n const minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom);\n const maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom);\n\n // Retain is a list of tiles that we shouldn't delete, even if they are not\n // the most ideal tile for the current viewport. This may include tiles like\n // parent or child tiles that are *already* loaded.\n const retain = {};\n\n // Covered is a list of retained tiles who's areas are full covered by other,\n // better, retained tiles. They are not drawn separately.\n this._coveredTiles = {};\n\n let visibleCoords;\n if (!this.used) {\n visibleCoords = [];\n } else if (this._source.coord) {\n visibleCoords = [this._source.coord];\n } else {\n visibleCoords = transform.coveringTiles({\n tileSize: this._source.tileSize,\n minzoom: this._source.minzoom,\n maxzoom: this._source.maxzoom,\n roundZoom: this._source.roundZoom,\n reparseOverscaled: this._source.reparseOverscaled\n });\n }\n\n for (i = 0; i < visibleCoords.length; i++) {\n coord = visibleCoords[i];\n tile = this.addTile(coord);\n\n retain[coord.id] = true;\n\n if (tile.hasData())\n continue;\n\n // The tile we require is not yet loaded.\n // Retain child or parent tiles that cover the same area.\n if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n parentTile = this.findLoadedParent(coord, minCoveringZoom, retain);\n if (parentTile) {\n this.addTile(parentTile.coord);\n }\n }\n }\n\n const parentsForFading = {};\n\n if (isRasterType(this._source.type)) {\n const ids = Object.keys(retain);\n for (let k = 0; k < ids.length; k++) {\n const id = ids[k];\n coord = TileCoord.fromID(id);\n tile = this._tiles[id];\n if (!tile) continue;\n\n // If the drawRasterTile has never seen this tile, then\n // tile.fadeEndTime may be unset. In that case, or if\n // fadeEndTime is in the future, then this tile is still\n // fading in. Find tiles to cross-fade with it.\n if (typeof tile.fadeEndTime === 'undefined' || tile.fadeEndTime >= Date.now()) {\n if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n retain[id] = true;\n }\n parentTile = this.findLoadedParent(coord, minCoveringZoom, parentsForFading);\n if (parentTile) {\n this.addTile(parentTile.coord);\n }\n }\n }\n }\n\n let fadedParent;\n for (fadedParent in parentsForFading) {\n if (!retain[fadedParent]) {\n // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own.\n this._coveredTiles[fadedParent] = true;\n }\n }\n for (fadedParent in parentsForFading) {\n retain[fadedParent] = true;\n }\n\n // Remove the tiles we don't need anymore.\n const remove = util.keysDifference(this._tiles, retain);\n for (i = 0; i < remove.length; i++) {\n this.removeTile(+remove[i]);\n }\n }\n\n /**\n * Add a tile, given its coordinate, to the pyramid.\n * @param {Coordinate} coord\n * @returns {Coordinate} the coordinate.\n * @private\n */\n addTile(coord) {\n let tile = this._tiles[coord.id];\n if (tile)\n return tile;\n\n const wrapped = coord.wrapped();\n tile = this._tiles[wrapped.id];\n\n if (!tile) {\n tile = this._cache.get(wrapped.id);\n if (tile) {\n tile.redoPlacement(this._source);\n if (this._cacheTimers[wrapped.id]) {\n clearTimeout(this._cacheTimers[wrapped.id]);\n this._cacheTimers[wrapped.id] = undefined;\n this._setTileReloadTimer(wrapped.id, tile);\n }\n }\n }\n const cached = Boolean(tile);\n if (!cached) {\n const zoom = coord.z;\n const overscaling = zoom > this._source.maxzoom ? Math.pow(2, zoom - this._source.maxzoom) : 1;\n tile = new Tile(wrapped, this._source.tileSize * overscaling, this._source.maxzoom);\n this.loadTile(tile, this._tileLoaded.bind(this, tile, coord.id, tile.state));\n }\n\n tile.uses++;\n this._tiles[coord.id] = tile;\n if (!cached) this._source.fire('dataloading', {tile: tile, coord: tile.coord, dataType: 'source'});\n\n return tile;\n }\n\n _setTileReloadTimer(id, tile) {\n const expiryTimeout = tile.getExpiryTimeout();\n if (expiryTimeout) {\n this._timers[id] = setTimeout(() => {\n this.reloadTile(id, 'expired');\n this._timers[id] = undefined;\n }, expiryTimeout);\n }\n }\n\n _setCacheInvalidationTimer(id, tile) {\n const expiryTimeout = tile.getExpiryTimeout();\n if (expiryTimeout) {\n this._cacheTimers[id] = setTimeout(() => {\n this._cache.remove(id);\n this._cacheTimers[id] = undefined;\n }, expiryTimeout);\n }\n }\n\n /**\n * Remove a tile, given its id, from the pyramid\n * @param {string|number} id tile id\n * @returns {undefined} nothing\n * @private\n */\n removeTile(id) {\n const tile = this._tiles[id];\n if (!tile)\n return;\n\n tile.uses--;\n delete this._tiles[id];\n if (this._timers[id]) {\n clearTimeout(this._timers[id]);\n this._timers[id] = undefined;\n }\n\n if (tile.uses > 0)\n return;\n\n if (tile.hasData()) {\n const wrappedId = tile.coord.wrapped().id;\n this._cache.add(wrappedId, tile);\n this._setCacheInvalidationTimer(wrappedId, tile);\n } else {\n tile.aborted = true;\n this.abortTile(tile);\n this.unloadTile(tile);\n }\n }\n\n /**\n * Remove all tiles from this pyramid\n * @private\n */\n clearTiles() {\n for (const id in this._tiles)\n this.removeTile(id);\n this._cache.reset();\n }\n\n /**\n * Search through our current tiles and attempt to find the tiles that\n * cover the given bounds.\n * @param {Array} queryGeometry coordinates of the corners of bounding rectangle\n * @returns {Array} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile.\n * @private\n */\n tilesIn(queryGeometry) {\n const tileResults = {};\n const ids = this.getIds();\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n const z = queryGeometry[0].zoom;\n\n for (let k = 0; k < queryGeometry.length; k++) {\n const p = queryGeometry[k];\n minX = Math.min(minX, p.column);\n minY = Math.min(minY, p.row);\n maxX = Math.max(maxX, p.column);\n maxY = Math.max(maxY, p.row);\n }\n\n for (let i = 0; i < ids.length; i++) {\n const tile = this._tiles[ids[i]];\n const coord = TileCoord.fromID(ids[i]);\n\n const tileSpaceBounds = [\n coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(minX, minY, z)),\n coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(maxX, maxY, z))\n ];\n\n if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT &&\n tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) {\n\n const tileSpaceQueryGeometry = [];\n for (let j = 0; j < queryGeometry.length; j++) {\n tileSpaceQueryGeometry.push(coordinateToTilePoint(coord, tile.sourceMaxZoom, queryGeometry[j]));\n }\n\n let tileResult = tileResults[tile.coord.id];\n if (tileResult === undefined) {\n tileResult = tileResults[tile.coord.id] = {\n tile: tile,\n coord: coord,\n queryGeometry: [],\n scale: Math.pow(2, this.transform.zoom - tile.coord.z)\n };\n }\n\n // Wrapped tiles share one tileResult object but can have multiple queryGeometry parts\n tileResult.queryGeometry.push(tileSpaceQueryGeometry);\n }\n }\n\n const results = [];\n for (const t in tileResults) {\n results.push(tileResults[t]);\n }\n return results;\n }\n\n redoPlacement() {\n const ids = this.getIds();\n for (let i = 0; i < ids.length; i++) {\n const tile = this.getTileByID(ids[i]);\n tile.redoPlacement(this._source);\n }\n }\n\n getVisibleCoordinates() {\n const coords = this.getRenderableIds().map(TileCoord.fromID);\n for (const coord of coords) {\n coord.posMatrix = this.transform.calculatePosMatrix(coord, this._source.maxzoom);\n }\n return coords;\n }\n}\n\nSourceCache.maxOverzooming = 10;\nSourceCache.maxUnderzooming = 3;\n\n/**\n * Convert a coordinate to a point in a tile's coordinate space.\n * @param {Coordinate} tileCoord\n * @param {Coordinate} coord\n * @returns {Object} position\n * @private\n */\nfunction coordinateToTilePoint(tileCoord, sourceMaxZoom, coord) {\n const zoomedCoord = coord.zoomTo(Math.min(tileCoord.z, sourceMaxZoom));\n return {\n x: (zoomedCoord.column - (tileCoord.x + tileCoord.w * Math.pow(2, tileCoord.z))) * EXTENT,\n y: (zoomedCoord.row - tileCoord.y) * EXTENT\n };\n\n}\n\nfunction compareKeyZoom(a, b) {\n return (a % 32) - (b % 32);\n}\n\nfunction isRasterType(type) {\n return type === 'raster' || type === 'image' || type === 'video';\n}\n\nmodule.exports = SourceCache;\n","'use strict';\n\nconst util = require('../util/util');\nconst Bucket = require('../data/bucket');\nconst FeatureIndex = require('../data/feature_index');\nconst vt = require('vector-tile');\nconst Protobuf = require('pbf');\nconst GeoJSONFeature = require('../util/vectortile_to_geojson');\nconst featureFilter = require('../style-spec/feature_filter');\nconst CollisionTile = require('../symbol/collision_tile');\nconst CollisionBoxArray = require('../symbol/collision_box');\n\nconst CLOCK_SKEW_RETRY_TIMEOUT = 30000;\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @private\n */\nclass Tile {\n /**\n * @param {Coordinate} coord\n * @param {number} size\n */\n constructor(coord, size, sourceMaxZoom) {\n this.coord = coord;\n this.uid = util.uniqueId();\n this.uses = 0;\n this.tileSize = size;\n this.sourceMaxZoom = sourceMaxZoom;\n this.buckets = {};\n this.expirationTime = null;\n\n // Counts the number of times a response was already expired when\n // received. We're using this to add a delay when making a new request\n // so we don't have to keep retrying immediately in case of a server\n // serving expired tiles.\n this.expiredRequestCount = 0;\n\n // `this.state` must be one of\n //\n // - `loading`: Tile data is in the process of loading.\n // - `loaded`: Tile data has been loaded. Tile can be rendered.\n // - `reloading`: Tile data has been loaded and is being updated. Tile can be rendered.\n // - `unloaded`: Tile data has been deleted.\n // - `errored`: Tile data was not loaded because of an error.\n // - `expired`: Tile data was previously loaded, but has expired per its HTTP headers and is in the process of refreshing.\n this.state = 'loading';\n }\n\n registerFadeDuration(animationLoop, duration) {\n const fadeEndTime = duration + this.timeAdded;\n if (fadeEndTime < Date.now()) return;\n if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return;\n\n this.fadeEndTime = fadeEndTime;\n animationLoop.set(this.fadeEndTime - Date.now());\n }\n\n /**\n * Given a data object with a 'buffers' property, load it into\n * this tile's elementGroups and buffers properties and set loaded\n * to true. If the data is null, like in the case of an empty\n * GeoJSON tile, no-op but still set loaded to true.\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n loadVectorData(data, painter) {\n if (this.hasData()) {\n this.unloadVectorData();\n }\n\n this.state = 'loaded';\n\n // empty GeoJSON tile\n if (!data) return;\n\n // If we are redoing placement for the same tile, we will not recieve\n // a new \"rawTileData\" object. If we are loading a new tile, we will\n // recieve a new \"rawTileData\" object.\n if (data.rawTileData) {\n this.rawTileData = data.rawTileData;\n }\n\n this.collisionBoxArray = new CollisionBoxArray(data.collisionBoxArray);\n this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n this.featureIndex = new FeatureIndex(data.featureIndex, this.rawTileData, this.collisionTile);\n this.buckets = Bucket.deserialize(data.buckets, painter.style);\n }\n\n /**\n * Replace this tile's symbol buckets with fresh data.\n * @param {Object} data\n * @param {Style} style\n * @returns {undefined}\n * @private\n */\n reloadSymbolData(data, style) {\n if (this.state === 'unloaded') return;\n\n this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray);\n this.featureIndex.setCollisionTile(this.collisionTile);\n\n for (const id in this.buckets) {\n const bucket = this.buckets[id];\n if (bucket.layers[0].type === 'symbol') {\n bucket.destroy();\n delete this.buckets[id];\n }\n }\n\n // Add new symbol buckets\n util.extend(this.buckets, Bucket.deserialize(data.buckets, style));\n }\n\n /**\n * Release any data or WebGL resources referenced by this tile.\n * @returns {undefined}\n * @private\n */\n unloadVectorData() {\n for (const id in this.buckets) {\n this.buckets[id].destroy();\n }\n this.buckets = {};\n\n this.collisionBoxArray = null;\n this.collisionTile = null;\n this.featureIndex = null;\n this.state = 'unloaded';\n }\n\n redoPlacement(source) {\n if (source.type !== 'vector' && source.type !== 'geojson') {\n return;\n }\n if (this.state !== 'loaded') {\n this.redoWhenDone = true;\n return;\n }\n if (!this.collisionTile) { // empty tile\n return;\n }\n\n this.state = 'reloading';\n\n source.dispatcher.send('redoPlacement', {\n type: source.type,\n uid: this.uid,\n source: source.id,\n angle: source.map.transform.angle,\n pitch: source.map.transform.pitch,\n showCollisionBoxes: source.map.showCollisionBoxes\n }, (_, data) => {\n this.reloadSymbolData(data, source.map.style);\n\n // HACK this is nescessary to fix https://github.com/mapbox/mapbox-gl-js/issues/2986\n if (source.map) source.map.painter.tileExtentVAO.vao = null;\n\n this.state = 'loaded';\n\n if (this.redoWhenDone) {\n this.redoWhenDone = false;\n this.redoPlacement(source);\n }\n }, this.workerID);\n }\n\n getBucket(layer) {\n return this.buckets[layer.id];\n }\n\n querySourceFeatures(result, params) {\n if (!this.rawTileData) return;\n\n if (!this.vtLayers) {\n this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers;\n }\n\n const layer = this.vtLayers._geojsonTileLayer || this.vtLayers[params.sourceLayer];\n\n if (!layer) return;\n\n const filter = featureFilter(params && params.filter);\n const coord = { z: this.coord.z, x: this.coord.x, y: this.coord.y };\n\n for (let i = 0; i < layer.length; i++) {\n const feature = layer.feature(i);\n if (filter(feature)) {\n const geojsonFeature = new GeoJSONFeature(feature, this.coord.z, this.coord.x, this.coord.y);\n geojsonFeature.tile = coord;\n result.push(geojsonFeature);\n }\n }\n }\n\n hasData() {\n return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired';\n }\n\n setExpiryData(data) {\n const prior = this.expirationTime;\n\n if (data.cacheControl) {\n const parsedCC = util.parseCacheControl(data.cacheControl);\n if (parsedCC['max-age']) this.expirationTime = Date.now() + parsedCC['max-age'] * 1000;\n } else if (data.expires) {\n this.expirationTime = new Date(data.expires).getTime();\n }\n\n if (this.expirationTime) {\n const now = Date.now();\n let isExpired = false;\n\n if (this.expirationTime > now) {\n isExpired = false;\n } else if (!prior) {\n isExpired = true;\n } else if (this.expirationTime < prior) {\n // Expiring date is going backwards:\n // fall back to exponential backoff\n isExpired = true;\n\n } else {\n const delta = this.expirationTime - prior;\n\n if (!delta) {\n // Server is serving the same expired resource over and over: fall\n // back to exponential backoff.\n isExpired = true;\n\n } else {\n // Assume that either the client or the server clock is wrong and\n // try to interpolate a valid expiration date (from the client POV)\n // observing a minimum timeout.\n this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT);\n\n }\n }\n\n if (isExpired) {\n this.expiredRequestCount++;\n this.state = 'expired';\n } else {\n this.expiredRequestCount = 0;\n }\n }\n }\n\n getExpiryTimeout() {\n if (this.expirationTime) {\n if (this.expiredRequestCount) {\n return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31));\n } else {\n // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly\n return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1);\n }\n }\n }\n}\n\nmodule.exports = Tile;\n","'use strict';\n\nconst assert = require('assert');\nconst WhooTS = require('@mapbox/whoots-js');\nconst Coordinate = require('../geo/coordinate');\n\nclass TileCoord {\n constructor(z, x, y, w) {\n assert(!isNaN(z) && z >= 0 && z % 1 === 0);\n assert(!isNaN(x) && x >= 0 && x % 1 === 0);\n assert(!isNaN(y) && y >= 0 && y % 1 === 0);\n\n if (isNaN(w)) w = 0;\n\n this.z = +z;\n this.x = +x;\n this.y = +y;\n this.w = +w;\n\n // calculate id\n w *= 2;\n if (w < 0) w = w * -1 - 1;\n const dim = 1 << this.z;\n this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z;\n\n // for caching pos matrix calculation when rendering\n this.posMatrix = null;\n }\n\n toString() {\n return `${this.z}/${this.x}/${this.y}`;\n }\n\n toCoordinate(sourceMaxZoom) {\n const zoom = Math.min(this.z, sourceMaxZoom === undefined ? this.z : sourceMaxZoom);\n const tileScale = Math.pow(2, zoom);\n const row = this.y;\n const column = this.x + tileScale * this.w;\n return new Coordinate(column, row, zoom);\n }\n\n // given a list of urls, choose a url template and return a tile URL\n url(urls, sourceMaxZoom, scheme) {\n const bbox = WhooTS.getTileBBox(this.x, this.y, this.z);\n const quadkey = getQuadkey(this.z, this.x, this.y);\n\n return urls[(this.x + this.y) % urls.length]\n .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z))\n .replace('{x}', this.x)\n .replace('{y}', scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)\n .replace('{quadkey}', quadkey)\n .replace('{bbox-epsg-3857}', bbox);\n }\n\n // Return the coordinate of the parent tile\n parent(sourceMaxZoom) {\n if (this.z === 0) return null;\n\n // the id represents an overscaled tile, return the same coordinates with a lower z\n if (this.z > sourceMaxZoom) {\n return new TileCoord(this.z - 1, this.x, this.y, this.w);\n }\n\n return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w);\n }\n\n wrapped() {\n return new TileCoord(this.z, this.x, this.y, 0);\n }\n\n // Return the coordinates of the tile's children\n children(sourceMaxZoom) {\n\n if (this.z >= sourceMaxZoom) {\n // return a single tile coord representing a an overscaled tile\n return [new TileCoord(this.z + 1, this.x, this.y, this.w)];\n }\n\n const z = this.z + 1;\n const x = this.x * 2;\n const y = this.y * 2;\n return [\n new TileCoord(z, x, y, this.w),\n new TileCoord(z, x + 1, y, this.w),\n new TileCoord(z, x, y + 1, this.w),\n new TileCoord(z, x + 1, y + 1, this.w)\n ];\n }\n}\n\n// Taken from polymaps src/Layer.js\n// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383\n\nfunction edge(a, b) {\n if (a.row > b.row) { const t = a; a = b; b = t; }\n return {\n x0: a.column,\n y0: a.row,\n x1: b.column,\n y1: b.row,\n dx: b.column - a.column,\n dy: b.row - a.row\n };\n}\n\nfunction scanSpans(e0, e1, ymin, ymax, scanLine) {\n const y0 = Math.max(ymin, Math.floor(e1.y0));\n const y1 = Math.min(ymax, Math.ceil(e1.y1));\n\n // sort edges by x-coordinate\n if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ?\n (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) :\n (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) {\n const t = e0; e0 = e1; e1 = t;\n }\n\n // scan lines!\n const m0 = e0.dx / e0.dy;\n const m1 = e1.dx / e1.dy;\n const d0 = e0.dx > 0; // use y + 1 to compute x0\n const d1 = e1.dx < 0; // use y + 1 to compute x1\n for (let y = y0; y < y1; y++) {\n const x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0;\n const x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0;\n scanLine(Math.floor(x1), Math.ceil(x0), y);\n }\n}\n\nfunction scanTriangle(a, b, c, ymin, ymax, scanLine) {\n let ab = edge(a, b),\n bc = edge(b, c),\n ca = edge(c, a);\n\n let t;\n\n // sort edges by y-length\n if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; }\n if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; }\n if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; }\n\n // scan span! scan span!\n if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine);\n if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine);\n}\n\nTileCoord.cover = function(z, bounds, actualZ, renderWorldCopies) {\n if (renderWorldCopies === undefined) {\n renderWorldCopies = true;\n }\n const tiles = 1 << z;\n const t = {};\n\n function scanLine(x0, x1, y) {\n let x, w, wx, coord;\n if (y >= 0 && y <= tiles) {\n for (x = x0; x < x1; x++) {\n w = Math.floor(x / tiles);\n wx = (x % tiles + tiles) % tiles;\n if (w === 0 || renderWorldCopies === true) {\n coord = new TileCoord(actualZ, wx, y, w);\n t[coord.id] = coord;\n }\n }\n }\n }\n\n // Divide the screen up in two triangles and scan each of them:\n // +---/\n // | / |\n // /---+\n scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine);\n scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine);\n\n return Object.keys(t).map((id) => {\n return t[id];\n });\n};\n\n// Parse a packed integer id into a TileCoord object\nTileCoord.fromID = function(id) {\n const z = id % 32, dim = 1 << z;\n const xy = ((id - z) / 32);\n const x = xy % dim, y = ((xy - x) / dim) % dim;\n let w = Math.floor(xy / (dim * dim));\n if (w % 2 !== 0) w = w * -1 - 1;\n w /= 2;\n return new TileCoord(z, x, y, w);\n};\n\nfunction getQuadkey(z, x, y) {\n let quadkey = '', mask;\n for (let i = z; i > 0; i--) {\n mask = 1 << (i - 1);\n quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0));\n }\n return quadkey;\n}\n\nmodule.exports = TileCoord;\n","'use strict';\n\nconst Evented = require('../util/evented');\nconst util = require('../util/util');\nconst loadTileJSON = require('./load_tilejson');\nconst normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nclass VectorTileSource extends Evented {\n\n constructor(id, options, dispatcher, eventedParent) {\n super();\n this.id = id;\n this.dispatcher = dispatcher;\n\n this.type = 'vector';\n this.minzoom = 0;\n this.maxzoom = 22;\n this.scheme = 'xyz';\n this.tileSize = 512;\n this.reparseOverscaled = true;\n this.isTileClipped = true;\n util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize']));\n\n this._options = util.extend({ type: 'vector' }, options);\n\n if (this.tileSize !== 512) {\n throw new Error('vector tile sources must have a tileSize of 512');\n }\n\n this.setEventedParent(eventedParent);\n }\n\n load() {\n this.fire('dataloading', {dataType: 'source'});\n\n loadTileJSON(this._options, (err, tileJSON) => {\n if (err) {\n this.fire('error', err);\n return;\n }\n util.extend(this, tileJSON);\n // `content` is included here to prevent a race condition where `Style#_updateSources` is called\n // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives\n // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088\n this.fire('data', {dataType: 'source', sourceDataType: 'metadata'});\n this.fire('data', {dataType: 'source', sourceDataType: 'content'});\n\n });\n }\n\n onAdd(map) {\n this.load();\n this.map = map;\n }\n\n serialize() {\n return util.extend({}, this._options);\n }\n\n loadTile(tile, callback) {\n const overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n const params = {\n url: normalizeURL(tile.coord.url(this.tiles, this.maxzoom, this.scheme), this.url),\n uid: tile.uid,\n coord: tile.coord,\n zoom: tile.coord.z,\n tileSize: this.tileSize * overscaling,\n type: this.type,\n source: this.id,\n overscaling: overscaling,\n angle: this.map.transform.angle,\n pitch: this.map.transform.pitch,\n showCollisionBoxes: this.map.showCollisionBoxes\n };\n\n if (!tile.workerID || tile.state === 'expired') {\n tile.workerID = this.dispatcher.send('loadTile', params, done.bind(this));\n } else if (tile.state === 'loading') {\n // schedule tile reloading after it has been loaded\n tile.reloadCallback = callback;\n } else {\n this.dispatcher.send('reloadTile', params, done.bind(this), tile.workerID);\n }\n\n function done(err, data) {\n if (tile.aborted)\n return;\n\n if (err) {\n return callback(err);\n }\n\n if (!this.map._refreshExpiredTiles) tile.setExpiryData(data);\n tile.loadVectorData(data, this.map.painter);\n\n if (tile.redoWhenDone) {\n tile.redoWhenDone = false;\n tile.redoPlacement(this);\n }\n\n callback(null);\n\n if (tile.reloadCallback) {\n this.loadTile(tile, tile.reloadCallback);\n tile.reloadCallback = null;\n }\n }\n }\n\n abortTile(tile) {\n this.dispatcher.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, null, tile.workerID);\n }\n\n unloadTile(tile) {\n tile.unloadVectorData();\n this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, null, tile.workerID);\n }\n}\n\nmodule.exports = VectorTileSource;\n","'use strict';\nconst ajax = require('../util/ajax');\nconst vt = require('vector-tile');\nconst Protobuf = require('pbf');\nconst WorkerTile = require('./worker_tile');\nconst util = require('../util/util');\n\n/**\n * The {@link WorkerSource} implementation that supports {@link VectorTileSource}.\n * This class is designed to be easily reused to support custom source types\n * for data formats that can be parsed/converted into an in-memory VectorTile\n * representation. To do so, create it with\n * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`.\n *\n * @private\n */\nclass VectorTileWorkerSource {\n /**\n * @param {Function} [loadVectorData] Optional method for custom loading of a VectorTile object based on parameters passed from the main-thread Source. See {@link VectorTileWorkerSource#loadTile}. The default implementation simply loads the pbf at `params.url`.\n */\n constructor(actor, layerIndex, loadVectorData) {\n this.actor = actor;\n this.layerIndex = layerIndex;\n\n if (loadVectorData) { this.loadVectorData = loadVectorData; }\n\n this.loading = {};\n this.loaded = {};\n }\n\n /**\n * Implements {@link WorkerSource#loadTile}. Delegates to {@link VectorTileWorkerSource#loadVectorData} (which by default expects a `params.url` property) for fetching and producing a VectorTile object.\n *\n * @param {Object} params\n * @param {string} params.source The id of the source for which we're loading this tile.\n * @param {string} params.uid The UID for this tile.\n * @param {TileCoord} params.coord\n * @param {number} params.zoom\n * @param {number} params.overscaling\n * @param {number} params.angle\n * @param {number} params.pitch\n * @param {boolean} params.showCollisionBoxes\n */\n loadTile(params, callback) {\n const source = params.source,\n uid = params.uid;\n\n if (!this.loading[source])\n this.loading[source] = {};\n\n const workerTile = this.loading[source][uid] = new WorkerTile(params);\n workerTile.abort = this.loadVectorData(params, done.bind(this));\n\n function done(err, vectorTile) {\n delete this.loading[source][uid];\n\n if (err) return callback(err);\n if (!vectorTile) return callback(null, null);\n\n workerTile.vectorTile = vectorTile;\n workerTile.parse(vectorTile, this.layerIndex, this.actor, (err, result, transferrables) => {\n if (err) return callback(err);\n\n const cacheControl = {};\n if (vectorTile.expires) cacheControl.expires = vectorTile.expires;\n if (vectorTile.cacheControl) cacheControl.cacheControl = vectorTile.cacheControl;\n\n // Not transferring rawTileData because the worker needs to retain its copy.\n callback(null,\n util.extend({rawTileData: vectorTile.rawData}, result, cacheControl),\n transferrables);\n });\n\n this.loaded[source] = this.loaded[source] || {};\n this.loaded[source][uid] = workerTile;\n }\n }\n\n /**\n * Implements {@link WorkerSource#reloadTile}.\n *\n * @param {Object} params\n * @param {string} params.source The id of the source for which we're loading this tile.\n * @param {string} params.uid The UID for this tile.\n */\n reloadTile(params, callback) {\n const loaded = this.loaded[params.source],\n uid = params.uid,\n vtSource = this;\n if (loaded && loaded[uid]) {\n const workerTile = loaded[uid];\n\n if (workerTile.status === 'parsing') {\n workerTile.reloadCallback = callback;\n } else if (workerTile.status === 'done') {\n workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done.bind(workerTile));\n }\n\n }\n\n function done(err, data) {\n if (this.reloadCallback) {\n const reloadCallback = this.reloadCallback;\n delete this.reloadCallback;\n this.parse(this.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback);\n }\n\n callback(err, data);\n }\n }\n\n /**\n * Implements {@link WorkerSource#abortTile}.\n *\n * @param {Object} params\n * @param {string} params.source The id of the source for which we're loading this tile.\n * @param {string} params.uid The UID for this tile.\n */\n abortTile(params) {\n const loading = this.loading[params.source],\n uid = params.uid;\n if (loading && loading[uid] && loading[uid].abort) {\n loading[uid].abort();\n delete loading[uid];\n }\n }\n\n /**\n * Implements {@link WorkerSource#removeTile}.\n *\n * @param {Object} params\n * @param {string} params.source The id of the source for which we're loading this tile.\n * @param {string} params.uid The UID for this tile.\n */\n removeTile(params) {\n const loaded = this.loaded[params.source],\n uid = params.uid;\n if (loaded && loaded[uid]) {\n delete loaded[uid];\n }\n }\n\n /**\n * The result passed to the `loadVectorData` callback must conform to the interface established\n * by the `VectorTile` class from the [vector-tile](https://www.npmjs.com/package/vector-tile)\n * npm package. In addition, it must have a `rawData` property containing an `ArrayBuffer`\n * with protobuf data conforming to the\n * [Mapbox Vector Tile specification](https://github.com/mapbox/vector-tile-spec).\n *\n * @class VectorTile\n * @property {ArrayBuffer} rawData\n * @private\n */\n\n /**\n * @callback LoadVectorDataCallback\n * @param {Error?} error\n * @param {VectorTile?} vectorTile\n * @private\n */\n\n /**\n * @param {Object} params\n * @param {string} params.url The URL of the tile PBF to load.\n * @param {LoadVectorDataCallback} callback\n */\n loadVectorData(params, callback) {\n const xhr = ajax.getArrayBuffer(params.url, done.bind(this));\n return function abort () { xhr.abort(); };\n function done(err, response) {\n if (err) { return callback(err); }\n const vectorTile = new vt.VectorTile(new Protobuf(response.data));\n vectorTile.rawData = response.data;\n vectorTile.cacheControl = response.cacheControl;\n vectorTile.expires = response.expires;\n callback(err, vectorTile);\n }\n }\n\n redoPlacement(params, callback) {\n const loaded = this.loaded[params.source],\n loading = this.loading[params.source],\n uid = params.uid;\n\n if (loaded && loaded[uid]) {\n const workerTile = loaded[uid];\n const result = workerTile.redoPlacement(params.angle, params.pitch, params.showCollisionBoxes);\n\n if (result.result) {\n callback(null, result.result, result.transferables);\n }\n\n } else if (loading && loading[uid]) {\n loading[uid].angle = params.angle;\n }\n }\n}\n\nmodule.exports = VectorTileWorkerSource;\n","'use strict';\n\nconst ajax = require('../util/ajax');\nconst ImageSource = require('./image_source');\n\n/**\n * A data source containing video.\n * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.)\n * @interface VideoSource\n * @example\n * // add to map\n * map.addSource('some id', {\n * type: 'video',\n * url: [\n * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4',\n * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm'\n * ],\n * coordinates: [\n * [-76.54, 39.18],\n * [-76.52, 39.18],\n * [-76.52, 39.17],\n * [-76.54, 39.17]\n * ]\n * });\n *\n * // update\n * var mySource = map.getSource('some id');\n * mySource.setCoordinates([\n * [-76.54335737228394, 39.18579907229748],\n * [-76.52803659439087, 39.1838364847587],\n * [-76.5295386314392, 39.17683392507606],\n * [-76.54520273208618, 39.17876344106642]\n * ]);\n *\n * map.removeSource('some id'); // remove\n * @see [Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/)\n */\nclass VideoSource extends ImageSource {\n\n constructor(id, options, dispatcher, eventedParent) {\n super(id, options, dispatcher, eventedParent);\n this.roundZoom = true;\n this.type = 'video';\n this.options = options;\n }\n\n load() {\n const options = this.options;\n this.urls = options.urls;\n\n ajax.getVideo(options.urls, (err, video) => {\n if (err) return this.fire('error', {error: err});\n\n this.video = video;\n this.video.loop = true;\n\n let loopID;\n\n // start repainting when video starts playing\n this.video.addEventListener('playing', () => {\n loopID = this.map.style.animationLoop.set(Infinity);\n this.map._rerender();\n });\n\n // stop repainting when video stops\n this.video.addEventListener('pause', () => {\n this.map.style.animationLoop.cancel(loopID);\n });\n\n if (this.map) {\n this.video.play();\n }\n\n this._finishLoading();\n });\n }\n\n /**\n * Returns the HTML `video` element.\n *\n * @returns {HTMLVideoElement} The HTML `video` element.\n */\n getVideo() {\n return this.video;\n }\n\n onAdd(map) {\n if (this.map) return;\n this.load();\n this.map = map;\n if (this.video) {\n this.video.play();\n this.setCoordinates(this.coordinates);\n }\n }\n\n /**\n * Sets the video's coordinates and re-renders the map.\n *\n * @method setCoordinates\n * @param {Array>} coordinates Four geographical coordinates,\n * represented as arrays of longitude and latitude numbers, which define the corners of the video.\n * The coordinates start at the top left corner of the video and proceed in clockwise order.\n * They do not have to represent a rectangle.\n * @returns {VideoSource} this\n */\n // setCoordinates inherited from ImageSource\n\n prepare() {\n if (!this.tile || this.video.readyState < 2) return; // not enough data for current position\n this._prepareImage(this.map.painter.gl, this.video);\n }\n\n serialize() {\n return {\n type: 'video',\n urls: this.urls,\n coordinates: this.coordinates\n };\n }\n}\n\nmodule.exports = VideoSource;\n","'use strict';\n\nconst Actor = require('../util/actor');\nconst StyleLayerIndex = require('../style/style_layer_index');\n\nconst VectorTileWorkerSource = require('./vector_tile_worker_source');\nconst GeoJSONWorkerSource = require('./geojson_worker_source');\nconst assert = require('assert');\n\nconst globalRTLTextPlugin = require('./rtl_text_plugin');\n\n/**\n * @private\n */\nclass Worker {\n constructor(self) {\n this.self = self;\n this.actor = new Actor(self, this);\n\n this.layerIndexes = {};\n\n this.workerSourceTypes = {\n vector: VectorTileWorkerSource,\n geojson: GeoJSONWorkerSource\n };\n\n // [mapId][sourceType] => worker source instance\n this.workerSources = {};\n\n this.self.registerWorkerSource = (name, WorkerSource) => {\n if (this.workerSourceTypes[name]) {\n throw new Error(`Worker source with name \"${name}\" already registered.`);\n }\n this.workerSourceTypes[name] = WorkerSource;\n };\n\n this.self.registerRTLTextPlugin = (rtlTextPlugin) => {\n if (globalRTLTextPlugin.applyArabicShaping || globalRTLTextPlugin.processBidirectionalText) {\n throw new Error('RTL text plugin already registered.');\n }\n globalRTLTextPlugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping;\n globalRTLTextPlugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText;\n };\n }\n\n setLayers(mapId, layers) {\n this.getLayerIndex(mapId).replace(layers);\n }\n\n updateLayers(mapId, params) {\n this.getLayerIndex(mapId).update(params.layers, params.removedIds, params.symbolOrder);\n }\n\n loadTile(mapId, params, callback) {\n assert(params.type);\n this.getWorkerSource(mapId, params.type).loadTile(params, callback);\n }\n\n reloadTile(mapId, params, callback) {\n assert(params.type);\n this.getWorkerSource(mapId, params.type).reloadTile(params, callback);\n }\n\n abortTile(mapId, params) {\n assert(params.type);\n this.getWorkerSource(mapId, params.type).abortTile(params);\n }\n\n removeTile(mapId, params) {\n assert(params.type);\n this.getWorkerSource(mapId, params.type).removeTile(params);\n }\n\n removeSource(mapId, params) {\n assert(params.type);\n const worker = this.getWorkerSource(mapId, params.type);\n if (worker.removeSource !== undefined) {\n worker.removeSource(params);\n }\n }\n\n redoPlacement(mapId, params, callback) {\n assert(params.type);\n this.getWorkerSource(mapId, params.type).redoPlacement(params, callback);\n }\n\n /**\n * Load a {@link WorkerSource} script at params.url. The script is run\n * (using importScripts) with `registerWorkerSource` in scope, which is a\n * function taking `(name, workerSourceObject)`.\n * @private\n */\n loadWorkerSource(map, params, callback) {\n try {\n this.self.importScripts(params.url);\n callback();\n } catch (e) {\n callback(e);\n }\n }\n\n loadRTLTextPlugin(map, pluginURL, callback) {\n try {\n if (!globalRTLTextPlugin.applyArabicShaping && !globalRTLTextPlugin.processBidirectionalText) {\n this.self.importScripts(pluginURL);\n }\n } catch (e) {\n callback(e);\n }\n }\n\n getLayerIndex(mapId) {\n let layerIndexes = this.layerIndexes[mapId];\n if (!layerIndexes) {\n layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex();\n }\n return layerIndexes;\n }\n\n getWorkerSource(mapId, type) {\n if (!this.workerSources[mapId])\n this.workerSources[mapId] = {};\n if (!this.workerSources[mapId][type]) {\n // use a wrapped actor so that we can attach a target mapId param\n // to any messages invoked by the WorkerSource\n const actor = {\n send: (type, data, callback, buffers) => {\n this.actor.send(type, data, callback, buffers, mapId);\n }\n };\n\n this.workerSources[mapId][type] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId));\n }\n\n return this.workerSources[mapId][type];\n }\n}\n\nmodule.exports = function createWorker(self) {\n return new Worker(self);\n};\n","'use strict';\n\nconst FeatureIndex = require('../data/feature_index');\nconst CollisionTile = require('../symbol/collision_tile');\nconst CollisionBoxArray = require('../symbol/collision_box');\nconst DictionaryCoder = require('../util/dictionary_coder');\nconst util = require('../util/util');\nconst assert = require('assert');\n\nclass WorkerTile {\n constructor(params) {\n this.coord = params.coord;\n this.uid = params.uid;\n this.zoom = params.zoom;\n this.tileSize = params.tileSize;\n this.source = params.source;\n this.overscaling = params.overscaling;\n this.angle = params.angle;\n this.pitch = params.pitch;\n this.showCollisionBoxes = params.showCollisionBoxes;\n }\n\n parse(data, layerIndex, actor, callback) {\n // Normalize GeoJSON data.\n if (!data.layers) {\n data = { layers: { '_geojsonTileLayer': data } };\n }\n\n this.status = 'parsing';\n this.data = data;\n\n this.collisionBoxArray = new CollisionBoxArray();\n const sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort());\n\n const featureIndex = new FeatureIndex(this.coord, this.overscaling);\n featureIndex.bucketLayerIDs = {};\n\n const buckets = {};\n let bucketIndex = 0;\n\n const options = {\n featureIndex: featureIndex,\n iconDependencies: {},\n glyphDependencies: {}\n };\n\n const layerFamilies = layerIndex.familiesBySource[this.source];\n for (const sourceLayerId in layerFamilies) {\n const sourceLayer = data.layers[sourceLayerId];\n if (!sourceLayer) {\n continue;\n }\n\n if (sourceLayer.version === 1) {\n util.warnOnce(\n `Vector tile source \"${this.source}\" layer \"${\n sourceLayerId}\" does not use vector tile spec v2 ` +\n `and therefore may have some rendering errors.`\n );\n }\n\n const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);\n const features = [];\n for (let i = 0; i < sourceLayer.length; i++) {\n const feature = sourceLayer.feature(i);\n feature.index = i;\n feature.sourceLayerIndex = sourceLayerIndex;\n features.push(feature);\n }\n\n for (const family of layerFamilies[sourceLayerId]) {\n const layer = family[0];\n\n assert(layer.source === this.source);\n\n if (layer.minzoom && this.zoom < layer.minzoom) continue;\n if (layer.maxzoom && this.zoom >= layer.maxzoom) continue;\n if (layer.layout && layer.layout.visibility === 'none') continue;\n\n for (const layer of family) {\n layer.recalculate(this.zoom);\n }\n\n const bucket = buckets[layer.id] = layer.createBucket({\n index: bucketIndex,\n layers: family,\n zoom: this.zoom,\n overscaling: this.overscaling,\n collisionBoxArray: this.collisionBoxArray\n });\n\n bucket.populate(features, options);\n featureIndex.bucketLayerIDs[bucketIndex] = family.map((l) => l.id);\n\n bucketIndex++;\n }\n }\n\n\n const done = (collisionTile) => {\n this.status = 'done';\n\n // collect data-driven paint property statistics from each bucket\n featureIndex.paintPropertyStatistics = {};\n for (const id in buckets) {\n util.extend(featureIndex.paintPropertyStatistics, buckets[id].getPaintPropertyStatistics());\n }\n\n const transferables = [];\n\n callback(null, {\n buckets: serializeBuckets(util.values(buckets), transferables),\n featureIndex: featureIndex.serialize(transferables),\n collisionTile: collisionTile.serialize(transferables),\n collisionBoxArray: this.collisionBoxArray.serialize()\n }, transferables);\n };\n\n // Symbol buckets must be placed in reverse order.\n this.symbolBuckets = [];\n for (let i = layerIndex.symbolOrder.length - 1; i >= 0; i--) {\n const bucket = buckets[layerIndex.symbolOrder[i]];\n if (bucket) {\n this.symbolBuckets.push(bucket);\n }\n }\n\n if (this.symbolBuckets.length === 0) {\n return done(new CollisionTile(this.angle, this.pitch, this.collisionBoxArray));\n }\n\n let deps = 0;\n let icons = Object.keys(options.iconDependencies);\n let stacks = util.mapObject(options.glyphDependencies, (glyphs) => Object.keys(glyphs).map(Number));\n\n const gotDependency = (err) => {\n if (err) return callback(err);\n deps++;\n if (deps === 2) {\n const collisionTile = new CollisionTile(this.angle, this.pitch, this.collisionBoxArray);\n\n for (const bucket of this.symbolBuckets) {\n recalculateLayers(bucket, this.zoom);\n\n bucket.prepare(stacks, icons);\n bucket.place(collisionTile, this.showCollisionBoxes);\n }\n\n done(collisionTile);\n }\n };\n\n if (Object.keys(stacks).length) {\n actor.send('getGlyphs', {uid: this.uid, stacks: stacks}, (err, newStacks) => {\n stacks = newStacks;\n gotDependency(err);\n });\n } else {\n gotDependency();\n }\n\n if (icons.length) {\n actor.send('getIcons', {icons: icons}, (err, newIcons) => {\n icons = newIcons;\n gotDependency(err);\n });\n } else {\n gotDependency();\n }\n }\n\n redoPlacement(angle, pitch, showCollisionBoxes) {\n this.angle = angle;\n this.pitch = pitch;\n\n if (this.status !== 'done') {\n return {};\n }\n\n const collisionTile = new CollisionTile(this.angle, this.pitch, this.collisionBoxArray);\n\n for (const bucket of this.symbolBuckets) {\n recalculateLayers(bucket, this.zoom);\n\n bucket.place(collisionTile, showCollisionBoxes);\n }\n\n const transferables = [];\n return {\n result: {\n buckets: serializeBuckets(this.symbolBuckets, transferables),\n collisionTile: collisionTile.serialize(transferables)\n },\n transferables: transferables\n };\n }\n}\n\nfunction recalculateLayers(bucket, zoom) {\n // Layers are shared and may have been used by a WorkerTile with a different zoom.\n for (const layer of bucket.layers) {\n layer.recalculate(zoom);\n }\n}\n\nfunction serializeBuckets(buckets, transferables) {\n return buckets\n .filter((b) => !b.isEmpty())\n .map((b) => b.serialize(transferables));\n}\n\nmodule.exports = WorkerTile;\n","'use strict';\n\nconst refProperties = require('./util/ref_properties');\n\nfunction deref(layer, parent) {\n const result = {};\n\n for (const k in layer) {\n if (k !== 'ref') {\n result[k] = layer[k];\n }\n }\n\n refProperties.forEach((k) => {\n if (k in parent) {\n result[k] = parent[k];\n }\n });\n\n return result;\n}\n\nmodule.exports = derefLayers;\n\n/**\n * Given an array of layers, some of which may contain `ref` properties\n * whose value is the `id` of another property, return a new array where\n * such layers have been augmented with the 'type', 'source', etc. properties\n * from the parent layer, and the `ref` property has been removed.\n *\n * The input is not modified. The output may contain references to portions\n * of the input.\n *\n * @private\n * @param {Array} layers\n * @returns {Array}\n */\nfunction derefLayers(layers) {\n layers = layers.slice();\n\n const map = Object.create(null);\n for (let i = 0; i < layers.length; i++) {\n map[layers[i].id] = layers[i];\n }\n\n for (let i = 0; i < layers.length; i++) {\n if ('ref' in layers[i]) {\n layers[i] = deref(layers[i], map[layers[i].ref]);\n }\n }\n\n return layers;\n}\n","'use strict';\n\nconst isEqual = require('lodash.isequal');\n\nconst operations = {\n\n /*\n * { command: 'setStyle', args: [stylesheet] }\n */\n setStyle: 'setStyle',\n\n /*\n * { command: 'addLayer', args: [layer, 'beforeLayerId'] }\n */\n addLayer: 'addLayer',\n\n /*\n * { command: 'removeLayer', args: ['layerId'] }\n */\n removeLayer: 'removeLayer',\n\n /*\n * { command: 'setPaintProperty', args: ['layerId', 'prop', value] }\n */\n setPaintProperty: 'setPaintProperty',\n\n /*\n * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] }\n */\n setLayoutProperty: 'setLayoutProperty',\n\n /*\n * { command: 'setFilter', args: ['layerId', filter] }\n */\n setFilter: 'setFilter',\n\n /*\n * { command: 'addSource', args: ['sourceId', source] }\n */\n addSource: 'addSource',\n\n /*\n * { command: 'removeSource', args: ['sourceId'] }\n */\n removeSource: 'removeSource',\n\n /*\n * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] }\n */\n setLayerZoomRange: 'setLayerZoomRange',\n\n /*\n * { command: 'setLayerProperty', args: ['layerId', 'prop', value] }\n */\n setLayerProperty: 'setLayerProperty',\n\n /*\n * { command: 'setCenter', args: [[lon, lat]] }\n */\n setCenter: 'setCenter',\n\n /*\n * { command: 'setZoom', args: [zoom] }\n */\n setZoom: 'setZoom',\n\n /*\n * { command: 'setBearing', args: [bearing] }\n */\n setBearing: 'setBearing',\n\n /*\n * { command: 'setPitch', args: [pitch] }\n */\n setPitch: 'setPitch',\n\n /*\n * { command: 'setSprite', args: ['spriteUrl'] }\n */\n setSprite: 'setSprite',\n\n /*\n * { command: 'setGlyphs', args: ['glyphsUrl'] }\n */\n setGlyphs: 'setGlyphs',\n\n /*\n * { command: 'setTransition', args: [transition] }\n */\n setTransition: 'setTransition',\n\n /*\n * { command: 'setLighting', args: [lightProperties] }\n */\n setLight: 'setLight'\n\n};\n\n\nfunction diffSources(before, after, commands, sourcesRemoved) {\n before = before || {};\n after = after || {};\n\n let sourceId;\n\n // look for sources to remove\n for (sourceId in before) {\n if (!before.hasOwnProperty(sourceId)) continue;\n if (!after.hasOwnProperty(sourceId)) {\n commands.push({ command: operations.removeSource, args: [sourceId] });\n sourcesRemoved[sourceId] = true;\n }\n }\n\n // look for sources to add/update\n for (sourceId in after) {\n if (!after.hasOwnProperty(sourceId)) continue;\n if (!before.hasOwnProperty(sourceId)) {\n commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] });\n } else if (!isEqual(before[sourceId], after[sourceId])) {\n // no update command, must remove then add\n commands.push({ command: operations.removeSource, args: [sourceId] });\n commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] });\n sourcesRemoved[sourceId] = true;\n }\n }\n}\n\nfunction diffLayerPropertyChanges(before, after, commands, layerId, klass, command) {\n before = before || {};\n after = after || {};\n\n let prop;\n\n for (prop in before) {\n if (!before.hasOwnProperty(prop)) continue;\n if (!isEqual(before[prop], after[prop])) {\n commands.push({ command: command, args: [layerId, prop, after[prop], klass] });\n }\n }\n for (prop in after) {\n if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue;\n if (!isEqual(before[prop], after[prop])) {\n commands.push({ command: command, args: [layerId, prop, after[prop], klass] });\n }\n }\n}\n\nfunction pluckId(layer) {\n return layer.id;\n}\nfunction indexById(group, layer) {\n group[layer.id] = layer;\n return group;\n}\n\nfunction diffLayers(before, after, commands) {\n before = before || [];\n after = after || [];\n\n // order of layers by id\n const beforeOrder = before.map(pluckId);\n const afterOrder = after.map(pluckId);\n\n // index of layer by id\n const beforeIndex = before.reduce(indexById, {});\n const afterIndex = after.reduce(indexById, {});\n\n // track order of layers as if they have been mutated\n const tracker = beforeOrder.slice();\n\n // layers that have been added do not need to be diffed\n const clean = Object.create(null);\n\n let i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop;\n\n // remove layers\n for (i = 0, d = 0; i < beforeOrder.length; i++) {\n layerId = beforeOrder[i];\n if (!afterIndex.hasOwnProperty(layerId)) {\n commands.push({ command: operations.removeLayer, args: [layerId] });\n tracker.splice(tracker.indexOf(layerId, d), 1);\n } else {\n // limit where in tracker we need to look for a match\n d++;\n }\n }\n\n // add/reorder layers\n for (i = 0, d = 0; i < afterOrder.length; i++) {\n // work backwards as insert is before an existing layer\n layerId = afterOrder[afterOrder.length - 1 - i];\n\n if (tracker[tracker.length - 1 - i] === layerId) continue;\n\n if (beforeIndex.hasOwnProperty(layerId)) {\n // remove the layer before we insert at the correct position\n commands.push({ command: operations.removeLayer, args: [layerId] });\n tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1);\n } else {\n // limit where in tracker we need to look for a match\n d++;\n }\n\n // add layer at correct position\n insertBeforeLayerId = tracker[tracker.length - i];\n commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] });\n tracker.splice(tracker.length - i, 0, layerId);\n clean[layerId] = true;\n }\n\n // update layers\n for (i = 0; i < afterOrder.length; i++) {\n layerId = afterOrder[i];\n beforeLayer = beforeIndex[layerId];\n afterLayer = afterIndex[layerId];\n\n // no need to update if previously added (new or moved)\n if (clean[layerId] || isEqual(beforeLayer, afterLayer)) continue;\n\n // If source, source-layer, or type have changes, then remove the layer\n // and add it back 'from scratch'.\n if (!isEqual(beforeLayer.source, afterLayer.source) || !isEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !isEqual(beforeLayer.type, afterLayer.type)) {\n commands.push({ command: operations.removeLayer, args: [layerId] });\n // we add the layer back at the same position it was already in, so\n // there's no need to update the `tracker`\n insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1];\n commands.push({ command: operations.addLayer, args: [afterLayer, insertBeforeLayerId] });\n continue;\n }\n\n // layout, paint, filter, minzoom, maxzoom\n diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty);\n diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty);\n if (!isEqual(beforeLayer.filter, afterLayer.filter)) {\n commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] });\n }\n if (!isEqual(beforeLayer.minzoom, afterLayer.minzoom) || !isEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) {\n commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] });\n }\n\n // handle all other layer props, including paint.*\n for (prop in beforeLayer) {\n if (!beforeLayer.hasOwnProperty(prop)) continue;\n if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||\n prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue;\n if (prop.indexOf('paint.') === 0) {\n diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) {\n commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] });\n }\n }\n for (prop in afterLayer) {\n if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) continue;\n if (prop === 'layout' || prop === 'paint' || prop === 'filter' ||\n prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue;\n if (prop.indexOf('paint.') === 0) {\n diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty);\n } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) {\n commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] });\n }\n }\n }\n}\n\n/**\n * Diff two stylesheet\n *\n * Creates semanticly aware diffs that can easily be applied at runtime.\n * Operations produced by the diff closely resemble the mapbox-gl-js API. Any\n * error creating the diff will fall back to the 'setStyle' operation.\n *\n * Example diff:\n * [\n * { command: 'setConstant', args: ['@water', '#0000FF'] },\n * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] }\n * ]\n *\n * @private\n * @param {*} [before] stylesheet to compare from\n * @param {*} after stylesheet to compare to\n * @returns Array list of changes\n */\nfunction diffStyles(before, after) {\n if (!before) return [{ command: operations.setStyle, args: [after] }];\n\n let commands = [];\n\n try {\n // Handle changes to top-level properties\n if (!isEqual(before.version, after.version)) {\n return [{ command: operations.setStyle, args: [after] }];\n }\n if (!isEqual(before.center, after.center)) {\n commands.push({ command: operations.setCenter, args: [after.center] });\n }\n if (!isEqual(before.zoom, after.zoom)) {\n commands.push({ command: operations.setZoom, args: [after.zoom] });\n }\n if (!isEqual(before.bearing, after.bearing)) {\n commands.push({ command: operations.setBearing, args: [after.bearing] });\n }\n if (!isEqual(before.pitch, after.pitch)) {\n commands.push({ command: operations.setPitch, args: [after.pitch] });\n }\n if (!isEqual(before.sprite, after.sprite)) {\n commands.push({ command: operations.setSprite, args: [after.sprite] });\n }\n if (!isEqual(before.glyphs, after.glyphs)) {\n commands.push({ command: operations.setGlyphs, args: [after.glyphs] });\n }\n if (!isEqual(before.transition, after.transition)) {\n commands.push({ command: operations.setTransition, args: [after.transition] });\n }\n if (!isEqual(before.light, after.light)) {\n commands.push({ command: operations.setLight, args: [after.light] });\n }\n\n // Handle changes to `sources`\n // If a source is to be removed, we also--before the removeSource\n // command--need to remove all the style layers that depend on it.\n const sourcesRemoved = {};\n\n // First collect the {add,remove}Source commands\n const removeOrAddSourceCommands = [];\n diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved);\n\n // Push a removeLayer command for each style layer that depends on a\n // source that's being removed.\n // Also, exclude any such layers them from the input to `diffLayers`\n // below, so that diffLayers produces the appropriate `addLayers`\n // command\n const beforeLayers = [];\n if (before.layers) {\n before.layers.forEach((layer) => {\n if (sourcesRemoved[layer.source]) {\n commands.push({ command: operations.removeLayer, args: [layer.id] });\n } else {\n beforeLayers.push(layer);\n }\n });\n }\n commands = commands.concat(removeOrAddSourceCommands);\n\n // Handle changes to `layers`\n diffLayers(beforeLayers, after.layers, commands);\n\n } catch (e) {\n // fall back to setStyle\n console.warn('Unable to compute style diff:', e);\n commands = [{ command: operations.setStyle, args: [after] }];\n }\n\n return commands;\n}\n\nmodule.exports = diffStyles;\nmodule.exports.operations = operations;\n","'use strict';\n\nconst format = require('util').format;\n\nfunction ValidationError(key, value /*, message, ...*/) {\n this.message = (\n (key ? `${key}: ` : '') +\n format.apply(format, Array.prototype.slice.call(arguments, 2))\n );\n\n if (value !== null && value !== undefined && value.__line__) {\n this.line = value.__line__;\n }\n}\n\nmodule.exports = ValidationError;\n","'use strict';\n\nmodule.exports = createFilter;\n\nconst types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\n/**\n * Given a filter expressed as nested arrays, return a new function\n * that evaluates whether a given feature (with a .properties or .tags property)\n * passes its test.\n *\n * @private\n * @param {Array} filter mapbox gl filter\n * @returns {Function} filter-evaluating function\n */\nfunction createFilter(filter) {\n return new Function('f', `var p = (f && f.properties || {}); return ${compile(filter)}`);\n}\n\nfunction compile(filter) {\n if (!filter) return 'true';\n const op = filter[0];\n if (filter.length <= 1) return op === 'any' ? 'false' : 'true';\n const str =\n op === '==' ? compileComparisonOp(filter[1], filter[2], '===', false) :\n op === '!=' ? compileComparisonOp(filter[1], filter[2], '!==', false) :\n op === '<' ||\n op === '>' ||\n op === '<=' ||\n op === '>=' ? compileComparisonOp(filter[1], filter[2], op, true) :\n op === 'any' ? compileLogicalOp(filter.slice(1), '||') :\n op === 'all' ? compileLogicalOp(filter.slice(1), '&&') :\n op === 'none' ? compileNegation(compileLogicalOp(filter.slice(1), '||')) :\n op === 'in' ? compileInOp(filter[1], filter.slice(2)) :\n op === '!in' ? compileNegation(compileInOp(filter[1], filter.slice(2))) :\n op === 'has' ? compileHasOp(filter[1]) :\n op === '!has' ? compileNegation(compileHasOp(filter[1])) :\n 'true';\n return `(${str})`;\n}\n\nfunction compilePropertyReference(property) {\n return property === '$type' ? 'f.type' :\n property === '$id' ? 'f.id' :\n `p[${JSON.stringify(property)}]`;\n}\n\nfunction compileComparisonOp(property, value, op, checkType) {\n const left = compilePropertyReference(property);\n const right = property === '$type' ? types.indexOf(value) : JSON.stringify(value);\n return (checkType ? `typeof ${left}=== typeof ${right}&&` : '') + left + op + right;\n}\n\nfunction compileLogicalOp(expressions, op) {\n return expressions.map(compile).join(op);\n}\n\nfunction compileInOp(property, values) {\n if (property === '$type') values = values.map((value) => {\n return types.indexOf(value);\n });\n const left = JSON.stringify(values.sort(compare));\n const right = compilePropertyReference(property);\n\n if (values.length <= 200) return `${left}.indexOf(${right}) !== -1`;\n\n return `${'function(v, a, i, j) {' +\n 'while (i <= j) { var m = (i + j) >> 1;' +\n ' if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;' +\n '}' +\n 'return false; }('}${right}, ${left},0,${values.length - 1})`;\n}\n\nfunction compileHasOp(property) {\n return property === '$id' ? '\"id\" in f' : `${JSON.stringify(property)} in p`;\n}\n\nfunction compileNegation(expression) {\n return `!(${expression})`;\n}\n\n// Comparison function to sort numbers and strings\nfunction compare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","'use strict';\n\n// Constants\nconst Xn = 0.950470, // D65 standard referent\n Yn = 1,\n Zn = 1.088830,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1,\n deg2rad = Math.PI / 180,\n rad2deg = 180 / Math.PI;\n\n// Utilities\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction xyz2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2xyz(x) {\n x /= 255;\n return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\n// LAB\nfunction rgbToLab(rgbColor) {\n const b = rgb2xyz(rgbColor[0]),\n a = rgb2xyz(rgbColor[1]),\n l = rgb2xyz(rgbColor[2]),\n x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),\n y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),\n z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);\n\n return [\n 116 * y - 16,\n 500 * (x - y),\n 200 * (y - z),\n rgbColor[3]\n ];\n}\n\nfunction labToRgb(labColor) {\n let y = (labColor[0] + 16) / 116,\n x = isNaN(labColor[1]) ? y : y + labColor[1] / 500,\n z = isNaN(labColor[2]) ? y : y - labColor[2] / 200;\n y = Yn * lab2xyz(y);\n x = Xn * lab2xyz(x);\n z = Zn * lab2xyz(z);\n return [\n xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB\n xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),\n xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z),\n labColor[3]\n ];\n}\n\n// HCL\nfunction rgbToHcl(rgbColor) {\n const labColor = rgbToLab(rgbColor);\n const l = labColor[0],\n a = labColor[1],\n b = labColor[2];\n const h = Math.atan2(b, a) * rad2deg;\n return [\n h < 0 ? h + 360 : h,\n Math.sqrt(a * a + b * b),\n l,\n rgbColor[3]\n ];\n}\n\nfunction hclToRgb(hclColor) {\n const h = hclColor[0] * deg2rad,\n c = hclColor[1],\n l = hclColor[2];\n return labToRgb([\n l,\n Math.cos(h) * c,\n Math.sin(h) * c,\n hclColor[3]\n ]);\n}\n\nmodule.exports = {\n lab: {\n forward: rgbToLab,\n reverse: labToRgb\n },\n hcl: {\n forward: rgbToHcl,\n reverse: hclToRgb\n }\n};\n","'use strict';\n\nconst colorSpaces = require('./color_spaces');\nconst parseColor = require('../util/parse_color');\nconst extend = require('../util/extend');\nconst getType = require('../util/get_type');\n\nfunction identityFunction(x) {\n return x;\n}\n\nfunction createFunction(parameters, propertySpec) {\n const isColor = propertySpec.type === 'color';\n\n let fun;\n\n if (!isFunctionDefinition(parameters)) {\n if (isColor && parameters) {\n parameters = parseColor(parameters);\n }\n fun = function() {\n return parameters;\n };\n fun.isFeatureConstant = true;\n fun.isZoomConstant = true;\n\n } else {\n const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object';\n const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined;\n const zoomDependent = zoomAndFeatureDependent || !featureDependent;\n const type = parameters.type || (propertySpec.function === 'interpolated' ? 'exponential' : 'interval');\n\n if (isColor) {\n parameters = extend({}, parameters);\n\n if (parameters.stops) {\n parameters.stops = parameters.stops.map((stop) => {\n return [stop[0], parseColor(stop[1])];\n });\n }\n\n if (parameters.default) {\n parameters.default = parseColor(parameters.default);\n } else {\n parameters.default = parseColor(propertySpec.default);\n }\n }\n\n let innerFun;\n let hashedStops;\n let categoricalKeyType;\n if (type === 'exponential') {\n innerFun = evaluateExponentialFunction;\n } else if (type === 'interval') {\n innerFun = evaluateIntervalFunction;\n } else if (type === 'categorical') {\n innerFun = evaluateCategoricalFunction;\n\n // For categorical functions, generate an Object as a hashmap of the stops for fast searching\n hashedStops = Object.create(null);\n for (const stop of parameters.stops) {\n hashedStops[stop[0]] = stop[1];\n }\n\n // Infer key type based on first stop key-- used to encforce strict type checking later\n categoricalKeyType = typeof parameters.stops[0][0];\n\n } else if (type === 'identity') {\n innerFun = evaluateIdentityFunction;\n } else {\n throw new Error(`Unknown function type \"${type}\"`);\n }\n\n let outputFunction;\n\n // If we're interpolating colors in a color system other than RGBA,\n // first translate all stop values to that color system, then interpolate\n // arrays as usual. The `outputFunction` option lets us then translate\n // the result of that interpolation back into RGBA.\n if (parameters.colorSpace && parameters.colorSpace !== 'rgb') {\n if (colorSpaces[parameters.colorSpace]) {\n const colorspace = colorSpaces[parameters.colorSpace];\n // Avoid mutating the parameters value\n parameters = JSON.parse(JSON.stringify(parameters));\n for (let s = 0; s < parameters.stops.length; s++) {\n parameters.stops[s] = [\n parameters.stops[s][0],\n colorspace.forward(parameters.stops[s][1])\n ];\n }\n outputFunction = colorspace.reverse;\n } else {\n throw new Error(`Unknown color space: ${parameters.colorSpace}`);\n }\n } else {\n outputFunction = identityFunction;\n }\n\n if (zoomAndFeatureDependent) {\n const featureFunctions = {};\n const featureFunctionStops = [];\n for (let s = 0; s < parameters.stops.length; s++) {\n const stop = parameters.stops[s];\n if (featureFunctions[stop[0].zoom] === undefined) {\n featureFunctions[stop[0].zoom] = {\n zoom: stop[0].zoom,\n type: parameters.type,\n property: parameters.property,\n stops: []\n };\n }\n featureFunctions[stop[0].zoom].stops.push([stop[0].value, stop[1]]);\n }\n\n for (const z in featureFunctions) {\n featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]);\n }\n fun = function(zoom, feature) {\n return outputFunction(evaluateExponentialFunction({\n stops: featureFunctionStops,\n base: parameters.base\n }, propertySpec, zoom)(zoom, feature));\n };\n fun.isFeatureConstant = false;\n fun.isZoomConstant = false;\n\n } else if (zoomDependent) {\n fun = function(zoom) {\n return outputFunction(innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType));\n };\n fun.isFeatureConstant = true;\n fun.isZoomConstant = false;\n } else {\n fun = function(zoom, feature) {\n const value = feature[parameters.property];\n if (value === undefined) {\n return coalesce(parameters.default, propertySpec.default);\n }\n return outputFunction(innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType));\n };\n fun.isFeatureConstant = false;\n fun.isZoomConstant = true;\n }\n }\n\n return fun;\n}\n\nfunction coalesce(a, b, c) {\n if (a !== undefined) return a;\n if (b !== undefined) return b;\n if (c !== undefined) return c;\n}\n\nfunction evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) {\n const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input\n return coalesce(evaluated, parameters.default, propertySpec.default);\n}\n\nfunction evaluateIntervalFunction(parameters, propertySpec, input) {\n // Edge cases\n if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default);\n const n = parameters.stops.length;\n if (n === 1) return parameters.stops[0][1];\n if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n\n const index = binarySearchForIndex(parameters.stops, input);\n\n return parameters.stops[index][1];\n}\n\nfunction evaluateExponentialFunction(parameters, propertySpec, input) {\n const base = parameters.base !== undefined ? parameters.base : 1;\n\n // Edge cases\n if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default);\n const n = parameters.stops.length;\n if (n === 1) return parameters.stops[0][1];\n if (input <= parameters.stops[0][0]) return parameters.stops[0][1];\n if (input >= parameters.stops[n - 1][0]) return parameters.stops[n - 1][1];\n\n const index = binarySearchForIndex(parameters.stops, input);\n\n return interpolate(\n input,\n base,\n parameters.stops[index][0],\n parameters.stops[index + 1][0],\n parameters.stops[index][1],\n parameters.stops[index + 1][1]\n );\n}\n\nfunction evaluateIdentityFunction(parameters, propertySpec, input) {\n if (propertySpec.type === 'color') {\n input = parseColor(input);\n } else if (getType(input) !== propertySpec.type) {\n input = undefined;\n }\n return coalesce(input, parameters.default, propertySpec.default);\n}\n\nfunction binarySearchForIndex(stops, input) {\n const n = stops.length;\n let lowerIndex = 0;\n let upperIndex = n - 1;\n let currentIndex = 0;\n let currentValue, upperValue;\n\n while (lowerIndex <= upperIndex) {\n currentIndex = Math.floor((lowerIndex + upperIndex) / 2);\n currentValue = stops[currentIndex][0];\n upperValue = stops[currentIndex + 1][0];\n if (input >= currentValue && input < upperValue) { // Search complete\n return currentIndex;\n } else if (currentValue < input) {\n lowerIndex = currentIndex + 1;\n } else if (currentValue > input) {\n upperIndex = currentIndex - 1;\n }\n }\n\n return Math.max(currentIndex - 1, 0);\n}\n\nfunction interpolate(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n if (typeof outputLower === 'function') {\n return function() {\n const evaluatedLower = outputLower.apply(undefined, arguments);\n const evaluatedUpper = outputUpper.apply(undefined, arguments);\n // Special case for fill-outline-color, which has no spec default.\n if (evaluatedLower === undefined || evaluatedUpper === undefined) {\n return undefined;\n }\n return interpolate(input, base, inputLower, inputUpper, evaluatedLower, evaluatedUpper);\n };\n } else if (outputLower.length) {\n return interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper);\n } else {\n return interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper);\n }\n}\n\nfunction interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n const difference = inputUpper - inputLower;\n const progress = input - inputLower;\n\n let ratio;\n if (base === 1) {\n ratio = progress / difference;\n } else {\n ratio = (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1);\n }\n\n return (outputLower * (1 - ratio)) + (outputUpper * ratio);\n}\n\nfunction interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper) {\n const output = [];\n for (let i = 0; i < outputLower.length; i++) {\n output[i] = interpolateNumber(input, base, inputLower, inputUpper, outputLower[i], outputUpper[i]);\n }\n return output;\n}\n\nfunction isFunctionDefinition(value) {\n return typeof value === 'object' && (value.stops || value.type === 'identity');\n}\n\nmodule.exports = createFunction;\nmodule.exports.isFunctionDefinition = isFunctionDefinition;\n","'use strict';\n\nconst refProperties = require('./util/ref_properties'),\n stringify = require('fast-stable-stringify');\n\nfunction key(layer) {\n return stringify(refProperties.map((k) => {\n return layer[k];\n }));\n}\n\nmodule.exports = groupByLayout;\n\n/**\n * Given an array of layers, return an array of arrays of layers where all\n * layers in each group have identical layout-affecting properties. These\n * are the properties that were formerly used by explicit `ref` mechanism\n * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom',\n * 'filter', and 'layout'.\n *\n * The input is not modified. The output layers are references to the\n * input layers.\n *\n * @private\n * @param {Array} layers\n * @returns {Array>}\n */\nfunction groupByLayout(layers) {\n const groups = {};\n\n for (let i = 0; i < layers.length; i++) {\n const k = key(layers[i]);\n let group = groups[k];\n if (!group) {\n group = groups[k] = [];\n }\n group.push(layers[i]);\n }\n\n const result = [];\n\n for (const k in groups) {\n result.push(groups[k]);\n }\n\n return result;\n}\n","// (c) Dean McNamee , 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"rebeccapurple\": [102,51,153,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n","var toString = {}.toString,\n\tisArray = Array.isArray || function(obj){\n\t\treturn toString.call(obj) === \"[object Array]\";\n\t},\n\tobjKeys = Object.keys || function(obj) {\n\t\t\tvar keys = [];\n\t\t\tfor (var name in obj) {\n\t\t\t\tif (obj.hasOwnProperty(name)) {\n\t\t\t\t\tkeys.push(name);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn keys;\n\t\t},\n\tstrReg = /[\\u0000-\\u001f\"\\\\]/g,\n\tstrReplace = function(str) {\n\t\tvar code = str.charCodeAt(0);\n\t\tswitch (code) {\n\t\t\tcase 34: return '\\\\\"';\n\t\t\tcase 92: return '\\\\\\\\';\n\t\t\tcase 12: return \"\\\\f\";\n\t\t\tcase 10: return \"\\\\n\";\n\t\t\tcase 13: return \"\\\\r\";\n\t\t\tcase 9: return \"\\\\t\";\n\t\t\tcase 8: return \"\\\\b\";\n\t\t\tdefault:\n\t\t\t\tif (code > 15) {\n\t\t\t\t\treturn \"\\\\u00\" + code.toString(16);\n\t\t\t\t} else {\n\t\t\t\t\treturn \"\\\\u000\" + code.toString(16);\n\t\t\t\t}\n\t\t}\n\t};\n\n/**\n * Simple stable stringify. Object keys sorted. No options, no spaces.\n * @param {*} val\n * @returns {string}\n */\nmodule.exports = function simpleStableStringify(val) {\n\tif (val !== undefined) {\n\t\treturn ''+ sss(val);\n\t}\n};\n\nmodule.exports.stringSearch = strReg;\nmodule.exports.stringReplace = strReplace;\n\nfunction sss(val) {\n\tvar i, max, str, keys, key, pass;\n\tswitch (typeof val) {\n\t\tcase \"object\":\n\t\t\tif (val === null) {\n\t\t\t\treturn null;\n\t\t\t} else if (isArray(val)) {\n\t\t\t\tstr = '[';\n\t\t\t\tmax = val.length - 1;\n\t\t\t\tfor (i = 0; i < max; i++) {\n\t\t\t\t\tstr += sss(val[i]) + ',';\n\t\t\t\t}\n\t\t\t\tif (max > -1) {\n\t\t\t\t\tstr += sss(val[i]);\n\t\t\t\t}\n\t\t\t\treturn str + ']';\n\t\t\t} else {\n\t\t\t\t// only object is left\n\t\t\t\tkeys = objKeys(val).sort();\n\t\t\t\tmax = keys.length;\n\t\t\t\tstr = \"{\";\n\t\t\t\tkey = keys[i = 0];\n\t\t\t\tpass = max > 0 && val[key] !== undefined;\n\t\t\t\twhile (i < max) {\n\t\t\t\t\tif (pass) {\n\t\t\t\t\t\tstr += '\"' + key.replace(strReg, strReplace) + '\":' + sss(val[key]);\n\t\t\t\t\t\tkey = keys[++i];\n\t\t\t\t\t\tpass = i < max && val[key] !== undefined;\n\t\t\t\t\t\tif (pass) {\n\t\t\t\t\t\t\tstr += ',';\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkey = keys[++i];\n\t\t\t\t\t\tpass = i < max && val[key] !== undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn str + '}';\n\t\t\t}\n\t\tcase \"undefined\":\n\t\t\treturn null;\n\t\tcase \"string\":\n\t\t\treturn '\"' + val.replace(strReg, strReplace) + '\"';\n\t\tdefault:\n\t\t\treturn val;\n\t}\n}\n","/**\n * lodash 3.0.7 (Custom Build) \n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar isArray = require('lodash.isarray'),\n isTypedArray = require('lodash.istypedarray'),\n keys = require('lodash.keys');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n stringTag = '[object String]';\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native 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 [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = objToString.call(object);\n if (objTag == argsTag) {\n objTag = objectTag;\n } else if (objTag != objectTag) {\n objIsArr = isTypedArray(object);\n }\n }\n if (!othIsArr) {\n othTag = objToString.call(other);\n if (othTag == argsTag) {\n othTag = objectTag;\n } else if (othTag != objectTag) {\n othIsArr = isTypedArray(other);\n }\n }\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && !(objIsArr || objIsObj)) {\n return equalByTag(object, other, objTag);\n }\n if (!isLoose) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n }\n }\n if (!isSameTag) {\n return false;\n }\n // Assume cyclic values are equal.\n // For more information on detecting circular references see https://es5.github.io/#JO.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == object) {\n return stackB[length] == other;\n }\n }\n // Add `object` and `other` to the stack of traversed objects.\n stackA.push(object);\n stackB.push(other);\n\n var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n stackA.pop();\n stackB.pop();\n\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var index = -1,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n return false;\n }\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index],\n result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n if (result !== undefined) {\n if (result) {\n continue;\n }\n return false;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (isLoose) {\n if (!arraySome(other, function(othValue) {\n return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n })) {\n return false;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} value The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag) {\n switch (tag) {\n case boolTag:\n case dateTag:\n // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n return +object == +other;\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case numberTag:\n // Treat `NaN` vs. `NaN` as equal.\n return (object != +object)\n ? other != +other\n : object == +other;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings primitives and string\n // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n return object == (other + '');\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isLoose) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n var skipCtor = isLoose;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key],\n result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n // Recursively compare objects (susceptible to call stack limits).\n if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n return false;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (!skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = baseIsEqual;\n","/**\n * lodash 3.0.1 (Custom Build) \n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\nfunction bindCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return identity;\n }\n if (thisArg === undefined) {\n return func;\n }\n switch (argCount) {\n case 1: return function(value) {\n return func.call(thisArg, value);\n };\n case 3: return function(value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n case 5: return function(value, other, key, object, source) {\n return func.call(thisArg, value, other, key, object, source);\n };\n }\n return function() {\n return func.apply(thisArg, arguments);\n };\n}\n\n/**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = bindCallback;\n","/**\n * lodash 3.9.1 (Custom Build) \n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]';\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, 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 older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n}\n\nmodule.exports = getNative;\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\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/7.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/**\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 an `arguments` object,\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 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 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(value.length) && !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 a function, 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-9 which returns 'object' for typed array and other constructors.\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 method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.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, 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/7.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\nmodule.exports = isArguments;\n","/**\n * lodash 3.0.4 (Custom Build) \n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** `Object#toString` result references. */\nvar arrayTag = '[object Array]',\n funcTag = '[object Function]';\n\n/** Used to detect host constructors (Safari > 5). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar fnToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeIsArray = getNative(Array, 'isArray');\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\nvar isArray = nativeIsArray || function(value) {\n return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n};\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, 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 older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return isObject(value) && objToString.call(value) == funcTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n if (value == null) {\n return false;\n }\n if (isFunction(value)) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n}\n\nmodule.exports = isArray;\n","/**\n * lodash 3.0.4 (Custom Build) \n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar baseIsEqual = require('lodash._baseisequal'),\n bindCallback = require('lodash._bindcallback');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent. If `customizer` is provided it is invoked to compare values.\n * If `customizer` returns `undefined` comparisons are handled by the method\n * instead. The `customizer` is bound to `thisArg` and invoked with three\n * arguments: (value, other [, index|key]).\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. Functions and DOM nodes\n * are **not** supported. Provide a customizer function to extend support\n * for comparing other values.\n *\n * @static\n * @memberOf _\n * @alias eq\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize value comparisons.\n * @param {*} [thisArg] The `this` binding of `customizer`.\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 * object == other;\n * // => false\n *\n * _.isEqual(object, other);\n * // => true\n *\n * // using a customizer callback\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqual(array, other, function(value, other) {\n * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n * return true;\n * }\n * });\n * // => true\n */\nfunction isEqual(value, other, customizer, thisArg) {\n customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, customizer) : !!result;\n}\n\nmodule.exports = isEqual;\n","/**\n * lodash 3.0.6 (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 arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\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 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 typed array.\n *\n * @static\n * @memberOf _\n * @since 3.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 * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nfunction isTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\nmodule.exports = isTypedArray;\n","/**\n * lodash 3.1.2 (Custom Build) \n * Build: `lodash modern modularize exports=\"npm\" -o ./`\n * Copyright 2012-2015 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\nvar getNative = require('lodash._getnative'),\n isArguments = require('lodash.isarguments'),\n isArray = require('lodash.isarray');\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^\\d+$/;\n\n/** Used for native method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/* Native method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = getNative(Object, 'keys');\n\n/**\n * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n * of an array-like value.\n */\nvar MAX_SAFE_INTEGER = 9007199254740991;\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 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 [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects 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 array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value));\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 value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction shimKeys(object) {\n var props = keysIn(object),\n propsLength = props.length,\n length = propsLength && object.length;\n\n var allowIndexes = !!length && isLength(length) &&\n (isArray(object) || isArguments(object));\n\n var index = -1,\n result = [];\n\n while (++index < propsLength) {\n var key = props[index];\n if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\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(1);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\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 * @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 */\nvar keys = !nativeKeys ? shimKeys : function(object) {\n var Ctor = object == null ? undefined : object.constructor;\n if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n (typeof object != 'function' && isArrayLike(object))) {\n return shimKeys(object);\n }\n return isObject(object) ? nativeKeys(object) : [];\n};\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\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 * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n if (object == null) {\n return [];\n }\n if (!isObject(object)) {\n object = Object(object);\n }\n var length = object.length;\n length = (length && isLength(length) &&\n (isArray(object) || isArguments(object)) && length) || 0;\n\n var Ctor = object.constructor,\n index = -1,\n isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n result = Array(length),\n skipIndexes = length > 0;\n\n while (++index < length) {\n result[index] = (index + '');\n }\n for (var key in object) {\n if (!(skipIndexes && isIndex(key, length)) &&\n !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n","'use strict';\n\nmodule.exports = require('./v8.json');\n","'use strict';\n\nmodule.exports = function (output) {\n for (let i = 1; i < arguments.length; i++) {\n const input = arguments[i];\n for (const k in input) {\n output[k] = input[k];\n }\n }\n return output;\n};\n","'use strict';\n\nmodule.exports = function getType(val) {\n if (val instanceof Number) {\n return 'number';\n } else if (val instanceof String) {\n return 'string';\n } else if (val instanceof Boolean) {\n return 'boolean';\n } else if (Array.isArray(val)) {\n return 'array';\n } else if (val === null) {\n return 'null';\n } else {\n return typeof val;\n }\n};\n","'use strict';\n\nconst parseColorString = require('csscolorparser').parseCSSColor;\n\nmodule.exports = function parseColor(input) {\n if (typeof input === 'string') {\n const rgba = parseColorString(input);\n if (!rgba) { return undefined; }\n\n // GL expects all components to be in the range [0, 1] and to be\n // multipled by the alpha value.\n return [\n rgba[0] / 255 * rgba[3],\n rgba[1] / 255 * rgba[3],\n rgba[2] / 255 * rgba[3],\n rgba[3]\n ];\n\n } else if (Array.isArray(input)) {\n return input;\n\n } else {\n return undefined;\n }\n};\n","'use strict';\n\nmodule.exports = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout'];\n","'use strict';\n\n// Turn jsonlint-lines-primitives objects into primitive objects\nmodule.exports = function unbundle(value) {\n if (value instanceof Number || value instanceof String || value instanceof Boolean) {\n return value.valueOf();\n } else {\n return value;\n }\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\nconst extend = require('../util/extend');\n\n// Main recursive validation function. Tracks:\n//\n// - key: string representing location of validation in style tree. Used only\n// for more informative error reporting.\n// - value: current value from style being evaluated. May be anything from a\n// high level object that needs to be descended into deeper or a simple\n// scalar value.\n// - valueSpec: current spec being evaluated. Tracks value.\n\nmodule.exports = function validate(options) {\n\n const validateFunction = require('./validate_function');\n const validateObject = require('./validate_object');\n const VALIDATORS = {\n '*': function() {\n return [];\n },\n 'array': require('./validate_array'),\n 'boolean': require('./validate_boolean'),\n 'number': require('./validate_number'),\n 'color': require('./validate_color'),\n 'constants': require('./validate_constants'),\n 'enum': require('./validate_enum'),\n 'filter': require('./validate_filter'),\n 'function': require('./validate_function'),\n 'layer': require('./validate_layer'),\n 'object': require('./validate_object'),\n 'source': require('./validate_source'),\n 'light': require('./validate_light'),\n 'string': require('./validate_string')\n };\n\n const value = options.value;\n const valueSpec = options.valueSpec;\n const key = options.key;\n const styleSpec = options.styleSpec;\n const style = options.style;\n\n if (getType(value) === 'string' && value[0] === '@') {\n if (styleSpec.$version > 7) {\n return [new ValidationError(key, value, 'constants have been deprecated as of v8')];\n }\n if (!(value in style.constants)) {\n return [new ValidationError(key, value, 'constant \"%s\" not found', value)];\n }\n options = extend({}, options, { value: style.constants[value] });\n }\n\n if (valueSpec.function && getType(value) === 'object') {\n return validateFunction(options);\n\n } else if (valueSpec.type && VALIDATORS[valueSpec.type]) {\n return VALIDATORS[valueSpec.type](options);\n\n } else {\n return validateObject(extend({}, options, {\n valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec\n }));\n }\n};\n","'use strict';\n\nconst getType = require('../util/get_type');\nconst validate = require('./validate');\nconst ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateArray(options) {\n const array = options.value;\n const arraySpec = options.valueSpec;\n const style = options.style;\n const styleSpec = options.styleSpec;\n const key = options.key;\n const validateArrayElement = options.arrayElementValidator || validate;\n\n if (getType(array) !== 'array') {\n return [new ValidationError(key, array, 'array expected, %s found', getType(array))];\n }\n\n if (arraySpec.length && array.length !== arraySpec.length) {\n return [new ValidationError(key, array, 'array length %d expected, length %d found', arraySpec.length, array.length)];\n }\n\n if (arraySpec['min-length'] && array.length < arraySpec['min-length']) {\n return [new ValidationError(key, array, 'array length at least %d expected, length %d found', arraySpec['min-length'], array.length)];\n }\n\n let arrayElementSpec = {\n \"type\": arraySpec.value\n };\n\n if (styleSpec.$version < 7) {\n arrayElementSpec.function = arraySpec.function;\n }\n\n if (getType(arraySpec.value) === 'object') {\n arrayElementSpec = arraySpec.value;\n }\n\n let errors = [];\n for (let i = 0; i < array.length; i++) {\n errors = errors.concat(validateArrayElement({\n array: array,\n arrayIndex: i,\n value: array[i],\n valueSpec: arrayElementSpec,\n style: style,\n styleSpec: styleSpec,\n key: `${key}[${i}]`\n }));\n }\n return errors;\n};\n","'use strict';\n\nconst getType = require('../util/get_type');\nconst ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateBoolean(options) {\n const value = options.value;\n const key = options.key;\n const type = getType(value);\n\n if (type !== 'boolean') {\n return [new ValidationError(key, value, 'boolean expected, %s found', type)];\n }\n\n return [];\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\nconst parseCSSColor = require('csscolorparser').parseCSSColor;\n\nmodule.exports = function validateColor(options) {\n const key = options.key;\n const value = options.value;\n const type = getType(value);\n\n if (type !== 'string') {\n return [new ValidationError(key, value, 'color expected, %s found', type)];\n }\n\n if (parseCSSColor(value) === null) {\n return [new ValidationError(key, value, 'color expected, \"%s\" found', value)];\n }\n\n return [];\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\n\nmodule.exports = function validateConstants(options) {\n const key = options.key;\n const constants = options.value;\n const styleSpec = options.styleSpec;\n\n if (styleSpec.$version > 7) {\n if (constants) {\n return [new ValidationError(key, constants, 'constants have been deprecated as of v8')];\n } else {\n return [];\n }\n } else {\n const type = getType(constants);\n if (type !== 'object') {\n return [new ValidationError(key, constants, 'object expected, %s found', type)];\n }\n\n const errors = [];\n for (const constantName in constants) {\n if (constantName[0] !== '@') {\n errors.push(new ValidationError(`${key}.${constantName}`, constants[constantName], 'constants must start with \"@\"'));\n }\n }\n return errors;\n }\n\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateEnum(options) {\n const key = options.key;\n const value = options.value;\n const valueSpec = options.valueSpec;\n const errors = [];\n\n if (Array.isArray(valueSpec.values)) { // <=v7\n if (valueSpec.values.indexOf(unbundle(value)) === -1) {\n errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', valueSpec.values.join(', '), value));\n }\n } else { // >=v8\n if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) {\n errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', Object.keys(valueSpec.values).join(', '), value));\n }\n }\n return errors;\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst validateEnum = require('./validate_enum');\nconst getType = require('../util/get_type');\nconst unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateFilter(options) {\n const value = options.value;\n const key = options.key;\n const styleSpec = options.styleSpec;\n let type;\n\n let errors = [];\n\n if (getType(value) !== 'array') {\n return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n }\n\n if (value.length < 1) {\n return [new ValidationError(key, value, 'filter array must have at least 1 element')];\n }\n\n errors = errors.concat(validateEnum({\n key: `${key}[0]`,\n value: value[0],\n valueSpec: styleSpec.filter_operator,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n\n switch (unbundle(value[0])) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n if (value.length >= 2 && unbundle(value[1]) === '$type') {\n errors.push(new ValidationError(key, value, '\"$type\" cannot be use with operator \"%s\"', value[0]));\n }\n /* falls through */\n case '==':\n case '!=':\n if (value.length !== 3) {\n errors.push(new ValidationError(key, value, 'filter array for operator \"%s\" must have 3 elements', value[0]));\n }\n /* falls through */\n case 'in':\n case '!in':\n if (value.length >= 2) {\n type = getType(value[1]);\n if (type !== 'string') {\n errors.push(new ValidationError(`${key}[1]`, value[1], 'string expected, %s found', type));\n }\n }\n for (let i = 2; i < value.length; i++) {\n type = getType(value[i]);\n if (unbundle(value[1]) === '$type') {\n errors = errors.concat(validateEnum({\n key: `${key}[${i}]`,\n value: value[i],\n valueSpec: styleSpec.geometry_type,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n errors.push(new ValidationError(`${key}[${i}]`, value[i], 'string, number, or boolean expected, %s found', type));\n }\n }\n break;\n\n case 'any':\n case 'all':\n case 'none':\n for (let i = 1; i < value.length; i++) {\n errors = errors.concat(validateFilter({\n key: `${key}[${i}]`,\n value: value[i],\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n break;\n\n case 'has':\n case '!has':\n type = getType(value[1]);\n if (value.length !== 2) {\n errors.push(new ValidationError(key, value, 'filter array for \"%s\" operator must have 2 elements', value[0]));\n } else if (type !== 'string') {\n errors.push(new ValidationError(`${key}[1]`, value[1], 'string expected, %s found', type));\n }\n break;\n\n }\n\n return errors;\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\nconst validate = require('./validate');\nconst validateObject = require('./validate_object');\nconst validateArray = require('./validate_array');\nconst validateNumber = require('./validate_number');\nconst unbundle = require('../util/unbundle_jsonlint');\n\nmodule.exports = function validateFunction(options) {\n const functionValueSpec = options.valueSpec;\n const functionType = unbundle(options.value.type);\n let stopKeyType;\n let stopDomainValues = {};\n let previousStopDomainValue;\n let previousStopDomainZoom;\n\n const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined;\n const isPropertyFunction = !isZoomFunction;\n const isZoomAndPropertyFunction =\n getType(options.value.stops) === 'array' &&\n getType(options.value.stops[0]) === 'array' &&\n getType(options.value.stops[0][0]) === 'object';\n\n const errors = validateObject({\n key: options.key,\n value: options.value,\n valueSpec: options.styleSpec.function,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n stops: validateFunctionStops,\n default: validateFunctionDefault\n }\n });\n\n if (functionType === 'identity' && isZoomFunction) {\n errors.push(new ValidationError(options.key, options.value, 'missing required property \"property\"'));\n }\n\n if (functionType !== 'identity' && !options.value.stops) {\n errors.push(new ValidationError(options.key, options.value, 'missing required property \"stops\"'));\n }\n\n if (functionType === 'exponential' && options.valueSpec['function'] === 'piecewise-constant') {\n errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported'));\n }\n\n if (options.styleSpec.$version >= 8) {\n if (isPropertyFunction && !options.valueSpec['property-function']) {\n errors.push(new ValidationError(options.key, options.value, 'property functions not supported'));\n } else if (isZoomFunction && !options.valueSpec['zoom-function']) {\n errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported'));\n }\n }\n\n if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) {\n errors.push(new ValidationError(options.key, options.value, '\"property\" property is required'));\n }\n\n return errors;\n\n function validateFunctionStops(options) {\n if (functionType === 'identity') {\n return [new ValidationError(options.key, options.value, 'identity function may not have a \"stops\" property')];\n }\n\n let errors = [];\n const value = options.value;\n\n errors = errors.concat(validateArray({\n key: options.key,\n value: value,\n valueSpec: options.valueSpec,\n style: options.style,\n styleSpec: options.styleSpec,\n arrayElementValidator: validateFunctionStop\n }));\n\n if (getType(value) === 'array' && value.length === 0) {\n errors.push(new ValidationError(options.key, value, 'array must have at least one stop'));\n }\n\n return errors;\n }\n\n function validateFunctionStop(options) {\n let errors = [];\n const value = options.value;\n const key = options.key;\n\n if (getType(value) !== 'array') {\n return [new ValidationError(key, value, 'array expected, %s found', getType(value))];\n }\n\n if (value.length !== 2) {\n return [new ValidationError(key, value, 'array length %d expected, length %d found', 2, value.length)];\n }\n\n if (isZoomAndPropertyFunction) {\n if (getType(value[0]) !== 'object') {\n return [new ValidationError(key, value, 'object expected, %s found', getType(value[0]))];\n }\n if (value[0].zoom === undefined) {\n return [new ValidationError(key, value, 'object stop key must have zoom')];\n }\n if (value[0].value === undefined) {\n return [new ValidationError(key, value, 'object stop key must have value')];\n }\n if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) {\n return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')];\n }\n if (unbundle(value[0].zoom) !== previousStopDomainZoom) {\n previousStopDomainZoom = unbundle(value[0].zoom);\n previousStopDomainValue = undefined;\n stopDomainValues = {};\n }\n errors = errors.concat(validateObject({\n key: `${key}[0]`,\n value: value[0],\n valueSpec: { zoom: {} },\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue }\n }));\n } else {\n errors = errors.concat(validateStopDomainValue({\n key: `${key}[0]`,\n value: value[0],\n valueSpec: {},\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n\n return errors.concat(validate({\n key: `${key}[1]`,\n value: value[1],\n valueSpec: functionValueSpec,\n style: options.style,\n styleSpec: options.styleSpec\n }));\n }\n\n function validateStopDomainValue(options) {\n const type = getType(options.value);\n const value = unbundle(options.value);\n\n if (!stopKeyType) {\n stopKeyType = type;\n } else if (type !== stopKeyType) {\n return [new ValidationError(options.key, options.value, '%s stop domain type must match previous stop domain type %s', type, stopKeyType)];\n }\n\n if (type !== 'number' && type !== 'string' && type !== 'boolean') {\n return [new ValidationError(options.key, options.value, 'stop domain value must be a number, string, or boolean')];\n }\n\n if (type !== 'number' && functionType !== 'categorical') {\n let message = 'number expected, %s found';\n if (functionValueSpec['property-function'] && functionType === undefined) {\n message += '\\nIf you intended to use a categorical function, specify `\"type\": \"categorical\"`.';\n }\n return [new ValidationError(options.key, options.value, message, type)];\n }\n\n if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) {\n return [new ValidationError(options.key, options.value, 'integer expected, found %s', value)];\n }\n\n if (type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) {\n return [new ValidationError(options.key, options.value, 'stop domain values must appear in ascending order')];\n } else {\n previousStopDomainValue = value;\n }\n\n if (functionType === 'categorical' && value in stopDomainValues) {\n return [new ValidationError(options.key, options.value, 'stop domain values must be unique')];\n } else {\n stopDomainValues[value] = true;\n }\n\n return [];\n }\n\n function validateFunctionDefault(options) {\n return validate({\n key: options.key,\n value: options.value,\n valueSpec: functionValueSpec,\n style: options.style,\n styleSpec: options.styleSpec\n });\n }\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst validateString = require('./validate_string');\n\nmodule.exports = function(options) {\n const value = options.value;\n const key = options.key;\n\n const errors = validateString(options);\n if (errors.length) return errors;\n\n if (value.indexOf('{fontstack}') === -1) {\n errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{fontstack}\" token'));\n }\n\n if (value.indexOf('{range}') === -1) {\n errors.push(new ValidationError(key, value, '\"glyphs\" url must include a \"{range}\" token'));\n }\n\n return errors;\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst unbundle = require('../util/unbundle_jsonlint');\nconst validateObject = require('./validate_object');\nconst validateFilter = require('./validate_filter');\nconst validatePaintProperty = require('./validate_paint_property');\nconst validateLayoutProperty = require('./validate_layout_property');\nconst extend = require('../util/extend');\n\nmodule.exports = function validateLayer(options) {\n let errors = [];\n\n const layer = options.value;\n const key = options.key;\n const style = options.style;\n const styleSpec = options.styleSpec;\n\n if (!layer.type && !layer.ref) {\n errors.push(new ValidationError(key, layer, 'either \"type\" or \"ref\" is required'));\n }\n let type = unbundle(layer.type);\n const ref = unbundle(layer.ref);\n\n if (layer.id) {\n const layerId = unbundle(layer.id);\n for (let i = 0; i < options.arrayIndex; i++) {\n const otherLayer = style.layers[i];\n if (unbundle(otherLayer.id) === layerId) {\n errors.push(new ValidationError(key, layer.id, 'duplicate layer id \"%s\", previously used at line %d', layer.id, otherLayer.id.__line__));\n }\n }\n }\n\n if ('ref' in layer) {\n ['type', 'source', 'source-layer', 'filter', 'layout'].forEach((p) => {\n if (p in layer) {\n errors.push(new ValidationError(key, layer[p], '\"%s\" is prohibited for ref layers', p));\n }\n });\n\n let parent;\n\n style.layers.forEach((layer) => {\n if (unbundle(layer.id) === ref) parent = layer;\n });\n\n if (!parent) {\n errors.push(new ValidationError(key, layer.ref, 'ref layer \"%s\" not found', ref));\n } else if (parent.ref) {\n errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer'));\n } else {\n type = unbundle(parent.type);\n }\n } else if (type !== 'background') {\n if (!layer.source) {\n errors.push(new ValidationError(key, layer, 'missing required property \"source\"'));\n } else {\n const source = style.sources && style.sources[layer.source];\n const sourceType = source && unbundle(source.type);\n if (!source) {\n errors.push(new ValidationError(key, layer.source, 'source \"%s\" not found', layer.source));\n } else if (sourceType === 'vector' && type === 'raster') {\n errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a raster source', layer.id));\n } else if (sourceType === 'raster' && type !== 'raster') {\n errors.push(new ValidationError(key, layer.source, 'layer \"%s\" requires a vector source', layer.id));\n } else if (sourceType === 'vector' && !layer['source-layer']) {\n errors.push(new ValidationError(key, layer, 'layer \"%s\" must specify a \"source-layer\"', layer.id));\n }\n }\n }\n\n errors = errors.concat(validateObject({\n key: key,\n value: layer,\n valueSpec: styleSpec.layer,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function() {\n return [];\n },\n filter: validateFilter,\n layout: function(options) {\n return validateObject({\n layer: layer,\n key: options.key,\n value: options.value,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function(options) {\n return validateLayoutProperty(extend({layerType: type}, options));\n }\n }\n });\n },\n paint: function(options) {\n return validateObject({\n layer: layer,\n key: options.key,\n value: options.value,\n style: options.style,\n styleSpec: options.styleSpec,\n objectElementValidators: {\n '*': function(options) {\n return validatePaintProperty(extend({layerType: type}, options));\n }\n }\n });\n }\n }\n }));\n\n return errors;\n};\n","'use strict';\n\nconst validateProperty = require('./validate_property');\n\nmodule.exports = function validateLayoutProperty(options) {\n return validateProperty(options, 'layout');\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\nconst validate = require('./validate');\n\nmodule.exports = function validateLight(options) {\n const light = options.value;\n const styleSpec = options.styleSpec;\n const lightSpec = styleSpec.light;\n const style = options.style;\n\n let errors = [];\n\n const rootType = getType(light);\n if (light === undefined) {\n return errors;\n } else if (rootType !== 'object') {\n errors = errors.concat([new ValidationError('light', light, 'object expected, %s found', rootType)]);\n return errors;\n }\n\n for (const key in light) {\n const transitionMatch = key.match(/^(.*)-transition$/);\n\n if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) {\n errors = errors.concat(validate({\n key: key,\n value: light[key],\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n }));\n } else if (lightSpec[key]) {\n errors = errors.concat(validate({\n key: key,\n value: light[key],\n valueSpec: lightSpec[key],\n style: style,\n styleSpec: styleSpec\n }));\n } else {\n errors = errors.concat([new ValidationError(key, light[key], 'unknown property \"%s\"', key)]);\n }\n }\n\n return errors;\n};\n","'use strict';\n\nconst getType = require('../util/get_type');\nconst ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateNumber(options) {\n const key = options.key;\n const value = options.value;\n const valueSpec = options.valueSpec;\n const type = getType(value);\n\n if (type !== 'number') {\n return [new ValidationError(key, value, 'number expected, %s found', type)];\n }\n\n if ('minimum' in valueSpec && value < valueSpec.minimum) {\n return [new ValidationError(key, value, '%s is less than the minimum value %s', value, valueSpec.minimum)];\n }\n\n if ('maximum' in valueSpec && value > valueSpec.maximum) {\n return [new ValidationError(key, value, '%s is greater than the maximum value %s', value, valueSpec.maximum)];\n }\n\n return [];\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\nconst validateSpec = require('./validate');\n\nmodule.exports = function validateObject(options) {\n const key = options.key;\n const object = options.value;\n const elementSpecs = options.valueSpec || {};\n const elementValidators = options.objectElementValidators || {};\n const style = options.style;\n const styleSpec = options.styleSpec;\n let errors = [];\n\n const type = getType(object);\n if (type !== 'object') {\n return [new ValidationError(key, object, 'object expected, %s found', type)];\n }\n\n for (const objectKey in object) {\n const elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint'\n const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*'];\n\n let validateElement;\n if (elementValidators[elementSpecKey]) {\n validateElement = elementValidators[elementSpecKey];\n } else if (elementSpecs[elementSpecKey]) {\n validateElement = validateSpec;\n } else if (elementValidators['*']) {\n validateElement = elementValidators['*'];\n } else if (elementSpecs['*']) {\n validateElement = validateSpec;\n } else {\n errors.push(new ValidationError(key, object[objectKey], 'unknown property \"%s\"', objectKey));\n continue;\n }\n\n errors = errors.concat(validateElement({\n key: (key ? `${key}.` : key) + objectKey,\n value: object[objectKey],\n valueSpec: elementSpec,\n style: style,\n styleSpec: styleSpec,\n object: object,\n objectKey: objectKey\n }));\n }\n\n for (const elementSpecKey in elementSpecs) {\n if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) {\n errors.push(new ValidationError(key, object, 'missing required property \"%s\"', elementSpecKey));\n }\n }\n\n return errors;\n};\n","'use strict';\n\nconst validateProperty = require('./validate_property');\n\nmodule.exports = function validatePaintProperty(options) {\n return validateProperty(options, 'paint');\n};\n","'use strict';\n\nconst validate = require('./validate');\nconst ValidationError = require('../error/validation_error');\nconst getType = require('../util/get_type');\n\nmodule.exports = function validateProperty(options, propertyType) {\n const key = options.key;\n const style = options.style;\n const styleSpec = options.styleSpec;\n const value = options.value;\n const propertyKey = options.objectKey;\n const layerSpec = styleSpec[`${propertyType}_${options.layerType}`];\n\n if (!layerSpec) return [];\n\n const transitionMatch = propertyKey.match(/^(.*)-transition$/);\n if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) {\n return validate({\n key: key,\n value: value,\n valueSpec: styleSpec.transition,\n style: style,\n styleSpec: styleSpec\n });\n }\n\n const valueSpec = options.valueSpec || layerSpec[propertyKey];\n if (!valueSpec) {\n return [new ValidationError(key, value, 'unknown property \"%s\"', propertyKey)];\n }\n\n let tokenMatch;\n if (getType(value) === 'string' && valueSpec['property-function'] && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) {\n return [new ValidationError(key, value, '\"%s\" does not support interpolation syntax\\n' +\n 'Use an identity property function instead: `{ \"type\": \"identity\", \"property\": %s` }`.',\n propertyKey, JSON.stringify(tokenMatch[1]))];\n }\n\n const errors = [];\n\n if (options.layerType === 'symbol') {\n if (propertyKey === 'text-field' && style && !style.glyphs) {\n errors.push(new ValidationError(key, value, 'use of \"text-field\" requires a style \"glyphs\" property'));\n }\n }\n\n return errors.concat(validate({\n key: options.key,\n value: value,\n valueSpec: valueSpec,\n style: style,\n styleSpec: styleSpec\n }));\n};\n","'use strict';\n\nconst ValidationError = require('../error/validation_error');\nconst unbundle = require('../util/unbundle_jsonlint');\nconst validateObject = require('./validate_object');\nconst validateEnum = require('./validate_enum');\n\nmodule.exports = function validateSource(options) {\n const value = options.value;\n const key = options.key;\n const styleSpec = options.styleSpec;\n const style = options.style;\n\n if (!value.type) {\n return [new ValidationError(key, value, '\"type\" is required')];\n }\n\n const type = unbundle(value.type);\n let errors = [];\n\n switch (type) {\n case 'vector':\n case 'raster':\n errors = errors.concat(validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_tile,\n style: options.style,\n styleSpec: styleSpec\n }));\n if ('url' in value) {\n for (const prop in value) {\n if (['type', 'url', 'tileSize'].indexOf(prop) < 0) {\n errors.push(new ValidationError(`${key}.${prop}`, value[prop], 'a source with a \"url\" property may not include a \"%s\" property', prop));\n }\n }\n }\n return errors;\n\n case 'geojson':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_geojson,\n style: style,\n styleSpec: styleSpec\n });\n\n case 'video':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_video,\n style: style,\n styleSpec: styleSpec\n });\n\n case 'image':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_image,\n style: style,\n styleSpec: styleSpec\n });\n\n case 'canvas':\n return validateObject({\n key: key,\n value: value,\n valueSpec: styleSpec.source_canvas,\n style: style,\n styleSpec: styleSpec\n });\n\n default:\n return validateEnum({\n key: `${key}.type`,\n value: value.type,\n valueSpec: {values: ['vector', 'raster', 'geojson', 'video', 'image', 'canvas']},\n style: style,\n styleSpec: styleSpec\n });\n }\n};\n","'use strict';\n\nconst getType = require('../util/get_type');\nconst ValidationError = require('../error/validation_error');\n\nmodule.exports = function validateString(options) {\n const value = options.value;\n const key = options.key;\n const type = getType(value);\n\n if (type !== 'string') {\n return [new ValidationError(key, value, 'string expected, %s found', type)];\n }\n\n return [];\n};\n","'use strict';\n\nconst validateConstants = require('./validate/validate_constants');\nconst validate = require('./validate/validate');\nconst latestStyleSpec = require('./reference/latest');\nconst validateGlyphsURL = require('./validate/validate_glyphs_url');\n\n/**\n * Validate a Mapbox GL style against the style specification. This entrypoint,\n * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as\n * small a browserify bundle as possible by omitting unnecessary functionality\n * and legacy style specifications.\n *\n * @private\n * @param {Object} style The style to be validated.\n * @param {Object} [styleSpec] The style specification to validate against.\n * If omitted, the latest style spec is used.\n * @returns {Array}\n * @example\n * var validate = require('mapbox-gl-style-spec/lib/validate_style.min');\n * var errors = validate(style);\n */\nfunction validateStyleMin(style, styleSpec) {\n styleSpec = styleSpec || latestStyleSpec;\n\n let errors = [];\n\n errors = errors.concat(validate({\n key: '',\n value: style,\n valueSpec: styleSpec.$root,\n styleSpec: styleSpec,\n style: style,\n objectElementValidators: {\n glyphs: validateGlyphsURL,\n '*': function() {\n return [];\n }\n }\n }));\n\n if (styleSpec.$version > 7 && style.constants) {\n errors = errors.concat(validateConstants({\n key: 'constants',\n value: style.constants,\n style: style,\n styleSpec: styleSpec\n }));\n }\n\n return sortErrors(errors);\n}\n\nvalidateStyleMin.source = wrapCleanErrors(require('./validate/validate_source'));\nvalidateStyleMin.light = wrapCleanErrors(require('./validate/validate_light'));\nvalidateStyleMin.layer = wrapCleanErrors(require('./validate/validate_layer'));\nvalidateStyleMin.filter = wrapCleanErrors(require('./validate/validate_filter'));\nvalidateStyleMin.paintProperty = wrapCleanErrors(require('./validate/validate_paint_property'));\nvalidateStyleMin.layoutProperty = wrapCleanErrors(require('./validate/validate_layout_property'));\n\nfunction sortErrors(errors) {\n return [].concat(errors).sort((a, b) => {\n return a.line - b.line;\n });\n}\n\nfunction wrapCleanErrors(inner) {\n return function() {\n return sortErrors(inner.apply(this, arguments));\n };\n}\n\nmodule.exports = validateStyleMin;\n","'use strict';\n\nclass AnimationLoop {\n constructor() {\n this.n = 0;\n this.times = [];\n }\n\n // Are all animations done?\n stopped() {\n this.times = this.times.filter((t) => {\n return t.time >= (new Date()).getTime();\n });\n return !this.times.length;\n }\n\n // Add a new animation that will run t milliseconds\n // Returns an id that can be used to cancel it layer\n set(t) {\n this.times.push({ id: this.n, time: t + (new Date()).getTime() });\n return this.n++;\n }\n\n // Cancel an animation\n cancel(n) {\n this.times = this.times.filter((t) => {\n return t.id !== n;\n });\n }\n}\n\nmodule.exports = AnimationLoop;\n","'use strict';\n\nconst Evented = require('../util/evented');\nconst ajax = require('../util/ajax');\nconst browser = require('../util/browser');\nconst normalizeURL = require('../util/mapbox').normalizeSpriteURL;\n\nclass SpritePosition {\n constructor() {\n this.x = 0;\n this.y = 0;\n this.width = 0;\n this.height = 0;\n this.pixelRatio = 1;\n this.sdf = false;\n }\n}\n\nclass ImageSprite extends Evented {\n\n constructor(base, eventedParent) {\n super();\n this.base = base;\n this.retina = browser.devicePixelRatio > 1;\n this.setEventedParent(eventedParent);\n\n const format = this.retina ? '@2x' : '';\n\n ajax.getJSON(normalizeURL(base, format, '.json'), (err, data) => {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n this.data = data;\n if (this.imgData) this.fire('data', {dataType: 'style'});\n });\n\n ajax.getImage(normalizeURL(base, format, '.png'), (err, img) => {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n this.imgData = browser.getImageData(img);\n\n // premultiply the sprite\n for (let i = 0; i < this.imgData.length; i += 4) {\n const alpha = this.imgData[i + 3] / 255;\n this.imgData[i + 0] *= alpha;\n this.imgData[i + 1] *= alpha;\n this.imgData[i + 2] *= alpha;\n }\n\n this.width = img.width;\n\n if (this.data) this.fire('data', {dataType: 'style'});\n });\n }\n\n toJSON() {\n return this.base;\n }\n\n loaded() {\n return !!(this.data && this.imgData);\n }\n\n resize(/*gl*/) {\n if (browser.devicePixelRatio > 1 !== this.retina) {\n const newSprite = new ImageSprite(this.base);\n newSprite.on('data', () => {\n this.data = newSprite.data;\n this.imgData = newSprite.imgData;\n this.width = newSprite.width;\n this.retina = newSprite.retina;\n });\n }\n }\n\n getSpritePosition(name) {\n if (!this.loaded()) return new SpritePosition();\n\n const pos = this.data && this.data[name];\n if (pos && this.imgData) return pos;\n\n return new SpritePosition();\n }\n}\n\nmodule.exports = ImageSprite;\n","'use strict';\n\nconst styleSpec = require('../style-spec/reference/latest');\nconst util = require('../util/util');\nconst Evented = require('../util/evented');\nconst validateStyle = require('./validate_style');\nconst StyleDeclaration = require('./style_declaration');\nconst StyleTransition = require('./style_transition');\n\nconst TRANSITION_SUFFIX = '-transition';\n\n/*\n * Represents the light used to light extruded features.\n */\nclass Light extends Evented {\n\n constructor(lightOptions) {\n super();\n this.properties = ['anchor', 'color', 'position', 'intensity'];\n this._specifications = styleSpec.light;\n this.set(lightOptions);\n }\n\n set(lightOpts) {\n if (this._validate(validateStyle.light, lightOpts)) return;\n this._declarations = {};\n this._transitions = {};\n this._transitionOptions = {};\n this.calculated = {};\n\n lightOpts = util.extend({\n anchor: this._specifications.anchor.default,\n color: this._specifications.color.default,\n position: this._specifications.position.default,\n intensity: this._specifications.intensity.default\n }, lightOpts);\n\n for (const prop of this.properties) {\n this._declarations[prop] = new StyleDeclaration(this._specifications[prop], lightOpts[prop]);\n }\n\n return this;\n }\n\n getLight() {\n return {\n anchor: this.getLightProperty('anchor'),\n color: this.getLightProperty('color'),\n position: this.getLightProperty('position'),\n intensity: this.getLightProperty('intensity')\n };\n }\n\n getLightProperty(property) {\n if (util.endsWith(property, TRANSITION_SUFFIX)) {\n return (\n this._transitionOptions[property]\n );\n } else {\n return (\n this._declarations[property] &&\n this._declarations[property].value\n );\n }\n }\n\n getLightValue(property, globalProperties) {\n if (property === 'position') {\n const calculated = this._transitions[property].calculate(globalProperties),\n cartesian = util.sphericalToCartesian(calculated);\n return {\n x: cartesian[0],\n y: cartesian[1],\n z: cartesian[2]\n };\n }\n\n return this._transitions[property].calculate(globalProperties);\n }\n\n setLight(options) {\n if (this._validate(validateStyle.light, options)) return;\n\n for (const key in options) {\n const value = options[key];\n\n if (util.endsWith(key, TRANSITION_SUFFIX)) {\n this._transitionOptions[key] = value;\n } else if (value === null || value === undefined) {\n delete this._declarations[key];\n } else {\n this._declarations[key] = new StyleDeclaration(this._specifications[key], value);\n }\n }\n }\n\n recalculate(zoom) {\n for (const property in this._declarations) {\n this.calculated[property] = this.getLightValue(property, {zoom: zoom});\n }\n }\n\n _applyLightDeclaration(property, declaration, options, globalOptions, animationLoop) {\n const oldTransition = options.transition ? this._transitions[property] : undefined;\n const spec = this._specifications[property];\n\n if (declaration === null || declaration === undefined) {\n declaration = new StyleDeclaration(spec, spec.default);\n }\n\n if (oldTransition && oldTransition.declaration.json === declaration.json) return;\n\n const transitionOptions = util.extend({\n duration: 300,\n delay: 0\n }, globalOptions, this.getLightProperty(property + TRANSITION_SUFFIX));\n const newTransition = this._transitions[property] =\n new StyleTransition(spec, declaration, oldTransition, transitionOptions);\n if (!newTransition.instant()) {\n newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now());\n }\n\n if (oldTransition) {\n animationLoop.cancel(oldTransition.loopID);\n }\n }\n\n updateLightTransitions(options, globalOptions, animationLoop) {\n let property;\n for (property in this._declarations) {\n this._applyLightDeclaration(property, this._declarations[property], options, globalOptions, animationLoop);\n }\n }\n\n _validate(validate, value) {\n return validateStyle.emitErrors(this, validate.call(validateStyle, util.extend({\n value: value,\n // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n style: {glyphs: true, sprite: true},\n styleSpec: styleSpec\n })));\n }\n}\n\nmodule.exports = Light;\n","'use strict';\n\nconst assert = require('assert');\nconst Evented = require('../util/evented');\nconst StyleLayer = require('./style_layer');\nconst ImageSprite = require('./image_sprite');\nconst Light = require('./light');\nconst GlyphSource = require('../symbol/glyph_source');\nconst SpriteAtlas = require('../symbol/sprite_atlas');\nconst LineAtlas = require('../render/line_atlas');\nconst util = require('../util/util');\nconst ajax = require('../util/ajax');\nconst mapbox = require('../util/mapbox');\nconst browser = require('../util/browser');\nconst Dispatcher = require('../util/dispatcher');\nconst AnimationLoop = require('./animation_loop');\nconst validateStyle = require('./validate_style');\nconst Source = require('../source/source');\nconst QueryFeatures = require('../source/query_features');\nconst SourceCache = require('../source/source_cache');\nconst styleSpec = require('../style-spec/reference/latest');\nconst MapboxGLFunction = require('../style-spec/function');\nconst getWorkerPool = require('../util/global_worker_pool');\nconst deref = require('../style-spec/deref');\nconst diff = require('../style-spec/diff');\nconst rtlTextPlugin = require('../source/rtl_text_plugin');\n\nconst supportedDiffOperations = util.pick(diff.operations, [\n 'addLayer',\n 'removeLayer',\n 'setPaintProperty',\n 'setLayoutProperty',\n 'setFilter',\n 'addSource',\n 'removeSource',\n 'setLayerZoomRange',\n 'setLight',\n 'setTransition'\n // 'setGlyphs',\n // 'setSprite',\n]);\n\nconst ignoredDiffOperations = util.pick(diff.operations, [\n 'setCenter',\n 'setZoom',\n 'setBearing',\n 'setPitch'\n]);\n\n/**\n * @private\n */\nclass Style extends Evented {\n\n constructor(stylesheet, map, options) {\n super();\n this.map = map;\n this.animationLoop = (map && map.animationLoop) || new AnimationLoop();\n this.dispatcher = new Dispatcher(getWorkerPool(), this);\n this.spriteAtlas = new SpriteAtlas(1024, 1024);\n this.spriteAtlas.setEventedParent(this);\n this.lineAtlas = new LineAtlas(256, 512);\n\n this._layers = {};\n this._order = [];\n this.sourceCaches = {};\n this.zoomHistory = {};\n this._loaded = false;\n\n util.bindAll(['_redoPlacement'], this);\n\n this._resetUpdates();\n\n options = util.extend({\n validate: typeof stylesheet === 'string' ? !mapbox.isMapboxURL(stylesheet) : true\n }, options);\n\n this.setEventedParent(map);\n this.fire('dataloading', {dataType: 'style'});\n\n const self = this;\n this._rtlTextPluginCallback = rtlTextPlugin.registerForPluginAvailability((args) => {\n self.dispatcher.broadcast('loadRTLTextPlugin', args.pluginBlobURL, args.errorCallback);\n for (const id in self.sourceCaches) {\n self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load\n }\n });\n\n const stylesheetLoaded = (err, stylesheet) => {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n if (options.validate && validateStyle.emitErrors(this, validateStyle(stylesheet))) return;\n\n this._loaded = true;\n this.stylesheet = stylesheet;\n\n this.updateClasses();\n\n for (const id in stylesheet.sources) {\n this.addSource(id, stylesheet.sources[id], options);\n }\n\n if (stylesheet.sprite) {\n this.sprite = new ImageSprite(stylesheet.sprite, this);\n }\n\n this.glyphSource = new GlyphSource(stylesheet.glyphs);\n this._resolve();\n this.fire('data', {dataType: 'style'});\n this.fire('style.load');\n };\n\n if (typeof stylesheet === 'string') {\n ajax.getJSON(mapbox.normalizeStyleURL(stylesheet), stylesheetLoaded);\n } else {\n browser.frame(stylesheetLoaded.bind(this, null, stylesheet));\n }\n\n this.on('data', (event) => {\n if (event.dataType === 'source' && event.sourceDataType === 'metadata') {\n const source = this.sourceCaches[event.sourceId].getSource();\n if (source && source.vectorLayerIds) {\n for (const layerId in this._layers) {\n const layer = this._layers[layerId];\n if (layer.source === source.id) {\n this._validateLayer(layer);\n }\n }\n }\n }\n });\n }\n\n _validateLayer(layer) {\n const sourceCache = this.sourceCaches[layer.source];\n\n if (!layer.sourceLayer) return;\n if (!sourceCache) return;\n const source = sourceCache.getSource();\n if (source.type === 'geojson' || (source.vectorLayerIds &&\n source.vectorLayerIds.indexOf(layer.sourceLayer) === -1)) {\n this.fire('error', {\n error: new Error(\n `Source layer \"${layer.sourceLayer}\" ` +\n `does not exist on source \"${source.id}\" ` +\n `as specified by style layer \"${layer.id}\"`\n )\n });\n }\n }\n\n loaded() {\n if (!this._loaded)\n return false;\n\n if (Object.keys(this._updatedSources).length)\n return false;\n\n for (const id in this.sourceCaches)\n if (!this.sourceCaches[id].loaded())\n return false;\n\n if (this.sprite && !this.sprite.loaded())\n return false;\n\n return true;\n }\n\n _resolve() {\n const layers = deref(this.stylesheet.layers);\n\n this._order = layers.map((layer) => layer.id);\n\n this._layers = {};\n for (let layer of layers) {\n layer = StyleLayer.create(layer);\n layer.setEventedParent(this, {layer: {id: layer.id}});\n this._layers[layer.id] = layer;\n }\n\n this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order));\n\n this.light = new Light(this.stylesheet.light);\n }\n\n _serializeLayers(ids) {\n return ids.map((id) => this._layers[id].serialize());\n }\n\n _applyClasses(classes, options) {\n if (!this._loaded) return;\n\n classes = classes || [];\n options = options || {transition: true};\n const transition = this.stylesheet.transition || {};\n\n const layers = this._updatedAllPaintProps ? this._layers : this._updatedPaintProps;\n\n for (const id in layers) {\n const layer = this._layers[id];\n const props = this._updatedPaintProps[id];\n\n if (this._updatedAllPaintProps || props.all) {\n layer.updatePaintTransitions(classes, options, transition, this.animationLoop, this.zoomHistory);\n } else {\n for (const paintName in props) {\n this._layers[id].updatePaintTransition(paintName, classes, options, transition, this.animationLoop, this.zoomHistory);\n }\n }\n }\n\n this.light.updateLightTransitions(options, transition, this.animationLoop);\n }\n\n _recalculate(z) {\n if (!this._loaded) return;\n\n for (const sourceId in this.sourceCaches)\n this.sourceCaches[sourceId].used = false;\n\n this._updateZoomHistory(z);\n\n for (const layerId of this._order) {\n const layer = this._layers[layerId];\n\n layer.recalculate(z);\n if (!layer.isHidden(z) && layer.source) {\n this.sourceCaches[layer.source].used = true;\n }\n }\n\n this.light.recalculate(z);\n\n const maxZoomTransitionDuration = 300;\n if (Math.floor(this.z) !== Math.floor(z)) {\n this.animationLoop.set(maxZoomTransitionDuration);\n }\n\n this.z = z;\n }\n\n _updateZoomHistory(z) {\n\n const zh = this.zoomHistory;\n\n if (zh.lastIntegerZoom === undefined) {\n // first time\n zh.lastIntegerZoom = Math.floor(z);\n zh.lastIntegerZoomTime = 0;\n zh.lastZoom = z;\n }\n\n // check whether an integer zoom level as passed since the last frame\n // and if yes, record it with the time. Used for transitioning patterns.\n if (Math.floor(zh.lastZoom) < Math.floor(z)) {\n zh.lastIntegerZoom = Math.floor(z);\n zh.lastIntegerZoomTime = Date.now();\n\n } else if (Math.floor(zh.lastZoom) > Math.floor(z)) {\n zh.lastIntegerZoom = Math.floor(z + 1);\n zh.lastIntegerZoomTime = Date.now();\n }\n\n zh.lastZoom = z;\n }\n\n _checkLoaded () {\n if (!this._loaded) {\n throw new Error('Style is not done loading');\n }\n }\n\n /**\n * Apply queued style updates in a batch\n */\n update(classes, options) {\n if (!this._changed) return;\n\n const updatedIds = Object.keys(this._updatedLayers);\n const removedIds = Object.keys(this._removedLayers);\n\n if (updatedIds.length || removedIds.length || this._updatedSymbolOrder) {\n this._updateWorkerLayers(updatedIds, removedIds);\n }\n for (const id in this._updatedSources) {\n const action = this._updatedSources[id];\n assert(action === 'reload' || action === 'clear');\n if (action === 'reload') {\n this._reloadSource(id);\n } else if (action === 'clear') {\n this._clearSource(id);\n }\n }\n\n this._applyClasses(classes, options);\n this._resetUpdates();\n\n this.fire('data', {dataType: 'style'});\n }\n\n _updateWorkerLayers(updatedIds, removedIds) {\n const symbolOrder = this._updatedSymbolOrder ? this._order.filter((id) => this._layers[id].type === 'symbol') : null;\n\n this.dispatcher.broadcast('updateLayers', {\n layers: this._serializeLayers(updatedIds),\n removedIds: removedIds,\n symbolOrder: symbolOrder\n });\n }\n\n _resetUpdates() {\n this._changed = false;\n\n this._updatedLayers = {};\n this._removedLayers = {};\n this._updatedSymbolOrder = false;\n\n this._updatedSources = {};\n\n this._updatedPaintProps = {};\n this._updatedAllPaintProps = false;\n }\n\n /**\n * Update this style's state to match the given style JSON, performing only\n * the necessary mutations.\n *\n * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec\n * diff algorithm produces an operation that is not supported.\n *\n * @returns {boolean} true if any changes were made; false otherwise\n * @private\n */\n setState(nextState) {\n this._checkLoaded();\n\n if (validateStyle.emitErrors(this, validateStyle(nextState))) return false;\n\n nextState = util.extend({}, nextState);\n nextState.layers = deref(nextState.layers);\n\n const changes = diff(this.serialize(), nextState)\n .filter(op => !(op.command in ignoredDiffOperations));\n\n if (changes.length === 0) {\n return false;\n }\n\n const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations));\n if (unimplementedOps.length > 0) {\n throw new Error(`Unimplemented: ${unimplementedOps.map(op => op.command).join(', ')}.`);\n }\n\n changes.forEach((op) => {\n if (op.command === 'setTransition') {\n // `transition` is always read directly off of\n // `this.stylesheet`, which we update below\n return;\n }\n this[op.command].apply(this, op.args);\n });\n\n this.stylesheet = nextState;\n\n return true;\n }\n\n addSource(id, source, options) {\n this._checkLoaded();\n\n if (this.sourceCaches[id] !== undefined) {\n throw new Error('There is already a source with this ID');\n }\n\n if (!source.type) {\n throw new Error(`The type property must be defined, but the only the following properties were given: ${Object.keys(source)}.`);\n }\n\n const builtIns = ['vector', 'raster', 'geojson', 'video', 'image', 'canvas'];\n const shouldValidate = builtIns.indexOf(source.type) >= 0;\n if (shouldValidate && this._validate(validateStyle.source, `sources.${id}`, source, null, options)) return;\n\n const sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher);\n sourceCache.style = this;\n sourceCache.setEventedParent(this, () => ({\n isSourceLoaded: this.loaded(),\n source: sourceCache.serialize(),\n sourceId: id\n }));\n\n sourceCache.onAdd(this.map);\n this._changed = true;\n }\n\n /**\n * Remove a source from this stylesheet, given its id.\n * @param {string} id id of the source to remove\n * @throws {Error} if no source is found with the given ID\n */\n removeSource(id) {\n this._checkLoaded();\n\n if (this.sourceCaches[id] === undefined) {\n throw new Error('There is no source with this ID');\n }\n const sourceCache = this.sourceCaches[id];\n delete this.sourceCaches[id];\n delete this._updatedSources[id];\n sourceCache.setEventedParent(null);\n sourceCache.clearTiles();\n\n if (sourceCache.onRemove) sourceCache.onRemove(this.map);\n this._changed = true;\n }\n\n /**\n * Get a source by id.\n * @param {string} id id of the desired source\n * @returns {Object} source\n */\n getSource(id) {\n return this.sourceCaches[id] && this.sourceCaches[id].getSource();\n }\n\n /**\n * Add a layer to the map style. The layer will be inserted before the layer with\n * ID `before`, or appended if `before` is omitted.\n * @param {StyleLayer|Object} layer\n * @param {string=} before ID of an existing layer to insert before\n */\n addLayer(layerObject, before, options) {\n this._checkLoaded();\n\n const id = layerObject.id;\n\n if (typeof layerObject.source === 'object') {\n this.addSource(id, layerObject.source);\n layerObject = util.extend(layerObject, { source: id });\n }\n\n // this layer is not in the style.layers array, so we pass an impossible array index\n if (this._validate(validateStyle.layer,\n `layers.${id}`, layerObject, {arrayIndex: -1}, options)) return;\n\n const layer = StyleLayer.create(layerObject);\n this._validateLayer(layer);\n\n layer.setEventedParent(this, {layer: {id: id}});\n\n const index = before ? this._order.indexOf(before) : this._order.length;\n this._order.splice(index, 0, id);\n\n this._layers[id] = layer;\n\n if (this._removedLayers[id] && layer.source) {\n // If, in the current batch, we have already removed this layer\n // and we are now re-adding it with a different `type`, then we\n // need to clear (rather than just reload) the underyling source's\n // tiles. Otherwise, tiles marked 'reloading' will have buckets /\n // buffers that are set up for the _previous_ version of this\n // layer, causing, e.g.:\n // https://github.com/mapbox/mapbox-gl-js/issues/3633\n const removed = this._removedLayers[id];\n delete this._removedLayers[id];\n this._updatedSources[layer.source] = removed.type !== layer.type ? 'clear' : 'reload';\n }\n this._updateLayer(layer);\n\n if (layer.type === 'symbol') {\n this._updatedSymbolOrder = true;\n }\n\n this.updateClasses(id);\n }\n\n /**\n * Add a layer to the map style. The layer will be inserted before the layer with\n * ID `before`, or appended if `before` is omitted.\n * @param {StyleLayer|Object} layer\n * @param {string=} before ID of an existing layer to insert before\n */\n moveLayer(id, before) {\n this._checkLoaded();\n this._changed = true;\n\n const layer = this._layers[id];\n if (!layer) {\n this.fire('error', {\n error: new Error(\n `The layer '${id}' does not exist in ` +\n `the map's style and cannot be moved.`\n )\n });\n return;\n }\n\n const index = this._order.indexOf(id);\n this._order.splice(index, 1);\n\n const newIndex = before ? this._order.indexOf(before) : this._order.length;\n this._order.splice(newIndex, 0, id);\n\n if (layer.type === 'symbol') {\n this._updatedSymbolOrder = true;\n if (layer.source && !this._updatedSources[layer.source]) {\n this._updatedSources[layer.source] = 'reload';\n }\n }\n }\n\n /**\n * Remove a layer from this stylesheet, given its id.\n * @param {string} id id of the layer to remove\n * @throws {Error} if no layer is found with the given ID\n */\n removeLayer(id) {\n this._checkLoaded();\n\n const layer = this._layers[id];\n if (!layer) {\n this.fire('error', {\n error: new Error(\n `The layer '${id}' does not exist in ` +\n `the map's style and cannot be removed.`\n )\n });\n return;\n }\n\n layer.setEventedParent(null);\n\n const index = this._order.indexOf(id);\n this._order.splice(index, 1);\n\n if (layer.type === 'symbol') {\n this._updatedSymbolOrder = true;\n }\n\n this._changed = true;\n this._removedLayers[id] = layer;\n delete this._layers[id];\n delete this._updatedLayers[id];\n delete this._updatedPaintProps[id];\n }\n\n /**\n * Return the style layer object with the given `id`.\n *\n * @param {string} id - id of the desired layer\n * @returns {?Object} a layer, if one with the given `id` exists\n */\n getLayer(id) {\n return this._layers[id];\n }\n\n setLayerZoomRange(layerId, minzoom, maxzoom) {\n this._checkLoaded();\n\n const layer = this.getLayer(layerId);\n if (!layer) {\n this.fire('error', {\n error: new Error(\n `The layer '${layerId}' does not exist in ` +\n `the map's style and cannot have zoom extent.`\n )\n });\n return;\n }\n\n if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return;\n\n if (minzoom != null) {\n layer.minzoom = minzoom;\n }\n if (maxzoom != null) {\n layer.maxzoom = maxzoom;\n }\n this._updateLayer(layer);\n }\n\n setFilter(layerId, filter) {\n this._checkLoaded();\n\n const layer = this.getLayer(layerId);\n if (!layer) {\n this.fire('error', {\n error: new Error(\n `The layer '${layerId}' does not exist in ` +\n `the map's style and cannot be filtered.`\n )\n });\n return;\n }\n\n if (filter !== null && filter !== undefined && this._validate(validateStyle.filter, `layers.${layer.id}.filter`, filter)) return;\n\n if (util.deepEqual(layer.filter, filter)) return;\n layer.filter = util.clone(filter);\n\n this._updateLayer(layer);\n }\n\n /**\n * Get a layer's filter object\n * @param {string} layer the layer to inspect\n * @returns {*} the layer's filter, if any\n */\n getFilter(layer) {\n return util.clone(this.getLayer(layer).filter);\n }\n\n setLayoutProperty(layerId, name, value) {\n this._checkLoaded();\n\n const layer = this.getLayer(layerId);\n if (!layer) {\n this.fire('error', {\n error: new Error(\n `The layer '${layerId}' does not exist in ` +\n `the map's style and cannot be styled.`\n )\n });\n return;\n }\n\n if (util.deepEqual(layer.getLayoutProperty(name), value)) return;\n\n layer.setLayoutProperty(name, value);\n this._updateLayer(layer);\n }\n\n /**\n * Get a layout property's value from a given layer\n * @param {string} layer the layer to inspect\n * @param {string} name the name of the layout property\n * @returns {*} the property value\n */\n getLayoutProperty(layer, name) {\n return this.getLayer(layer).getLayoutProperty(name);\n }\n\n setPaintProperty(layerId, name, value, klass) {\n this._checkLoaded();\n\n const layer = this.getLayer(layerId);\n if (!layer) {\n this.fire('error', {\n error: new Error(\n `The layer '${layerId}' does not exist in ` +\n `the map's style and cannot be styled.`\n )\n });\n return;\n }\n\n if (util.deepEqual(layer.getPaintProperty(name, klass), value)) return;\n\n const wasFeatureConstant = layer.isPaintValueFeatureConstant(name);\n layer.setPaintProperty(name, value, klass);\n\n const isFeatureConstant = !(\n value &&\n MapboxGLFunction.isFunctionDefinition(value) &&\n value.property !== '$zoom' &&\n value.property !== undefined\n );\n\n if (!isFeatureConstant || !wasFeatureConstant) {\n this._updateLayer(layer);\n }\n\n this.updateClasses(layerId, name);\n }\n\n getPaintProperty(layer, name, klass) {\n return this.getLayer(layer).getPaintProperty(name, klass);\n }\n\n getTransition() {\n return util.extend({ duration: 300, delay: 0 },\n this.stylesheet && this.stylesheet.transition);\n }\n\n updateClasses(layerId, paintName) {\n this._changed = true;\n if (!layerId) {\n this._updatedAllPaintProps = true;\n } else {\n const props = this._updatedPaintProps;\n if (!props[layerId]) props[layerId] = {};\n props[layerId][paintName || 'all'] = true;\n }\n }\n\n serialize() {\n return util.filterObject({\n version: this.stylesheet.version,\n name: this.stylesheet.name,\n metadata: this.stylesheet.metadata,\n light: this.stylesheet.light,\n center: this.stylesheet.center,\n zoom: this.stylesheet.zoom,\n bearing: this.stylesheet.bearing,\n pitch: this.stylesheet.pitch,\n sprite: this.stylesheet.sprite,\n glyphs: this.stylesheet.glyphs,\n transition: this.stylesheet.transition,\n sources: util.mapObject(this.sourceCaches, (source) => source.serialize()),\n layers: this._order.map((id) => this._layers[id].serialize())\n }, (value) => { return value !== undefined; });\n }\n\n _updateLayer(layer) {\n this._updatedLayers[layer.id] = true;\n if (layer.source && !this._updatedSources[layer.source]) {\n this._updatedSources[layer.source] = 'reload';\n }\n this._changed = true;\n }\n\n _flattenRenderedFeatures(sourceResults) {\n const features = [];\n for (let l = this._order.length - 1; l >= 0; l--) {\n const layerId = this._order[l];\n for (const sourceResult of sourceResults) {\n const layerFeatures = sourceResult[layerId];\n if (layerFeatures) {\n for (const feature of layerFeatures) {\n features.push(feature);\n }\n }\n }\n }\n return features;\n }\n\n queryRenderedFeatures(queryGeometry, params, zoom, bearing) {\n if (params && params.filter) {\n this._validate(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter);\n }\n\n const includedSources = {};\n if (params && params.layers) {\n if (!Array.isArray(params.layers)) {\n this.fire('error', {error: 'parameters.layers must be an Array.'});\n return;\n }\n for (const layerId of params.layers) {\n const layer = this._layers[layerId];\n if (!layer) {\n // this layer is not in the style.layers array\n this.fire('error', {error: `The layer '${layerId\n }' does not exist in the map's style and cannot be queried for features.`});\n return;\n }\n includedSources[layer.source] = true;\n }\n }\n\n const sourceResults = [];\n for (const id in this.sourceCaches) {\n if (params.layers && !includedSources[id]) continue;\n const results = QueryFeatures.rendered(this.sourceCaches[id], this._layers, queryGeometry, params, zoom, bearing);\n sourceResults.push(results);\n }\n return this._flattenRenderedFeatures(sourceResults);\n }\n\n querySourceFeatures(sourceID, params) {\n if (params && params.filter) {\n this._validate(validateStyle.filter, 'querySourceFeatures.filter', params.filter);\n }\n const sourceCache = this.sourceCaches[sourceID];\n return sourceCache ? QueryFeatures.source(sourceCache, params) : [];\n }\n\n addSourceType(name, SourceType, callback) {\n if (Source.getType(name)) {\n return callback(new Error(`A source type called \"${name}\" already exists.`));\n }\n\n Source.setType(name, SourceType);\n\n if (!SourceType.workerSourceURL) {\n return callback(null, null);\n }\n\n this.dispatcher.broadcast('loadWorkerSource', {\n name: name,\n url: SourceType.workerSourceURL\n }, callback);\n }\n\n getLight() {\n return this.light.getLight();\n }\n\n setLight(lightOptions, transitionOptions) {\n this._checkLoaded();\n\n const light = this.light.getLight();\n let _update = false;\n for (const key in lightOptions) {\n if (!util.deepEqual(lightOptions[key], light[key])) {\n _update = true;\n break;\n }\n }\n if (!_update) return;\n\n const transition = this.stylesheet.transition || {};\n\n this.light.setLight(lightOptions);\n this.light.updateLightTransitions(transitionOptions || {transition: true}, transition, this.animationLoop);\n }\n\n _validate(validate, key, value, props, options) {\n if (options && options.validate === false) {\n return false;\n }\n return validateStyle.emitErrors(this, validate.call(validateStyle, util.extend({\n key: key,\n style: this.serialize(),\n value: value,\n styleSpec: styleSpec\n }, props)));\n }\n\n _remove() {\n rtlTextPlugin.evented.off('pluginAvailable', this._rtlTextPluginCallback);\n for (const id in this.sourceCaches) {\n this.sourceCaches[id].clearTiles();\n }\n this.dispatcher.remove();\n }\n\n _clearSource(id) {\n this.sourceCaches[id].clearTiles();\n }\n\n _reloadSource(id) {\n this.sourceCaches[id].reload();\n }\n\n _updateSources(transform) {\n for (const id in this.sourceCaches) {\n this.sourceCaches[id].update(transform);\n }\n }\n\n _redoPlacement() {\n for (const id in this.sourceCaches) {\n this.sourceCaches[id].redoPlacement();\n }\n }\n\n // Callbacks from web workers\n\n getIcons(mapId, params, callback) {\n const updateSpriteAtlas = () => {\n this.spriteAtlas.setSprite(this.sprite);\n this.spriteAtlas.addIcons(params.icons, callback);\n };\n if (!this.sprite || this.sprite.loaded()) {\n updateSpriteAtlas();\n } else {\n this.sprite.on('data', updateSpriteAtlas);\n }\n }\n\n getGlyphs(mapId, params, callback) {\n const stacks = params.stacks;\n let remaining = Object.keys(stacks).length;\n const allGlyphs = {};\n\n for (const fontName in stacks) {\n this.glyphSource.getSimpleGlyphs(fontName, stacks[fontName], params.uid, done);\n }\n\n function done(err, glyphs, fontName) {\n if (err) console.error(err);\n\n allGlyphs[fontName] = glyphs;\n remaining--;\n\n if (remaining === 0)\n callback(null, allGlyphs);\n }\n }\n}\n\nmodule.exports = Style;\n","'use strict';\n\nconst createFunction = require('../style-spec/function');\nconst util = require('../util/util');\n\nclass StyleDeclaration {\n\n constructor(reference, value) {\n this.value = util.clone(value);\n this.isFunction = createFunction.isFunctionDefinition(value);\n\n // immutable representation of value. used for comparison\n this.json = JSON.stringify(this.value);\n\n this.minimum = reference.minimum;\n this.function = createFunction(this.value, reference);\n this.isFeatureConstant = this.function.isFeatureConstant;\n this.isZoomConstant = this.function.isZoomConstant;\n\n if (!this.isFeatureConstant && !this.isZoomConstant) {\n this.stopZoomLevels = [];\n const interpolationAmountStops = [];\n for (const stop of this.value.stops) {\n const zoom = stop[0].zoom;\n if (this.stopZoomLevels.indexOf(zoom) < 0) {\n this.stopZoomLevels.push(zoom);\n interpolationAmountStops.push([zoom, interpolationAmountStops.length]);\n }\n }\n\n this.functionInterpolationT = createFunction({\n type: 'exponential',\n stops: interpolationAmountStops,\n base: value.base\n }, {\n type: 'number'\n });\n }\n }\n\n calculate(globalProperties, featureProperties) {\n const value = this.function(globalProperties && globalProperties.zoom, featureProperties || {});\n if (this.minimum !== undefined && value < this.minimum) {\n return this.minimum;\n }\n return value;\n }\n\n calculateInterpolationT(globalProperties, featureProperties) {\n return this.functionInterpolationT(globalProperties && globalProperties.zoom, featureProperties || {});\n }\n}\n\nmodule.exports = StyleDeclaration;\n","'use strict';\n\nconst util = require('../util/util');\nconst StyleTransition = require('./style_transition');\nconst StyleDeclaration = require('./style_declaration');\nconst styleSpec = require('../style-spec/reference/latest');\nconst validateStyle = require('./validate_style');\nconst parseColor = require('./../style-spec/util/parse_color');\nconst Evented = require('../util/evented');\n\nconst TRANSITION_SUFFIX = '-transition';\n\nclass StyleLayer extends Evented {\n constructor(layer) {\n super();\n\n this.id = layer.id;\n this.metadata = layer.metadata;\n this.type = layer.type;\n this.source = layer.source;\n this.sourceLayer = layer['source-layer'];\n this.minzoom = layer.minzoom;\n this.maxzoom = layer.maxzoom;\n this.filter = layer.filter;\n\n this.paint = {};\n this.layout = {};\n\n this._paintSpecifications = styleSpec[`paint_${this.type}`];\n this._layoutSpecifications = styleSpec[`layout_${this.type}`];\n\n this._paintTransitions = {}; // {[propertyName]: StyleTransition}\n this._paintTransitionOptions = {}; // {[className]: {[propertyName]: { duration:Number, delay:Number }}}\n this._paintDeclarations = {}; // {[className]: {[propertyName]: StyleDeclaration}}\n this._layoutDeclarations = {}; // {[propertyName]: StyleDeclaration}\n this._layoutFunctions = {}; // {[propertyName]: Boolean}\n\n let paintName, layoutName;\n const options = {validate: false};\n\n // Resolve paint declarations\n for (const key in layer) {\n const match = key.match(/^paint(?:\\.(.*))?$/);\n if (match) {\n const klass = match[1] || '';\n for (paintName in layer[key]) {\n this.setPaintProperty(paintName, layer[key][paintName], klass, options);\n }\n }\n }\n\n // Resolve layout declarations\n for (layoutName in layer.layout) {\n this.setLayoutProperty(layoutName, layer.layout[layoutName], options);\n }\n\n // set initial layout/paint values\n for (paintName in this._paintSpecifications) {\n this.paint[paintName] = this.getPaintValue(paintName);\n }\n for (layoutName in this._layoutSpecifications) {\n this._updateLayoutValue(layoutName);\n }\n }\n\n setLayoutProperty(name, value, options) {\n\n if (value == null) {\n delete this._layoutDeclarations[name];\n } else {\n const key = `layers.${this.id}.layout.${name}`;\n if (this._validate(validateStyle.layoutProperty, key, name, value, options)) return;\n this._layoutDeclarations[name] = new StyleDeclaration(this._layoutSpecifications[name], value);\n }\n this._updateLayoutValue(name);\n }\n\n getLayoutProperty(name) {\n return (\n this._layoutDeclarations[name] &&\n this._layoutDeclarations[name].value\n );\n }\n\n getLayoutValue(name, globalProperties, featureProperties) {\n const specification = this._layoutSpecifications[name];\n const declaration = this._layoutDeclarations[name];\n\n if (declaration) {\n return declaration.calculate(globalProperties, featureProperties);\n } else {\n return specification.default;\n }\n }\n\n setPaintProperty(name, value, klass, options) {\n const validateStyleKey = `layers.${this.id}${klass ? `[\"paint.${klass}\"].` : '.paint.'}${name}`;\n\n if (util.endsWith(name, TRANSITION_SUFFIX)) {\n if (!this._paintTransitionOptions[klass || '']) {\n this._paintTransitionOptions[klass || ''] = {};\n }\n if (value === null || value === undefined) {\n delete this._paintTransitionOptions[klass || ''][name];\n } else {\n if (this._validate(validateStyle.paintProperty, validateStyleKey, name, value, options)) return;\n this._paintTransitionOptions[klass || ''][name] = value;\n }\n } else {\n if (!this._paintDeclarations[klass || '']) {\n this._paintDeclarations[klass || ''] = {};\n }\n if (value === null || value === undefined) {\n delete this._paintDeclarations[klass || ''][name];\n } else {\n if (this._validate(validateStyle.paintProperty, validateStyleKey, name, value, options)) return;\n this._paintDeclarations[klass || ''][name] = new StyleDeclaration(this._paintSpecifications[name], value);\n }\n }\n }\n\n getPaintProperty(name, klass) {\n klass = klass || '';\n if (util.endsWith(name, TRANSITION_SUFFIX)) {\n return (\n this._paintTransitionOptions[klass] &&\n this._paintTransitionOptions[klass][name]\n );\n } else {\n return (\n this._paintDeclarations[klass] &&\n this._paintDeclarations[klass][name] &&\n this._paintDeclarations[klass][name].value\n );\n }\n }\n\n getPaintValue(name, globalProperties, featureProperties) {\n const specification = this._paintSpecifications[name];\n const transition = this._paintTransitions[name];\n\n if (transition) {\n return transition.calculate(globalProperties, featureProperties);\n } else if (specification.type === 'color' && specification.default) {\n return parseColor(specification.default);\n } else {\n return specification.default;\n }\n }\n\n getPaintValueStopZoomLevels(name) {\n const transition = this._paintTransitions[name];\n if (transition) {\n return transition.declaration.stopZoomLevels;\n } else {\n return [];\n }\n }\n\n getPaintInterpolationT(name, globalProperties) {\n const transition = this._paintTransitions[name];\n return transition.declaration.calculateInterpolationT(globalProperties);\n }\n\n isPaintValueFeatureConstant(name) {\n const transition = this._paintTransitions[name];\n\n if (transition) {\n return transition.declaration.isFeatureConstant;\n } else {\n return true;\n }\n }\n\n isLayoutValueFeatureConstant(name) {\n const declaration = this._layoutDeclarations[name];\n\n if (declaration) {\n return declaration.isFeatureConstant;\n } else {\n return true;\n }\n }\n\n isPaintValueZoomConstant(name) {\n const transition = this._paintTransitions[name];\n\n if (transition) {\n return transition.declaration.isZoomConstant;\n } else {\n return true;\n }\n }\n\n isHidden(zoom) {\n if (this.minzoom && zoom < this.minzoom) return true;\n if (this.maxzoom && zoom >= this.maxzoom) return true;\n if (this.layout['visibility'] === 'none') return true;\n\n return false;\n }\n\n updatePaintTransitions(classes, options, globalOptions, animationLoop, zoomHistory) {\n const declarations = util.extend({}, this._paintDeclarations['']);\n for (let i = 0; i < classes.length; i++) {\n util.extend(declarations, this._paintDeclarations[classes[i]]);\n }\n\n let name;\n for (name in declarations) { // apply new declarations\n this._applyPaintDeclaration(name, declarations[name], options, globalOptions, animationLoop, zoomHistory);\n }\n for (name in this._paintTransitions) {\n if (!(name in declarations)) // apply removed declarations\n this._applyPaintDeclaration(name, null, options, globalOptions, animationLoop, zoomHistory);\n }\n }\n\n updatePaintTransition(name, classes, options, globalOptions, animationLoop, zoomHistory) {\n let declaration = this._paintDeclarations[''][name];\n for (let i = 0; i < classes.length; i++) {\n const classPaintDeclarations = this._paintDeclarations[classes[i]];\n if (classPaintDeclarations && classPaintDeclarations[name]) {\n declaration = classPaintDeclarations[name];\n }\n }\n this._applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop, zoomHistory);\n }\n\n // update all zoom-dependent layout/paint values\n recalculate(zoom) {\n for (const paintName in this._paintTransitions) {\n this.paint[paintName] = this.getPaintValue(paintName, {zoom: zoom});\n }\n for (const layoutName in this._layoutFunctions) {\n this.layout[layoutName] = this.getLayoutValue(layoutName, {zoom: zoom});\n }\n }\n\n serialize() {\n const output = {\n 'id': this.id,\n 'type': this.type,\n 'source': this.source,\n 'source-layer': this.sourceLayer,\n 'metadata': this.metadata,\n 'minzoom': this.minzoom,\n 'maxzoom': this.maxzoom,\n 'filter': this.filter,\n 'layout': util.mapObject(this._layoutDeclarations, getDeclarationValue)\n };\n\n for (const klass in this._paintDeclarations) {\n const key = klass === '' ? 'paint' : `paint.${klass}`;\n output[key] = util.mapObject(this._paintDeclarations[klass], getDeclarationValue);\n }\n\n return util.filterObject(output, (value, key) => {\n return value !== undefined && !(key === 'layout' && !Object.keys(value).length);\n });\n }\n\n // set paint transition based on a given paint declaration\n _applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop, zoomHistory) {\n const oldTransition = options.transition ? this._paintTransitions[name] : undefined;\n const spec = this._paintSpecifications[name];\n\n if (declaration === null || declaration === undefined) {\n declaration = new StyleDeclaration(spec, spec.default);\n }\n\n if (oldTransition && oldTransition.declaration.json === declaration.json) return;\n\n const transitionOptions = util.extend({\n duration: 300,\n delay: 0\n }, globalOptions, this.getPaintProperty(name + TRANSITION_SUFFIX));\n\n const newTransition = this._paintTransitions[name] =\n new StyleTransition(spec, declaration, oldTransition, transitionOptions, zoomHistory);\n\n if (!newTransition.instant()) {\n newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now());\n }\n if (oldTransition) {\n animationLoop.cancel(oldTransition.loopID);\n }\n }\n\n // update layout value if it's constant, or mark it as zoom-dependent\n _updateLayoutValue(name) {\n const declaration = this._layoutDeclarations[name];\n\n if (declaration && declaration.isFunction) {\n this._layoutFunctions[name] = true;\n } else {\n delete this._layoutFunctions[name];\n this.layout[name] = this.getLayoutValue(name);\n }\n }\n\n _validate(validate, key, name, value, options) {\n if (options && options.validate === false) {\n return false;\n }\n return validateStyle.emitErrors(this, validate.call(validateStyle, {\n key: key,\n layerType: this.type,\n objectKey: name,\n value: value,\n styleSpec: styleSpec,\n // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407\n style: {glyphs: true, sprite: true}\n }));\n }\n}\n\nmodule.exports = StyleLayer;\n\nconst subclasses = {\n 'circle': require('./style_layer/circle_style_layer'),\n 'fill': require('./style_layer/fill_style_layer'),\n 'fill-extrusion': require('./style_layer/fill_extrusion_style_layer'),\n 'line': require('./style_layer/line_style_layer'),\n 'symbol': require('./style_layer/symbol_style_layer')\n};\n\nStyleLayer.create = function(layer) {\n const LayerClass = subclasses[layer.type] || StyleLayer;\n return new LayerClass(layer);\n};\n\nfunction getDeclarationValue(declaration) {\n return declaration.value;\n}\n","'use strict';\n\nconst StyleLayer = require('../style_layer');\nconst CircleBucket = require('../../data/bucket/circle_bucket');\n\nclass CircleStyleLayer extends StyleLayer {\n createBucket(options) {\n return new CircleBucket(options);\n }\n}\n\nmodule.exports = CircleStyleLayer;\n","'use strict';\n\nconst StyleLayer = require('../style_layer');\nconst FillExtrusionBucket = require('../../data/bucket/fill_extrusion_bucket');\n\nclass FillExtrusionStyleLayer extends StyleLayer {\n\n getPaintValue(name, globalProperties, featureProperties) {\n const value = super.getPaintValue(name, globalProperties, featureProperties);\n if (name === 'fill-extrusion-color' && value) {\n value[3] = 1;\n }\n return value;\n }\n\n createBucket(options) {\n return new FillExtrusionBucket(options);\n }\n}\n\nmodule.exports = FillExtrusionStyleLayer;\n","'use strict';\n\nconst StyleLayer = require('../style_layer');\nconst FillBucket = require('../../data/bucket/fill_bucket');\n\nclass FillStyleLayer extends StyleLayer {\n\n getPaintValue(name, globalProperties, featureProperties) {\n if (name === 'fill-outline-color') {\n // Special-case handling of undefined fill-outline-color values\n if (this.getPaintProperty('fill-outline-color') === undefined) {\n return super.getPaintValue('fill-color', globalProperties, featureProperties);\n }\n\n // Handle transitions from fill-outline-color: undefined\n let transition = this._paintTransitions['fill-outline-color'];\n while (transition) {\n const declaredValue = (\n transition &&\n transition.declaration &&\n transition.declaration.value\n );\n\n if (!declaredValue) {\n return super.getPaintValue('fill-color', globalProperties, featureProperties);\n }\n\n transition = transition.oldTransition;\n }\n }\n\n return super.getPaintValue(name, globalProperties, featureProperties);\n }\n\n getPaintValueStopZoomLevels(name) {\n if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n return super.getPaintValueStopZoomLevels('fill-color');\n } else {\n return super.getPaintValueStopZoomLevels(name);\n }\n }\n\n getPaintInterpolationT(name, globalProperties) {\n if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n return super.getPaintInterpolationT('fill-color', globalProperties);\n } else {\n return super.getPaintInterpolationT(name, globalProperties);\n }\n }\n\n isPaintValueFeatureConstant(name) {\n if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n return super.isPaintValueFeatureConstant('fill-color');\n } else {\n return super.isPaintValueFeatureConstant(name);\n }\n }\n\n isPaintValueZoomConstant(name) {\n if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) {\n return super.isPaintValueZoomConstant('fill-color');\n } else {\n return super.isPaintValueZoomConstant(name);\n }\n }\n\n createBucket(options) {\n return new FillBucket(options);\n }\n}\n\nmodule.exports = FillStyleLayer;\n","'use strict';\n\nconst StyleLayer = require('../style_layer');\nconst LineBucket = require('../../data/bucket/line_bucket');\nconst util = require('../../util/util');\n\nclass LineStyleLayer extends StyleLayer {\n\n getPaintValue(name, globalProperties, featureProperties) {\n const value = super.getPaintValue(name, globalProperties, featureProperties);\n\n // If the line is dashed, scale the dash lengths by the line\n // width at the previous round zoom level.\n if (value && name === 'line-dasharray') {\n const width = this.getPaintValue('line-width',\n util.extend({}, globalProperties, {zoom: Math.floor(globalProperties.zoom)}), featureProperties);\n value.fromScale *= width;\n value.toScale *= width;\n }\n\n return value;\n }\n\n createBucket(options) {\n return new LineBucket(options);\n }\n}\n\nmodule.exports = LineStyleLayer;\n","'use strict';\n\nconst StyleLayer = require('../style_layer');\nconst SymbolBucket = require('../../data/bucket/symbol_bucket');\n\nclass SymbolStyleLayer extends StyleLayer {\n\n getLayoutValue(name, globalProperties, featureProperties) {\n const value = super.getLayoutValue(name, globalProperties, featureProperties);\n if (value !== 'auto') {\n return value;\n }\n\n switch (name) {\n case 'text-rotation-alignment':\n case 'icon-rotation-alignment':\n return this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' ? 'map' : 'viewport';\n case 'text-pitch-alignment':\n return this.getLayoutValue('text-rotation-alignment', globalProperties, featureProperties);\n default:\n return value;\n }\n }\n\n createBucket(options) {\n return new SymbolBucket(options);\n }\n}\n\nmodule.exports = SymbolStyleLayer;\n","'use strict';\n\nconst StyleLayer = require('./style_layer');\nconst util = require('../util/util');\nconst featureFilter = require('../style-spec/feature_filter');\nconst groupByLayout = require('../style-spec/group_by_layout');\n\nclass StyleLayerIndex {\n constructor(layerConfigs) {\n if (layerConfigs) {\n this.replace(layerConfigs);\n }\n }\n\n replace(layerConfigs) {\n this.symbolOrder = [];\n for (const layerConfig of layerConfigs) {\n if (layerConfig.type === 'symbol') {\n this.symbolOrder.push(layerConfig.id);\n }\n }\n this._layerConfigs = {};\n this._layers = {};\n this.update(layerConfigs, []);\n }\n\n update(layerConfigs, removedIds, symbolOrder) {\n for (const layerConfig of layerConfigs) {\n this._layerConfigs[layerConfig.id] = layerConfig;\n\n const layer = this._layers[layerConfig.id] = StyleLayer.create(layerConfig);\n layer.updatePaintTransitions({}, {transition: false});\n layer.filter = featureFilter(layer.filter);\n }\n for (const id of removedIds) {\n delete this._layerConfigs[id];\n delete this._layers[id];\n }\n if (symbolOrder) {\n this.symbolOrder = symbolOrder;\n }\n\n this.familiesBySource = {};\n\n const groups = groupByLayout(util.values(this._layerConfigs));\n\n for (const layerConfigs of groups) {\n const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]);\n\n const layer = layers[0];\n if (layer.layout && layer.layout.visibility === 'none') {\n continue;\n }\n\n const sourceId = layer.source || '';\n let sourceGroup = this.familiesBySource[sourceId];\n if (!sourceGroup) {\n sourceGroup = this.familiesBySource[sourceId] = {};\n }\n\n const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer';\n let sourceLayerFamilies = sourceGroup[sourceLayerId];\n if (!sourceLayerFamilies) {\n sourceLayerFamilies = sourceGroup[sourceLayerId] = [];\n }\n\n sourceLayerFamilies.push(layers);\n }\n }\n}\n\nmodule.exports = StyleLayerIndex;\n","'use strict';\n\nconst util = require('../util/util');\nconst interpolate = require('../util/interpolate');\n\nconst fakeZoomHistory = { lastIntegerZoom: 0, lastIntegerZoomTime: 0, lastZoom: 0 };\n\n/*\n * Represents a transition between two declarations\n */\nclass StyleTransition {\n\n constructor(reference, declaration, oldTransition, options, zoomHistory) {\n this.declaration = declaration;\n this.startTime = this.endTime = (new Date()).getTime();\n\n this.oldTransition = oldTransition;\n this.duration = options.duration || 0;\n this.delay = options.delay || 0;\n\n this.zoomTransitioned = reference.function === 'piecewise-constant' && reference.transition;\n this.interp = this.zoomTransitioned ? interpZoomTransitioned : interpolate[reference.type];\n this.zoomHistory = zoomHistory || fakeZoomHistory;\n\n if (!this.instant()) {\n this.endTime = this.startTime + this.duration + this.delay;\n }\n\n if (oldTransition && oldTransition.endTime <= this.startTime) {\n // Old transition is done running, so we can\n // delete its reference to its old transition.\n delete oldTransition.oldTransition;\n }\n }\n\n instant() {\n return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0);\n }\n\n /*\n * Return the value of the transitioning property.\n */\n calculate(globalProperties, featureProperties, time) {\n const value = this._calculateTargetValue(globalProperties, featureProperties);\n\n if (this.instant())\n return value;\n\n time = time || Date.now();\n\n if (time >= this.endTime)\n return value;\n\n const oldValue = this.oldTransition.calculate(globalProperties, featureProperties, this.startTime);\n const t = util.easeCubicInOut((time - this.startTime - this.delay) / this.duration);\n return this.interp(oldValue, value, t);\n }\n\n _calculateTargetValue(globalProperties, featureProperties) {\n if (!this.zoomTransitioned)\n return this.declaration.calculate(globalProperties, featureProperties);\n\n // calculate zoom transition between discrete values, such as images and dasharrays.\n const z = globalProperties.zoom;\n const lastIntegerZoom = this.zoomHistory.lastIntegerZoom;\n\n const fromScale = z > lastIntegerZoom ? 2 : 0.5;\n const from = this.declaration.calculate({zoom: z > lastIntegerZoom ? z - 1 : z + 1}, featureProperties);\n const to = this.declaration.calculate({zoom: z}, featureProperties);\n\n const timeFraction = Math.min((Date.now() - this.zoomHistory.lastIntegerZoomTime) / this.duration, 1);\n const zoomFraction = Math.abs(z - lastIntegerZoom);\n const t = interpolate(timeFraction, 1, zoomFraction);\n\n if (from === undefined || to === undefined)\n return undefined;\n\n return { from, fromScale, to, toScale: 1, t };\n }\n}\n\nmodule.exports = StyleTransition;\n\n// interpolate between two values that transition with zoom, such as images and dasharrays\nfunction interpZoomTransitioned(from, to, t) {\n if (from === undefined || to === undefined)\n return undefined;\n\n return {\n from: from.to,\n fromScale: from.toScale,\n to: to.to,\n toScale: to.toScale,\n t: t\n };\n}\n","'use strict';\n\nmodule.exports = require('../style-spec/validate_style.min');\n\nmodule.exports.emitErrors = function (emitter, errors) {\n if (errors && errors.length) {\n for (let i = 0; i < errors.length; i++) {\n emitter.fire('error', { error: new Error(errors[i].message) });\n }\n return true;\n } else {\n return false;\n }\n};\n","'use strict';\n\nconst Point = require('point-geometry');\n\nclass Anchor extends Point {\n\n constructor(x, y, angle, segment) {\n super(x, y);\n this.angle = angle;\n if (segment !== undefined) {\n this.segment = segment;\n }\n }\n\n clone() {\n return new Anchor(this.x, this.y, this.angle, this.segment);\n }\n}\n\nmodule.exports = Anchor;\n","'use strict';\n\nmodule.exports = checkMaxAngle;\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param {Array} line\n * @param {Anchor} anchor The point on the line around which the label is anchored.\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {\n\n // horizontal labels always pass\n if (anchor.segment === undefined) return true;\n\n let p = anchor;\n let index = anchor.segment + 1;\n let anchorDistance = 0;\n\n // move backwards along the line to the first segment the label appears on\n while (anchorDistance > -labelLength / 2) {\n index--;\n\n // there isn't enough room for the label after the beginning of the line\n if (index < 0) return false;\n\n anchorDistance -= line[index].dist(p);\n p = line[index];\n }\n\n anchorDistance += line[index].dist(line[index + 1]);\n index++;\n\n // store recent corners and their total angle difference\n const recentCorners = [];\n let recentAngleDelta = 0;\n\n // move forwards by the length of the label and check angles along the way\n while (anchorDistance < labelLength / 2) {\n const prev = line[index - 1];\n const current = line[index];\n const next = line[index + 1];\n\n // there isn't enough room for the label before the end of the line\n if (!next) return false;\n\n let angleDelta = prev.angleTo(current) - current.angleTo(next);\n // restrict angle to -pi..pi range\n angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI);\n\n recentCorners.push({\n distance: anchorDistance,\n angleDelta: angleDelta\n });\n recentAngleDelta += angleDelta;\n\n // remove corners that are far enough away from the list of recent anchors\n while (anchorDistance - recentCorners[0].distance > windowSize) {\n recentAngleDelta -= recentCorners.shift().angleDelta;\n }\n\n // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n if (recentAngleDelta > maxAngle) return false;\n\n index++;\n anchorDistance += current.dist(next);\n }\n\n // no part of the line had an angle greater than the maximum allowed. check passes.\n return true;\n}\n","'use strict';\n\nconst Point = require('point-geometry');\n\nmodule.exports = clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param {Array>} lines\n * @param {number} x1 the left edge of the box\n * @param {number} y1 the top edge of the box\n * @param {number} x2 the right edge of the box\n * @param {number} y2 the bottom edge of the box\n * @returns {Array>} lines\n * @private\n */\nfunction clipLine(lines, x1, y1, x2, y2) {\n const clippedLines = [];\n\n for (let l = 0; l < lines.length; l++) {\n const line = lines[l];\n let clippedLine;\n\n for (let i = 0; i < line.length - 1; i++) {\n let p0 = line[i];\n let p1 = line[i + 1];\n\n\n if (p0.x < x1 && p1.x < x1) {\n continue;\n } else if (p0.x < x1) {\n p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n } else if (p1.x < x1) {\n p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();\n }\n\n if (p0.y < y1 && p1.y < y1) {\n continue;\n } else if (p0.y < y1) {\n p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n } else if (p1.y < y1) {\n p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();\n }\n\n if (p0.x >= x2 && p1.x >= x2) {\n continue;\n } else if (p0.x >= x2) {\n p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n } else if (p1.x >= x2) {\n p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();\n }\n\n if (p0.y >= y2 && p1.y >= y2) {\n continue;\n } else if (p0.y >= y2) {\n p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n } else if (p1.y >= y2) {\n p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();\n }\n\n if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n clippedLine = [p0];\n clippedLines.push(clippedLine);\n }\n\n clippedLine.push(p1);\n }\n }\n\n return clippedLines;\n}\n","'use strict';\n\nconst createStructArrayType = require('../util/struct_array');\nconst Point = require('point-geometry');\n\n/**\n * A collision box represents an area of the map that that is covered by a\n * label. CollisionFeature uses one or more of these collision boxes to\n * represent all the area covered by a single label. They are used to\n * prevent collisions between labels.\n *\n * A collision box actually represents a 3d volume. The first two dimensions,\n * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`.\n * The third dimension, zoom, is limited by `maxScale` which determines\n * how far in the z dimensions the box extends.\n *\n * As you zoom in on a map, all points on the map get further and further apart\n * but labels stay roughly the same size. Labels cover less real world area on\n * the map at higher zoom levels than they do at lower zoom levels. This is why\n * areas are are represented with an anchor point and offsets from that point\n * instead of just using four absolute points.\n *\n * Line labels are represented by a set of these boxes spaced out along a line.\n * When you zoom in, line labels cover less real world distance along the line\n * than they used to. Collision boxes near the edges that used to cover label\n * no longer do. If a box doesn't cover the label anymore it should be ignored\n * when doing collision checks. `maxScale` is how much you can scale the map\n * before the label isn't within the box anymore.\n * For example\n * lower zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png\n * slightly higher zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png\n * In the zoomed in image the two grey boxes on either side don't cover the\n * label anymore. Their maxScale is smaller than the current scale.\n *\n *\n * @class CollisionBoxArray\n * @private\n */\n\nconst CollisionBoxArray = createStructArrayType({\n members: [\n // the box is centered around the anchor point\n { type: 'Int16', name: 'anchorPointX' },\n { type: 'Int16', name: 'anchorPointY' },\n\n // distances to the edges from the anchor\n { type: 'Int16', name: 'x1' },\n { type: 'Int16', name: 'y1' },\n { type: 'Int16', name: 'x2' },\n { type: 'Int16', name: 'y2' },\n\n // the box is only valid for scales < maxScale.\n // The box does not block other boxes at scales >= maxScale;\n { type: 'Float32', name: 'maxScale' },\n\n // the index of the feature in the original vectortile\n { type: 'Uint32', name: 'featureIndex' },\n // the source layer the feature appears in\n { type: 'Uint16', name: 'sourceLayerIndex' },\n // the bucket the feature appears in\n { type: 'Uint16', name: 'bucketIndex' },\n\n // rotated and scaled bbox used for indexing\n { type: 'Int16', name: 'bbox0' },\n { type: 'Int16', name: 'bbox1' },\n { type: 'Int16', name: 'bbox2' },\n { type: 'Int16', name: 'bbox3' },\n\n { type: 'Float32', name: 'placementScale' }\n ]\n});\n\nObject.defineProperty(CollisionBoxArray.prototype.StructType.prototype, 'anchorPoint', {\n get() { return new Point(this.anchorPointX, this.anchorPointY); }\n});\n\nmodule.exports = CollisionBoxArray;\n","'use strict';\n\n/**\n * A CollisionFeature represents the area of the tile covered by a single label.\n * It is used with CollisionTile to check if the label overlaps with any\n * previous labels. A CollisionFeature is mostly just a set of CollisionBox\n * objects.\n *\n * @private\n */\nclass CollisionFeature {\n /**\n * Create a CollisionFeature, adding its collision box data to the given collisionBoxArray in the process.\n *\n * @param {Array} line The geometry the label is placed on.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {Array} layerIDs The IDs of the layers that this CollisionFeature is a part of.\n * @param {Object} shaped The text or icon shaping results.\n * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units.\n * @param {number} padding The amount of padding to add around the label edges.\n * @param {boolean} alignLine Whether the label is aligned with the line or the viewport.\n */\n constructor(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, straight) {\n const y1 = shaped.top * boxScale - padding;\n const y2 = shaped.bottom * boxScale + padding;\n const x1 = shaped.left * boxScale - padding;\n const x2 = shaped.right * boxScale + padding;\n\n this.boxStartIndex = collisionBoxArray.length;\n\n if (alignLine) {\n\n let height = y2 - y1;\n const length = x2 - x1;\n\n if (height > 0) {\n // set minimum box height to avoid very many small labels\n height = Math.max(10 * boxScale, height);\n\n if (straight) {\n // used for icon labels that are aligned with the line, but don't curve along it\n const vector = line[anchor.segment + 1].sub(line[anchor.segment])._unit()._mult(length);\n const straightLine = [anchor.sub(vector), anchor.add(vector)];\n this._addLineCollisionBoxes(collisionBoxArray, straightLine, anchor, 0, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n } else {\n // used for text labels that curve along a line\n this._addLineCollisionBoxes(collisionBoxArray, line, anchor, anchor.segment, length, height, featureIndex, sourceLayerIndex, bucketIndex);\n }\n }\n\n } else {\n collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, Infinity, featureIndex, sourceLayerIndex, bucketIndex,\n 0, 0, 0, 0, 0);\n }\n\n this.boxEndIndex = collisionBoxArray.length;\n }\n\n /**\n * Create a set of CollisionBox objects for a line.\n *\n * @param {Array} line\n * @param {Anchor} anchor\n * @param {number} labelLength The length of the label in geometry units.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for.\n * @param {number} boxSize The size of the collision boxes that will be created.\n *\n * @private\n */\n _addLineCollisionBoxes(collisionBoxArray, line, anchor, segment, labelLength, boxSize, featureIndex, sourceLayerIndex, bucketIndex) {\n const step = boxSize / 2;\n const nBoxes = Math.floor(labelLength / step);\n\n // offset the center of the first box by half a box so that the edge of the\n // box is at the edge of the label.\n const firstBoxOffset = -boxSize / 2;\n\n const bboxes = this.boxes;\n\n let p = anchor;\n let index = segment + 1;\n let anchorDistance = firstBoxOffset;\n\n // move backwards along the line to the first segment the label appears on\n do {\n index--;\n\n // there isn't enough room for the label after the beginning of the line\n // checkMaxAngle should have already caught this\n if (index < 0) return bboxes;\n\n anchorDistance -= line[index].dist(p);\n p = line[index];\n } while (anchorDistance > -labelLength / 2);\n\n let segmentLength = line[index].dist(line[index + 1]);\n\n for (let i = 0; i < nBoxes; i++) {\n // the distance the box will be from the anchor\n const boxDistanceToAnchor = -labelLength / 2 + i * step;\n\n // the box is not on the current segment. Move to the next segment.\n while (anchorDistance + segmentLength < boxDistanceToAnchor) {\n anchorDistance += segmentLength;\n index++;\n\n // There isn't enough room before the end of the line.\n if (index + 1 >= line.length) return bboxes;\n\n segmentLength = line[index].dist(line[index + 1]);\n }\n\n // the distance the box will be from the beginning of the segment\n const segmentBoxDistance = boxDistanceToAnchor - anchorDistance;\n\n const p0 = line[index];\n const p1 = line[index + 1];\n const boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round();\n\n const distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0);\n const maxScale = labelLength / 2 / distanceToInnerEdge;\n\n collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y,\n -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale,\n featureIndex, sourceLayerIndex, bucketIndex,\n 0, 0, 0, 0, 0);\n }\n\n return bboxes;\n }\n}\n\nmodule.exports = CollisionFeature;\n","'use strict';\n\nconst Point = require('point-geometry');\nconst EXTENT = require('../data/extent');\nconst Grid = require('grid-index');\n\nconst intersectionTests = require('../util/intersection_tests');\n\n/**\n * A collision tile used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * @private\n */\nclass CollisionTile {\n constructor(angle, pitch, collisionBoxArray) {\n if (typeof angle === 'object') {\n const serialized = angle;\n collisionBoxArray = pitch;\n angle = serialized.angle;\n pitch = serialized.pitch;\n this.grid = new Grid(serialized.grid);\n this.ignoredGrid = new Grid(serialized.ignoredGrid);\n } else {\n this.grid = new Grid(EXTENT, 12, 6);\n this.ignoredGrid = new Grid(EXTENT, 12, 0);\n }\n\n this.minScale = 0.5;\n this.maxScale = 2;\n\n this.angle = angle;\n this.pitch = pitch;\n\n const sin = Math.sin(angle),\n cos = Math.cos(angle);\n this.rotationMatrix = [cos, -sin, sin, cos];\n this.reverseRotationMatrix = [cos, sin, -sin, cos];\n\n // Stretch boxes in y direction to account for the map tilt.\n this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI);\n\n // The amount the map is squished depends on the y position.\n // Sort of account for this by making all boxes a bit bigger.\n this.yStretch = Math.pow(this.yStretch, 1.3);\n\n this.collisionBoxArray = collisionBoxArray;\n if (collisionBoxArray.length === 0) {\n // the first time collisionBoxArray is passed to a CollisionTile\n\n // tempCollisionBox\n collisionBoxArray.emplaceBack();\n\n const maxInt16 = 32767;\n //left\n collisionBoxArray.emplaceBack(0, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n 0, 0, 0, 0, 0, 0, 0, 0,\n 0);\n // right\n collisionBoxArray.emplaceBack(EXTENT, 0, 0, -maxInt16, 0, maxInt16, maxInt16,\n 0, 0, 0, 0, 0, 0, 0, 0,\n 0);\n // top\n collisionBoxArray.emplaceBack(0, 0, -maxInt16, 0, maxInt16, 0, maxInt16,\n 0, 0, 0, 0, 0, 0, 0, 0,\n 0);\n // bottom\n collisionBoxArray.emplaceBack(0, EXTENT, -maxInt16, 0, maxInt16, 0, maxInt16,\n 0, 0, 0, 0, 0, 0, 0, 0,\n 0);\n }\n\n this.tempCollisionBox = collisionBoxArray.get(0);\n this.edges = [\n collisionBoxArray.get(1),\n collisionBoxArray.get(2),\n collisionBoxArray.get(3),\n collisionBoxArray.get(4)\n ];\n }\n\n serialize(transferables) {\n const grid = this.grid.toArrayBuffer();\n const ignoredGrid = this.ignoredGrid.toArrayBuffer();\n if (transferables) {\n transferables.push(grid);\n transferables.push(ignoredGrid);\n }\n return {\n angle: this.angle,\n pitch: this.pitch,\n grid: grid,\n ignoredGrid: ignoredGrid\n };\n }\n\n /**\n * Find the scale at which the collisionFeature can be shown without\n * overlapping with other features.\n *\n * @param {CollisionFeature} collisionFeature\n * @returns {number} placementScale\n * @private\n */\n placeCollisionFeature(collisionFeature, allowOverlap, avoidEdges) {\n\n const collisionBoxArray = this.collisionBoxArray;\n let minPlacementScale = this.minScale;\n const rotationMatrix = this.rotationMatrix;\n const yStretch = this.yStretch;\n\n for (let b = collisionFeature.boxStartIndex; b < collisionFeature.boxEndIndex; b++) {\n\n const box = collisionBoxArray.get(b);\n\n const anchorPoint = box.anchorPoint._matMult(rotationMatrix);\n const x = anchorPoint.x;\n const y = anchorPoint.y;\n\n const x1 = x + box.x1;\n const y1 = y + box.y1 * yStretch;\n const x2 = x + box.x2;\n const y2 = y + box.y2 * yStretch;\n\n box.bbox0 = x1;\n box.bbox1 = y1;\n box.bbox2 = x2;\n box.bbox3 = y2;\n\n if (!allowOverlap) {\n const blockingBoxes = this.grid.query(x1, y1, x2, y2);\n\n for (let i = 0; i < blockingBoxes.length; i++) {\n const blocking = collisionBoxArray.get(blockingBoxes[i]);\n const blockingAnchorPoint = blocking.anchorPoint._matMult(rotationMatrix);\n\n minPlacementScale = this.getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking);\n if (minPlacementScale >= this.maxScale) {\n return minPlacementScale;\n }\n }\n }\n\n if (avoidEdges) {\n let rotatedCollisionBox;\n\n if (this.angle) {\n const reverseRotationMatrix = this.reverseRotationMatrix;\n const tl = new Point(box.x1, box.y1).matMult(reverseRotationMatrix);\n const tr = new Point(box.x2, box.y1).matMult(reverseRotationMatrix);\n const bl = new Point(box.x1, box.y2).matMult(reverseRotationMatrix);\n const br = new Point(box.x2, box.y2).matMult(reverseRotationMatrix);\n\n rotatedCollisionBox = this.tempCollisionBox;\n rotatedCollisionBox.anchorPointX = box.anchorPoint.x;\n rotatedCollisionBox.anchorPointY = box.anchorPoint.y;\n rotatedCollisionBox.x1 = Math.min(tl.x, tr.x, bl.x, br.x);\n rotatedCollisionBox.y1 = Math.min(tl.y, tr.x, bl.x, br.x);\n rotatedCollisionBox.x2 = Math.max(tl.x, tr.x, bl.x, br.x);\n rotatedCollisionBox.y2 = Math.max(tl.y, tr.x, bl.x, br.x);\n rotatedCollisionBox.maxScale = box.maxScale;\n } else {\n rotatedCollisionBox = box;\n }\n\n for (let k = 0; k < this.edges.length; k++) {\n const edgeBox = this.edges[k];\n minPlacementScale = this.getPlacementScale(minPlacementScale, box.anchorPoint, rotatedCollisionBox, edgeBox.anchorPoint, edgeBox);\n if (minPlacementScale >= this.maxScale) {\n return minPlacementScale;\n }\n }\n }\n }\n\n return minPlacementScale;\n }\n\n queryRenderedSymbols(queryGeometry, scale) {\n const sourceLayerFeatures = {};\n const result = [];\n\n if (queryGeometry.length === 0 || (this.grid.length === 0 && this.ignoredGrid.length === 0)) {\n return result;\n }\n\n const collisionBoxArray = this.collisionBoxArray;\n const rotationMatrix = this.rotationMatrix;\n const yStretch = this.yStretch;\n\n // Generate a rotated geometry out of the original query geometry.\n // Scale has already been handled by the prior conversions.\n const rotatedQuery = [];\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < queryGeometry.length; i++) {\n const ring = queryGeometry[i];\n for (let k = 0; k < ring.length; k++) {\n const p = ring[k].matMult(rotationMatrix);\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n rotatedQuery.push(p);\n }\n }\n\n const features = this.grid.query(minX, minY, maxX, maxY);\n const ignoredFeatures = this.ignoredGrid.query(minX, minY, maxX, maxY);\n for (let i = 0; i < ignoredFeatures.length; i++) {\n features.push(ignoredFeatures[i]);\n }\n\n // Account for the rounding done when updating symbol shader variables.\n const roundedScale = Math.pow(2, Math.ceil(Math.log(scale) / Math.LN2 * 10) / 10);\n\n for (let i = 0; i < features.length; i++) {\n const blocking = collisionBoxArray.get(features[i]);\n const sourceLayer = blocking.sourceLayerIndex;\n const featureIndex = blocking.featureIndex;\n\n // Skip already seen features.\n if (sourceLayerFeatures[sourceLayer] === undefined) {\n sourceLayerFeatures[sourceLayer] = {};\n }\n if (sourceLayerFeatures[sourceLayer][featureIndex]) continue;\n\n // Check if feature is rendered (collision free) at current scale.\n if (roundedScale < blocking.placementScale || roundedScale > blocking.maxScale) continue;\n\n // Check if query intersects with the feature box at current scale.\n const anchor = blocking.anchorPoint.matMult(rotationMatrix);\n const x1 = anchor.x + blocking.x1 / scale;\n const y1 = anchor.y + blocking.y1 / scale * yStretch;\n const x2 = anchor.x + blocking.x2 / scale;\n const y2 = anchor.y + blocking.y2 / scale * yStretch;\n const bbox = [\n new Point(x1, y1),\n new Point(x2, y1),\n new Point(x2, y2),\n new Point(x1, y2)\n ];\n if (!intersectionTests.polygonIntersectsPolygon(rotatedQuery, bbox)) continue;\n\n sourceLayerFeatures[sourceLayer][featureIndex] = true;\n result.push(features[i]);\n }\n\n return result;\n }\n\n getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking) {\n\n // Find the lowest scale at which the two boxes can fit side by side without overlapping.\n // Original algorithm:\n const anchorDiffX = anchorPoint.x - blockingAnchorPoint.x;\n const anchorDiffY = anchorPoint.y - blockingAnchorPoint.y;\n let s1 = (blocking.x1 - box.x2) / anchorDiffX; // scale at which new box is to the left of old box\n let s2 = (blocking.x2 - box.x1) / anchorDiffX; // scale at which new box is to the right of old box\n let s3 = (blocking.y1 - box.y2) * this.yStretch / anchorDiffY; // scale at which new box is to the top of old box\n let s4 = (blocking.y2 - box.y1) * this.yStretch / anchorDiffY; // scale at which new box is to the bottom of old box\n\n if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1;\n if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1;\n\n let collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4));\n const blockingMaxScale = blocking.maxScale;\n const boxMaxScale = box.maxScale;\n\n if (collisionFreeScale > blockingMaxScale) {\n // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it,\n // so unblock the new box at the scale that the old box disappears.\n collisionFreeScale = blockingMaxScale;\n }\n\n if (collisionFreeScale > boxMaxScale) {\n // If the box can only be shown after it is visible, then the box can never be shown.\n // But the label can be shown after this box is not visible.\n collisionFreeScale = boxMaxScale;\n }\n\n if (collisionFreeScale > minPlacementScale &&\n collisionFreeScale >= blocking.placementScale) {\n // If this collision occurs at a lower scale than previously found collisions\n // and the collision occurs while the other label is visible\n\n // this this is the lowest scale at which the label won't collide with anything\n minPlacementScale = collisionFreeScale;\n }\n\n return minPlacementScale;\n }\n\n\n /**\n * Remember this collisionFeature and what scale it was placed at to block\n * later features from overlapping with it.\n *\n * @param {CollisionFeature} collisionFeature\n * @param {number} minPlacementScale\n * @private\n */\n insertCollisionFeature(collisionFeature, minPlacementScale, ignorePlacement) {\n\n const grid = ignorePlacement ? this.ignoredGrid : this.grid;\n const collisionBoxArray = this.collisionBoxArray;\n\n for (let k = collisionFeature.boxStartIndex; k < collisionFeature.boxEndIndex; k++) {\n const box = collisionBoxArray.get(k);\n box.placementScale = minPlacementScale;\n if (minPlacementScale < this.maxScale) {\n grid.insert(k, box.bbox0, box.bbox1, box.bbox2, box.bbox3);\n }\n }\n }\n}\n\nmodule.exports = CollisionTile;\n","'use strict';\n\nconst interpolate = require('../util/interpolate');\nconst Anchor = require('../symbol/anchor');\nconst checkMaxAngle = require('./check_max_angle');\n\nmodule.exports = getAnchors;\n\nfunction getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) {\n\n // Resample a line to get anchor points for labels and check that each\n // potential label passes text-max-angle check and has enough froom to fit\n // on the line.\n\n const angleWindowSize = shapedText ?\n 3 / 5 * glyphSize * boxScale :\n 0;\n\n const labelLength = Math.max(\n shapedText ? shapedText.right - shapedText.left : 0,\n shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n\n // Is the line continued from outside the tile boundary?\n const isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent;\n\n // Is the label long, relative to the spacing?\n // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n if (spacing - labelLength * boxScale < spacing / 4) {\n spacing = labelLength * boxScale + spacing / 4;\n }\n\n // Offset the first anchor by:\n // Either half the label length plus a fixed extra offset if the line is not continued\n // Or half the spacing if the line is continued.\n\n // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n const fixedExtraOffset = glyphSize * 2;\n\n const offset = !isLineContinued ?\n ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n (spacing / 2 * overscaling) % spacing;\n\n return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent);\n}\n\n\nfunction resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) {\n\n const halfLabelLength = labelLength / 2;\n let lineLength = 0;\n for (let k = 0; k < line.length - 1; k++) {\n lineLength += line[k].dist(line[k + 1]);\n }\n\n let distance = 0,\n markedDistance = offset - spacing;\n\n let anchors = [];\n\n for (let i = 0; i < line.length - 1; i++) {\n\n const a = line[i],\n b = line[i + 1];\n\n const segmentDist = a.dist(b),\n angle = b.angleTo(a);\n\n while (markedDistance + spacing < distance + segmentDist) {\n markedDistance += spacing;\n\n const t = (markedDistance - distance) / segmentDist,\n x = interpolate(a.x, b.x, t),\n y = interpolate(a.y, b.y, t);\n\n // Check that the point is within the tile boundaries and that\n // the label would fit before the beginning and end of the line\n // if placed at this point.\n if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent &&\n markedDistance - halfLabelLength >= 0 &&\n markedDistance + halfLabelLength <= lineLength) {\n const anchor = new Anchor(x, y, angle, i)._round();\n\n if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n anchors.push(anchor);\n }\n }\n }\n\n distance += segmentDist;\n }\n\n if (!placeAtMiddle && !anchors.length && !isLineContinued) {\n // The first attempt at finding anchors at which labels can be placed failed.\n // Try again, but this time just try placing one anchor at the middle of the line.\n // This has the most effect for short lines in overscaled tiles, since the\n // initial offset used in overscaled tiles is calculated to align labels with positions in\n // parent tiles instead of placing the label as close to the beginning as possible.\n anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent);\n }\n\n return anchors;\n}\n","'use strict';\n\nconst ShelfPack = require('@mapbox/shelf-pack');\nconst util = require('../util/util');\n\nconst SIZE_GROWTH_RATE = 4;\nconst DEFAULT_SIZE = 128;\n// must be \"DEFAULT_SIZE * SIZE_GROWTH_RATE ^ n\" for some integer n\nconst MAX_SIZE = 2048;\n\nclass GlyphAtlas {\n\n constructor() {\n this.width = DEFAULT_SIZE;\n this.height = DEFAULT_SIZE;\n\n this.atlas = new ShelfPack(this.width, this.height);\n this.index = {};\n this.ids = {};\n this.data = new Uint8Array(this.width * this.height);\n }\n\n getGlyphs() {\n const glyphs = {};\n let split,\n name,\n id;\n\n for (const key in this.ids) {\n split = key.split('#');\n name = split[0];\n id = split[1];\n\n if (!glyphs[name]) glyphs[name] = [];\n glyphs[name].push(id);\n }\n\n return glyphs;\n }\n\n getRects() {\n const rects = {};\n let split,\n name,\n id;\n\n for (const key in this.ids) {\n split = key.split('#');\n name = split[0];\n id = split[1];\n\n if (!rects[name]) rects[name] = {};\n rects[name][id] = this.index[key];\n }\n\n return rects;\n }\n\n addGlyph(id, name, glyph, buffer) {\n if (!glyph) return null;\n\n const key = `${name}#${glyph.id}`;\n\n // The glyph is already in this texture.\n if (this.index[key]) {\n if (this.ids[key].indexOf(id) < 0) {\n this.ids[key].push(id);\n }\n return this.index[key];\n }\n\n // The glyph bitmap has zero width.\n if (!glyph.bitmap) {\n return null;\n }\n\n const bufferedWidth = glyph.width + buffer * 2;\n const bufferedHeight = glyph.height + buffer * 2;\n\n // Add a 1px border around every image.\n const padding = 1;\n let packWidth = bufferedWidth + 2 * padding;\n let packHeight = bufferedHeight + 2 * padding;\n\n // Increase to next number divisible by 4, but at least 1.\n // This is so we can scale down the texture coordinates and pack them\n // into fewer bytes.\n packWidth += (4 - packWidth % 4);\n packHeight += (4 - packHeight % 4);\n\n let rect = this.atlas.packOne(packWidth, packHeight);\n if (!rect) {\n this.resize();\n rect = this.atlas.packOne(packWidth, packHeight);\n }\n if (!rect) {\n util.warnOnce('glyph bitmap overflow');\n return null;\n }\n\n this.index[key] = rect;\n this.ids[key] = [id];\n\n const target = this.data;\n const source = glyph.bitmap;\n for (let y = 0; y < bufferedHeight; y++) {\n const y1 = this.width * (rect.y + y + padding) + rect.x + padding;\n const y2 = bufferedWidth * y;\n for (let x = 0; x < bufferedWidth; x++) {\n target[y1 + x] = source[y2 + x];\n }\n }\n\n this.dirty = true;\n\n return rect;\n }\n\n resize() {\n const prevWidth = this.width;\n const prevHeight = this.height;\n\n if (prevWidth >= MAX_SIZE || prevHeight >= MAX_SIZE) return;\n\n if (this.texture) {\n if (this.gl) {\n this.gl.deleteTexture(this.texture);\n }\n this.texture = null;\n }\n\n this.width *= SIZE_GROWTH_RATE;\n this.height *= SIZE_GROWTH_RATE;\n this.atlas.resize(this.width, this.height);\n\n const buf = new ArrayBuffer(this.width * this.height);\n for (let i = 0; i < prevHeight; i++) {\n const src = new Uint8Array(this.data.buffer, prevHeight * i, prevWidth);\n const dst = new Uint8Array(buf, prevHeight * i * SIZE_GROWTH_RATE, prevWidth);\n dst.set(src);\n }\n this.data = new Uint8Array(buf);\n }\n\n bind(gl) {\n this.gl = gl;\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null);\n\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n }\n }\n\n updateTexture(gl) {\n this.bind(gl);\n if (this.dirty) {\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);\n this.dirty = false;\n }\n }\n}\n\nmodule.exports = GlyphAtlas;\n","'use strict';\n\nconst normalizeURL = require('../util/mapbox').normalizeGlyphsURL;\nconst ajax = require('../util/ajax');\nconst verticalizePunctuation = require('../util/verticalize_punctuation');\nconst Glyphs = require('../util/glyphs');\nconst GlyphAtlas = require('../symbol/glyph_atlas');\nconst Protobuf = require('pbf');\n\n// A simplified representation of the glyph containing only the properties needed for shaping.\nclass SimpleGlyph {\n constructor(glyph, rect, buffer) {\n const padding = 1;\n this.advance = glyph.advance;\n this.left = glyph.left - buffer - padding;\n this.top = glyph.top + buffer + padding;\n this.rect = rect;\n }\n}\n\n/**\n * A glyph source has a URL from which to load new glyphs and manages\n * GlyphAtlases in which to store glyphs used by the requested fontstacks\n * and ranges.\n *\n * @private\n */\nclass GlyphSource {\n /**\n * @param {string} url glyph template url\n */\n constructor(url) {\n this.url = url && normalizeURL(url);\n this.atlases = {};\n this.stacks = {};\n this.loading = {};\n }\n\n getSimpleGlyphs(fontstack, glyphIDs, uid, callback) {\n if (this.stacks[fontstack] === undefined) {\n this.stacks[fontstack] = {};\n }\n if (this.atlases[fontstack] === undefined) {\n this.atlases[fontstack] = new GlyphAtlas();\n }\n\n const glyphs = {};\n const stack = this.stacks[fontstack];\n const atlas = this.atlases[fontstack];\n\n // the number of pixels the sdf bitmaps are padded by\n const buffer = 3;\n\n const missing = {};\n let remaining = 0;\n\n const getGlyph = (glyphID) => {\n const range = Math.floor(glyphID / 256);\n\n if (stack[range]) {\n const glyph = stack[range].glyphs[glyphID];\n const rect = atlas.addGlyph(uid, fontstack, glyph, buffer);\n if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n } else {\n if (missing[range] === undefined) {\n missing[range] = [];\n remaining++;\n }\n missing[range].push(glyphID);\n }\n };\n\n for (let i = 0; i < glyphIDs.length; i++) {\n const glyphID = glyphIDs[i];\n const string = String.fromCharCode(glyphID);\n getGlyph(glyphID);\n if (verticalizePunctuation.lookup[string]) {\n getGlyph(verticalizePunctuation.lookup[string].charCodeAt(0));\n }\n }\n\n if (!remaining) callback(undefined, glyphs, fontstack);\n\n const onRangeLoaded = (err, range, data) => {\n if (!err) {\n const stack = this.stacks[fontstack][range] = data.stacks[0];\n for (let i = 0; i < missing[range].length; i++) {\n const glyphID = missing[range][i];\n const glyph = stack.glyphs[glyphID];\n const rect = atlas.addGlyph(uid, fontstack, glyph, buffer);\n if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n }\n }\n remaining--;\n if (!remaining) callback(undefined, glyphs, fontstack);\n };\n\n for (const r in missing) {\n this.loadRange(fontstack, r, onRangeLoaded);\n }\n }\n\n loadRange(fontstack, range, callback) {\n if (range * 256 > 65535) return callback('glyphs > 65535 not supported');\n\n if (this.loading[fontstack] === undefined) {\n this.loading[fontstack] = {};\n }\n const loading = this.loading[fontstack];\n\n if (loading[range]) {\n loading[range].push(callback);\n } else {\n loading[range] = [callback];\n\n const rangeName = `${range * 256}-${range * 256 + 255}`;\n const url = glyphUrl(fontstack, rangeName, this.url);\n\n ajax.getArrayBuffer(url, (err, response) => {\n const glyphs = !err && new Glyphs(new Protobuf(response.data));\n for (let i = 0; i < loading[range].length; i++) {\n loading[range][i](err, range, glyphs);\n }\n delete loading[range];\n });\n }\n }\n\n getGlyphAtlas(fontstack) {\n return this.atlases[fontstack];\n }\n}\n\n/**\n * Use CNAME sharding to load a specific glyph range over a randomized\n * but consistent subdomain.\n * @param {string} fontstack comma-joined fonts\n * @param {string} range comma-joined range\n * @param {url} url templated url\n * @param {string} [subdomains=abc] subdomains as a string where each letter is one.\n * @returns {string} a url to load that section of glyphs\n * @private\n */\nfunction glyphUrl(fontstack, range, url, subdomains) {\n subdomains = subdomains || 'abc';\n\n return url\n .replace('{s}', subdomains[fontstack.length % subdomains.length])\n .replace('{fontstack}', fontstack)\n .replace('{range}', range);\n}\n\nmodule.exports = GlyphSource;\n","'use strict';\n\nmodule.exports = function (features) {\n const leftIndex = {};\n const rightIndex = {};\n const mergedFeatures = [];\n let mergedIndex = 0;\n\n function add(k) {\n mergedFeatures.push(features[k]);\n mergedIndex++;\n }\n\n function mergeFromRight(leftKey, rightKey, geom) {\n const i = rightIndex[leftKey];\n delete rightIndex[leftKey];\n rightIndex[rightKey] = i;\n\n mergedFeatures[i].geometry[0].pop();\n mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]);\n return i;\n }\n\n function mergeFromLeft(leftKey, rightKey, geom) {\n const i = leftIndex[rightKey];\n delete leftIndex[rightKey];\n leftIndex[leftKey] = i;\n\n mergedFeatures[i].geometry[0].shift();\n mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]);\n return i;\n }\n\n function getKey(text, geom, onRight) {\n const point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n return `${text}:${point.x}:${point.y}`;\n }\n\n for (let k = 0; k < features.length; k++) {\n const feature = features[k];\n const geom = feature.geometry;\n const text = feature.text;\n\n if (!text) {\n add(k);\n continue;\n }\n\n const leftKey = getKey(text, geom),\n rightKey = getKey(text, geom, true);\n\n if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n // found lines with the same text adjacent to both ends of the current line, merge all three\n const j = mergeFromLeft(leftKey, rightKey, geom);\n const i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry);\n\n delete leftIndex[leftKey];\n delete rightIndex[rightKey];\n\n rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i;\n mergedFeatures[j].geometry = null;\n\n } else if (leftKey in rightIndex) {\n // found mergeable line adjacent to the start of the current line, merge\n mergeFromRight(leftKey, rightKey, geom);\n\n } else if (rightKey in leftIndex) {\n // found mergeable line adjacent to the end of the current line, merge\n mergeFromLeft(leftKey, rightKey, geom);\n\n } else {\n // no adjacent lines, add as a new item\n add(k);\n leftIndex[leftKey] = mergedIndex - 1;\n rightIndex[rightKey] = mergedIndex - 1;\n }\n }\n\n return mergedFeatures.filter((f) => f.geometry);\n};\n","'use strict';\n\nconst Point = require('point-geometry');\n\nmodule.exports = {\n getIconQuads: getIconQuads,\n getGlyphQuads: getGlyphQuads,\n SymbolQuad: SymbolQuad\n};\n\nconst minScale = 0.5; // underscale by 1 zoom level\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param {Point} anchorPoint the point the symbol is anchored around\n * @param {Point} tl The offset of the top left corner from the anchor.\n * @param {Point} tr The offset of the top right corner from the anchor.\n * @param {Point} bl The offset of the bottom left corner from the anchor.\n * @param {Point} br The offset of the bottom right corner from the anchor.\n * @param {Object} tex The texture coordinates.\n * @param {number} anchorAngle The angle of the label at it's center, not the angle of this quad.\n * @param {number} glyphAngle The angle of the glyph to be positioned in the quad.\n * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at.\n * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at.\n *\n * @class SymbolQuad\n * @private\n */\nfunction SymbolQuad(anchorPoint, tl, tr, bl, br, tex, anchorAngle, glyphAngle, minScale, maxScale, writingMode) {\n this.anchorPoint = anchorPoint;\n this.tl = tl;\n this.tr = tr;\n this.bl = bl;\n this.br = br;\n this.tex = tex;\n this.anchorAngle = anchorAngle;\n this.glyphAngle = glyphAngle;\n this.minScale = minScale;\n this.maxScale = maxScale;\n this.writingMode = writingMode;\n}\n\n/**\n * Create the quads used for rendering an icon.\n *\n * @param {Anchor} anchor\n * @param {PositionedIcon} shapedIcon\n * @param {number} boxScale A magic number for converting glyph metric units to geometry units.\n * @param {Array>} line\n * @param {StyleLayer} layer\n * @param {boolean} alongLine Whether the icon should be placed along the line.\n * @param {Shaping} shapedText Shaping for corresponding text\n * @returns {Array}\n * @private\n */\nfunction getIconQuads(anchor, shapedIcon, boxScale, line, layer, alongLine, shapedText, globalProperties, featureProperties) {\n const rect = shapedIcon.image.rect;\n const layout = layer.layout;\n\n const border = 1;\n const left = shapedIcon.left - border;\n const right = left + rect.w / shapedIcon.image.pixelRatio;\n const top = shapedIcon.top - border;\n const bottom = top + rect.h / shapedIcon.image.pixelRatio;\n let tl, tr, br, bl;\n\n // text-fit mode\n if (layout['icon-text-fit'] !== 'none' && shapedText) {\n const iconWidth = (right - left),\n iconHeight = (bottom - top),\n size = layout['text-size'] / 24,\n textLeft = shapedText.left * size,\n textRight = shapedText.right * size,\n textTop = shapedText.top * size,\n textBottom = shapedText.bottom * size,\n textWidth = textRight - textLeft,\n textHeight = textBottom - textTop,\n padT = layout['icon-text-fit-padding'][0],\n padR = layout['icon-text-fit-padding'][1],\n padB = layout['icon-text-fit-padding'][2],\n padL = layout['icon-text-fit-padding'][3],\n offsetY = layout['icon-text-fit'] === 'width' ? (textHeight - iconHeight) * 0.5 : 0,\n offsetX = layout['icon-text-fit'] === 'height' ? (textWidth - iconWidth) * 0.5 : 0,\n width = layout['icon-text-fit'] === 'width' || layout['icon-text-fit'] === 'both' ? textWidth : iconWidth,\n height = layout['icon-text-fit'] === 'height' || layout['icon-text-fit'] === 'both' ? textHeight : iconHeight;\n tl = new Point(textLeft + offsetX - padL, textTop + offsetY - padT);\n tr = new Point(textLeft + offsetX + padR + width, textTop + offsetY - padT);\n br = new Point(textLeft + offsetX + padR + width, textTop + offsetY + padB + height);\n bl = new Point(textLeft + offsetX - padL, textTop + offsetY + padB + height);\n // Normal icon size mode\n } else {\n tl = new Point(left, top);\n tr = new Point(right, top);\n br = new Point(right, bottom);\n bl = new Point(left, bottom);\n }\n\n let angle = layer.getLayoutValue('icon-rotate', globalProperties, featureProperties) * Math.PI / 180;\n if (alongLine) {\n const prev = line[anchor.segment];\n if (anchor.y === prev.y && anchor.x === prev.x && anchor.segment + 1 < line.length) {\n const next = line[anchor.segment + 1];\n angle += Math.atan2(anchor.y - next.y, anchor.x - next.x) + Math.PI;\n } else {\n angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x);\n }\n }\n\n if (angle) {\n const sin = Math.sin(angle),\n cos = Math.cos(angle),\n matrix = [cos, -sin, sin, cos];\n\n tl = tl.matMult(matrix);\n tr = tr.matMult(matrix);\n bl = bl.matMult(matrix);\n br = br.matMult(matrix);\n }\n\n return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, 0, minScale, Infinity)];\n}\n\n/**\n * Create the quads used for rendering a text label.\n *\n * @param {Anchor} anchor\n * @param {Shaping} shaping\n * @param {number} boxScale A magic number for converting from glyph metric units to geometry units.\n * @param {Array>} line\n * @param {StyleLayer} layer\n * @param {boolean} alongLine Whether the label should be placed along the line.\n * @returns {Array}\n * @private\n */\nfunction getGlyphQuads(anchor, shaping, boxScale, line, layer, alongLine) {\n\n const textRotate = layer.layout['text-rotate'] * Math.PI / 180;\n const keepUpright = layer.layout['text-keep-upright'];\n\n const positionedGlyphs = shaping.positionedGlyphs;\n const quads = [];\n\n for (let k = 0; k < positionedGlyphs.length; k++) {\n const positionedGlyph = positionedGlyphs[k];\n const glyph = positionedGlyph.glyph;\n if (!glyph) continue;\n\n const rect = glyph.rect;\n if (!rect) continue;\n\n const centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale;\n\n let glyphInstances;\n let labelMinScale = minScale;\n if (alongLine) {\n glyphInstances = [];\n labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true);\n if (keepUpright) {\n labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false));\n }\n\n } else {\n glyphInstances = [{\n anchorPoint: new Point(anchor.x, anchor.y),\n offset: 0,\n angle: 0,\n maxScale: Infinity,\n minScale: minScale\n }];\n }\n\n const x1 = positionedGlyph.x + glyph.left;\n const y1 = positionedGlyph.y - glyph.top;\n const x2 = x1 + rect.w;\n const y2 = y1 + rect.h;\n\n const center = new Point(positionedGlyph.x, glyph.advance / 2);\n\n const otl = new Point(x1, y1);\n const otr = new Point(x2, y1);\n const obl = new Point(x1, y2);\n const obr = new Point(x2, y2);\n\n if (positionedGlyph.angle !== 0) {\n otl._sub(center)._rotate(positionedGlyph.angle)._add(center);\n otr._sub(center)._rotate(positionedGlyph.angle)._add(center);\n obl._sub(center)._rotate(positionedGlyph.angle)._add(center);\n obr._sub(center)._rotate(positionedGlyph.angle)._add(center);\n }\n\n for (let i = 0; i < glyphInstances.length; i++) {\n\n const instance = glyphInstances[i];\n let tl = otl,\n tr = otr,\n bl = obl,\n br = obr;\n\n if (textRotate) {\n const sin = Math.sin(textRotate),\n cos = Math.cos(textRotate),\n matrix = [cos, -sin, sin, cos];\n\n tl = tl.matMult(matrix);\n tr = tr.matMult(matrix);\n bl = bl.matMult(matrix);\n br = br.matMult(matrix);\n }\n\n // Prevent label from extending past the end of the line\n const glyphMinScale = Math.max(instance.minScale, labelMinScale);\n\n const anchorAngle = (anchor.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n const glyphAngle = (instance.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, anchorAngle, glyphAngle, glyphMinScale, instance.maxScale, shaping.writingMode));\n }\n }\n\n return quads;\n}\n\n/**\n * We can only render glyph quads that slide along a straight line. To draw\n * curved lines we need an instance of a glyph for each segment it appears on.\n * This creates all the instances of a glyph that are necessary to render a label.\n *\n * We need a\n * @param {Array} glyphInstances An empty array that glyphInstances are added to.\n * @param {Anchor} anchor\n * @param {number} offset The glyph's offset from the center of the label.\n * @param {Array} line\n * @param {number} segment The index of the segment of the line on which the anchor exists.\n * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier.\n *\n * @returns {Array} glyphInstances\n * @private\n */\nfunction getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) {\n const upsideDown = !forward;\n\n if (offset < 0) forward = !forward;\n\n if (forward) segment++;\n\n let newAnchorPoint = new Point(anchor.x, anchor.y);\n let end = line[segment];\n let prevScale = Infinity;\n\n offset = Math.abs(offset);\n\n const placementScale = minScale;\n\n while (true) {\n const distance = newAnchorPoint.dist(end);\n const scale = offset / distance;\n\n // Get the angle of the line segment\n let angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x);\n if (!forward) angle += Math.PI;\n\n glyphs.push({\n anchorPoint: newAnchorPoint,\n offset: upsideDown ? Math.PI : 0,\n minScale: scale,\n maxScale: prevScale,\n angle: (angle + 2 * Math.PI) % (2 * Math.PI)\n });\n\n if (scale <= placementScale) break;\n\n newAnchorPoint = end;\n\n // skip duplicate nodes\n while (newAnchorPoint.equals(end)) {\n segment += forward ? 1 : -1;\n end = line[segment];\n if (!end) {\n return scale;\n }\n }\n\n const unit = end.sub(newAnchorPoint)._unit();\n newAnchorPoint = newAnchorPoint.sub(unit._mult(distance));\n\n prevScale = scale;\n }\n\n return placementScale;\n}\n","'use strict';\n\nconst resolveTokens = require('../util/token');\n\nmodule.exports = function resolveText(layer, globalProperties, featureProperties) {\n let text = layer.getLayoutValue('text-field', globalProperties, featureProperties);\n if (layer.isLayoutValueFeatureConstant('text-field')) {\n text = resolveTokens(featureProperties, text);\n }\n if (!text) {\n return;\n }\n text = text.toString();\n\n const transform = layer.getLayoutValue('text-transform', globalProperties, featureProperties);\n if (transform === 'uppercase') {\n text = text.toLocaleUpperCase();\n } else if (transform === 'lowercase') {\n text = text.toLocaleLowerCase();\n }\n\n return text;\n};\n","'use strict';\n\nconst scriptDetection = require('../util/script_detection');\nconst verticalizePunctuation = require('../util/verticalize_punctuation');\nconst rtlTextPlugin = require('../source/rtl_text_plugin');\n\nconst WritingMode = {\n horizontal: 1,\n vertical: 2\n};\n\nmodule.exports = {\n shapeText: shapeText,\n shapeIcon: shapeIcon,\n WritingMode: WritingMode\n};\n\n\n// The position of a glyph relative to the text's anchor point.\nfunction PositionedGlyph(codePoint, x, y, glyph, angle) {\n this.codePoint = codePoint;\n this.x = x;\n this.y = y;\n this.glyph = glyph || null;\n this.angle = angle;\n}\n\n// A collection of positioned glyphs and some metadata\nfunction Shaping(positionedGlyphs, text, top, bottom, left, right, writingMode) {\n this.positionedGlyphs = positionedGlyphs;\n this.text = text;\n this.top = top;\n this.bottom = bottom;\n this.left = left;\n this.right = right;\n this.writingMode = writingMode;\n}\n\nfunction breakLines(text, lineBreakPoints) {\n const lines = [];\n let start = 0;\n for (const lineBreak of lineBreakPoints) {\n lines.push(text.substring(start, lineBreak));\n start = lineBreak;\n }\n\n if (start < text.length) {\n lines.push(text.substring(start, text.length));\n }\n return lines;\n}\n\nfunction shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate, verticalHeight, writingMode) {\n let logicalInput = text.trim();\n if (writingMode === WritingMode.vertical) logicalInput = verticalizePunctuation(logicalInput);\n\n const positionedGlyphs = [];\n const shaping = new Shaping(positionedGlyphs, logicalInput, translate[1], translate[1], translate[0], translate[0], writingMode);\n\n let lines;\n if (rtlTextPlugin.processBidirectionalText) {\n lines = rtlTextPlugin.processBidirectionalText(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs));\n } else {\n lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs));\n }\n\n shapeLines(shaping, glyphs, lines, lineHeight, horizontalAlign, verticalAlign, justify, translate, writingMode, spacing, verticalHeight);\n\n if (!positionedGlyphs.length)\n return false;\n\n return shaping;\n}\n\nconst whitespace = {\n 0x09: true, // tab\n 0x0a: true, // newline\n 0x0b: true, // vertical tab\n 0x0c: true, // form feed\n 0x0d: true, // carriage return\n 0x20: true, // space\n};\n\nconst breakable = {\n 0x0a: true, // newline\n 0x20: true, // space\n 0x26: true, // ampersand\n 0x28: true, // left parenthesis\n 0x29: true, // right parenthesis\n 0x2b: true, // plus sign\n 0x2d: true, // hyphen-minus\n 0x2f: true, // solidus\n 0xad: true, // soft hyphen\n 0xb7: true, // middle dot\n 0x200b: true, // zero-width space\n 0x2010: true, // hyphen\n 0x2013: true, // en dash\n 0x2027: true // interpunct\n // Many other characters may be reasonable breakpoints\n // Consider \"neutral orientation\" characters at scriptDetection.charHasNeutralVerticalOrientation\n // See https://github.com/mapbox/mapbox-gl-js/issues/3658\n};\n\nfunction determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphs) {\n let totalWidth = 0;\n\n for (const index in logicalInput) {\n const glyph = glyphs[logicalInput.charCodeAt(index)];\n if (!glyph)\n continue;\n totalWidth += glyph.advance + spacing;\n }\n\n const lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth));\n return totalWidth / lineCount;\n}\n\nfunction calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) {\n const raggedness = Math.pow(lineWidth - targetWidth, 2);\n if (isLastBreak) {\n // Favor finals lines shorter than average over longer than average\n if (lineWidth < targetWidth) {\n return raggedness / 2;\n } else {\n return raggedness * 2;\n }\n }\n\n return raggedness + Math.abs(penalty) * penalty;\n}\n\nfunction calculatePenalty(codePoint, nextCodePoint) {\n let penalty = 0;\n // Force break on newline\n if (codePoint === 0x0a) {\n penalty -= 10000;\n }\n // Penalize open parenthesis at end of line\n if (codePoint === 0x28 || codePoint === 0xff08) {\n penalty += 50;\n }\n\n // Penalize close parenthesis at beginning of line\n if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) {\n penalty += 50;\n }\n return penalty;\n}\n\nfunction evaluateBreak(breakIndex, breakX, targetWidth, potentialBreaks, penalty, isLastBreak) {\n // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth\n // ...but in fact we allow lines longer than maxWidth (if there's no break points)\n // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give\n // more lopsided results.\n\n let bestPriorBreak = null;\n let bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak);\n\n for (const potentialBreak of potentialBreaks) {\n const lineWidth = breakX - potentialBreak.x;\n const breakBadness =\n calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness;\n if (breakBadness <= bestBreakBadness) {\n bestPriorBreak = potentialBreak;\n bestBreakBadness = breakBadness;\n }\n }\n\n return {\n index: breakIndex,\n x: breakX,\n priorBreak: bestPriorBreak,\n badness: bestBreakBadness\n };\n}\n\nfunction leastBadBreaks(lastLineBreak) {\n if (!lastLineBreak) {\n return [];\n }\n return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index);\n}\n\nfunction determineLineBreaks(logicalInput, spacing, maxWidth, glyphs) {\n if (!maxWidth)\n return [];\n\n if (!logicalInput)\n return [];\n\n const potentialLineBreaks = [];\n const targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphs);\n\n let currentX = 0;\n\n for (let i = 0; i < logicalInput.length; i++) {\n const codePoint = logicalInput.charCodeAt(i);\n const glyph = glyphs[codePoint];\n\n if (glyph && !whitespace[codePoint])\n currentX += glyph.advance + spacing;\n\n // Ideographic characters, spaces, and word-breaking punctuation that often appear without\n // surrounding spaces.\n if ((i < logicalInput.length - 1) &&\n (breakable[codePoint] ||\n scriptDetection.charAllowsIdeographicBreaking(codePoint))) {\n\n potentialLineBreaks.push(\n evaluateBreak(\n i + 1,\n currentX,\n targetWidth,\n potentialLineBreaks,\n calculatePenalty(codePoint, logicalInput.charCodeAt(i + 1)),\n false));\n }\n\n\n }\n\n return leastBadBreaks(\n evaluateBreak(\n logicalInput.length,\n currentX,\n targetWidth,\n potentialLineBreaks,\n 0,\n true));\n}\n\nfunction shapeLines(shaping, glyphs, lines, lineHeight, horizontalAlign, verticalAlign, justify, translate, writingMode, spacing, verticalHeight) {\n // the y offset *should* be part of the font metadata\n const yOffset = -17;\n\n let x = 0;\n let y = yOffset;\n\n let maxLineLength = 0;\n const positionedGlyphs = shaping.positionedGlyphs;\n\n for (const i in lines) {\n const line = lines[i].trim();\n\n if (!line.length) {\n y += lineHeight; // Still need a line feed after empty line\n continue;\n }\n\n const lineStartIndex = positionedGlyphs.length;\n for (let i = 0; i < line.length; i++) {\n const codePoint = line.charCodeAt(i);\n const glyph = glyphs[codePoint];\n\n if (!glyph) continue;\n\n if (!scriptDetection.charHasUprightVerticalOrientation(codePoint) || writingMode === WritingMode.horizontal) {\n positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph, 0));\n x += glyph.advance + spacing;\n } else {\n positionedGlyphs.push(new PositionedGlyph(codePoint, x, 0, glyph, -Math.PI / 2));\n x += verticalHeight + spacing;\n }\n }\n\n // Only justify if we placed at least one glyph\n if (positionedGlyphs.length !== lineStartIndex) {\n const lineLength = x - spacing;\n maxLineLength = Math.max(lineLength, maxLineLength);\n\n justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify);\n }\n\n x = 0;\n y += lineHeight;\n }\n\n align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lines.length, translate);\n\n // Calculate the bounding box\n const height = lines.length * lineHeight;\n\n shaping.top += -verticalAlign * height;\n shaping.bottom = shaping.top + height;\n shaping.left += -horizontalAlign * maxLineLength;\n shaping.right = shaping.left + maxLineLength;\n}\n\n// justify left = 0, right = 1, center = .5\nfunction justifyLine(positionedGlyphs, glyphs, start, end, justify) {\n if (!justify)\n return;\n\n const lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance;\n const lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;\n\n for (let j = start; j <= end; j++) {\n positionedGlyphs[j].x -= lineIndent;\n }\n}\n\nfunction align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lineCount, translate) {\n const shiftX = (justify - horizontalAlign) * maxLineLength + translate[0];\n const shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight + translate[1];\n\n for (let j = 0; j < positionedGlyphs.length; j++) {\n positionedGlyphs[j].x += shiftX;\n positionedGlyphs[j].y += shiftY;\n }\n}\n\nfunction shapeIcon(image, iconOffset) {\n if (!image || !image.rect) return null;\n\n const dx = iconOffset[0];\n const dy = iconOffset[1];\n const x1 = dx - image.width / 2;\n const x2 = x1 + image.width;\n const y1 = dy - image.height / 2;\n const y2 = y1 + image.height;\n\n return new PositionedIcon(image, y1, y2, x1, x2);\n}\n\nfunction PositionedIcon(image, top, bottom, left, right) {\n this.image = image;\n this.top = top;\n this.bottom = bottom;\n this.left = left;\n this.right = right;\n}\n","'use strict';\n\nconst ShelfPack = require('@mapbox/shelf-pack');\nconst browser = require('../util/browser');\nconst util = require('../util/util');\nconst window = require('../util/window');\nconst Evented = require('../util/evented');\n\n// The SpriteAtlas class is responsible for turning a sprite and assorted\n// other images added at runtime into a texture that can be consumed by WebGL.\nclass SpriteAtlas extends Evented {\n\n constructor(width, height) {\n super();\n\n this.width = width;\n this.height = height;\n\n this.shelfPack = new ShelfPack(width, height);\n this.images = {};\n this.data = false;\n this.texture = 0; // WebGL ID\n this.filter = 0; // WebGL ID\n this.pixelRatio = 1;\n this.dirty = true;\n }\n\n allocateImage(pixelWidth, pixelHeight) {\n pixelWidth = pixelWidth / this.pixelRatio;\n pixelHeight = pixelHeight / this.pixelRatio;\n\n // Increase to next number divisible by 4, but at least 1.\n // This is so we can scale down the texture coordinates and pack them\n // into 2 bytes rather than 4 bytes.\n // Pad icons to prevent them from polluting neighbours during linear interpolation\n const padding = 2;\n const packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4);\n const packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4;\n\n const rect = this.shelfPack.packOne(packWidth, packHeight);\n if (!rect) {\n util.warnOnce('SpriteAtlas out of space.');\n return null;\n }\n\n return rect;\n }\n\n addImage(name, pixels, options) {\n let width, height, pixelRatio;\n if (pixels instanceof window.HTMLImageElement) {\n width = pixels.width;\n height = pixels.height;\n pixels = browser.getImageData(pixels);\n pixelRatio = this.pixelRatio;\n } else {\n width = options.width;\n height = options.height;\n pixelRatio = options.pixelRatio || this.pixelRatio;\n }\n\n if (ArrayBuffer.isView(pixels)) {\n pixels = new Uint32Array(pixels.buffer);\n }\n\n if (!(pixels instanceof Uint32Array)) {\n return this.fire('error', {error: new Error('Image provided in an invalid format. Supported formats are HTMLImageElement, ImageData, and ArrayBufferView.')});\n }\n\n if (this.images[name]) {\n return this.fire('error', {error: new Error('An image with this name already exists.')});\n }\n\n const rect = this.allocateImage(width, height);\n if (!rect) {\n return this.fire('error', {error: new Error('There is not enough space to add this image.')});\n }\n\n const image = {\n rect,\n width: width / pixelRatio,\n height: height / pixelRatio,\n sdf: false,\n pixelRatio: 1\n };\n this.images[name] = image;\n\n this.copy(pixels, width, rect, {pixelRatio, x: 0, y: 0, width, height}, false);\n\n this.fire('data', {dataType: 'style'});\n }\n\n removeImage(name) {\n const image = this.images[name];\n delete this.images[name];\n\n if (!image) {\n return this.fire('error', {error: new Error('No image with this name exists.')});\n }\n\n this.shelfPack.unref(image.rect);\n this.fire('data', {dataType: 'style'});\n }\n\n getImage(name, wrap) {\n if (this.images[name]) {\n return this.images[name];\n }\n\n if (!this.sprite) {\n return null;\n }\n\n const pos = this.sprite.getSpritePosition(name);\n if (!pos.width || !pos.height) {\n return null;\n }\n\n const rect = this.allocateImage(pos.width, pos.height);\n if (!rect) {\n return null;\n }\n\n const image = {\n rect,\n width: pos.width / pos.pixelRatio,\n height: pos.height / pos.pixelRatio,\n sdf: pos.sdf,\n pixelRatio: pos.pixelRatio / this.pixelRatio\n };\n this.images[name] = image;\n\n if (!this.sprite.imgData) return null;\n const srcImg = new Uint32Array(this.sprite.imgData.buffer);\n this.copy(srcImg, this.sprite.width, rect, pos, wrap);\n\n return image;\n }\n\n // Return position of a repeating fill pattern.\n getPosition(name, repeating) {\n const image = this.getImage(name, repeating);\n const rect = image && image.rect;\n\n if (!rect) {\n return null;\n }\n\n const width = image.width * image.pixelRatio;\n const height = image.height * image.pixelRatio;\n const padding = 1;\n\n return {\n size: [image.width, image.height],\n tl: [(rect.x + padding) / this.width, (rect.y + padding) / this.height],\n br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height]\n };\n }\n\n allocate() {\n if (!this.data) {\n const w = Math.floor(this.width * this.pixelRatio);\n const h = Math.floor(this.height * this.pixelRatio);\n this.data = new Uint32Array(w * h);\n for (let i = 0; i < this.data.length; i++) {\n this.data[i] = 0;\n }\n }\n }\n\n // Copy some portion of srcImage into `SpriteAtlas#data`\n copy(srcImg, srcImgWidth, dstPos, srcPos, wrap) {\n this.allocate();\n const dstImg = this.data;\n\n const padding = 1;\n\n copyBitmap(\n /* source buffer */ srcImg,\n /* source stride */ srcImgWidth,\n /* source x */ srcPos.x,\n /* source y */ srcPos.y,\n /* dest buffer */ dstImg,\n /* dest stride */ this.width * this.pixelRatio,\n /* dest x */ (dstPos.x + padding) * this.pixelRatio,\n /* dest y */ (dstPos.y + padding) * this.pixelRatio,\n /* icon dimension */ srcPos.width,\n /* icon dimension */ srcPos.height,\n /* wrap */ wrap\n );\n\n // Indicates that `SpriteAtlas#data` has changed and needs to be\n // reuploaded into the GL texture specified by `SpriteAtlas#texture`.\n this.dirty = true;\n }\n\n setSprite(sprite) {\n if (sprite) {\n this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1;\n\n if (this.canvas) {\n this.canvas.width = this.width * this.pixelRatio;\n this.canvas.height = this.height * this.pixelRatio;\n }\n }\n this.sprite = sprite;\n }\n\n addIcons(icons, callback) {\n for (let i = 0; i < icons.length; i++) {\n this.getImage(icons[i]);\n }\n\n callback(null, this.images);\n }\n\n bind(gl, linear) {\n let first = false;\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n first = true;\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n }\n\n const filterVal = linear ? gl.LINEAR : gl.NEAREST;\n if (filterVal !== this.filter) {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal);\n this.filter = filterVal;\n }\n\n if (this.dirty) {\n this.allocate();\n\n if (first) {\n gl.texImage2D(\n gl.TEXTURE_2D, // enum target\n 0, // ind level\n gl.RGBA, // ind internalformat\n this.width * this.pixelRatio, // GLsizei width\n this.height * this.pixelRatio, // GLsizei height\n 0, // ind border\n gl.RGBA, // enum format\n gl.UNSIGNED_BYTE, // enum type\n new Uint8Array(this.data.buffer) // Object data\n );\n } else {\n gl.texSubImage2D(\n gl.TEXTURE_2D, // enum target\n 0, // int level\n 0, // int xoffset\n 0, // int yoffset\n this.width * this.pixelRatio, // long width\n this.height * this.pixelRatio, // long height\n gl.RGBA, // enum format\n gl.UNSIGNED_BYTE, // enum type\n new Uint8Array(this.data.buffer) // Object pixels\n );\n }\n\n this.dirty = false;\n }\n }\n}\n\nmodule.exports = SpriteAtlas;\n\nfunction copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) {\n let srcI = srcY * srcStride + srcX;\n let dstI = dstY * dstStride + dstX;\n let x, y;\n\n if (wrap) {\n // add 1 pixel wrapped padding on each side of the image\n dstI -= dstStride;\n for (y = -1; y <= height; y++, dstI += dstStride) {\n srcI = ((y + height) % height + srcY) * srcStride + srcX;\n for (x = -1; x <= width; x++) {\n dst[dstI + x] = src[srcI + ((x + width) % width)];\n }\n }\n\n } else {\n for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) {\n for (x = 0; x < width; x++) {\n dst[dstI + x] = src[srcI + x];\n }\n }\n }\n}\n","'use strict';\n\nconst DOM = require('../util/dom');\nconst Point = require('point-geometry');\n\nconst handlers = {\n scrollZoom: require('./handler/scroll_zoom'),\n boxZoom: require('./handler/box_zoom'),\n dragRotate: require('./handler/drag_rotate'),\n dragPan: require('./handler/drag_pan'),\n keyboard: require('./handler/keyboard'),\n doubleClickZoom: require('./handler/dblclick_zoom'),\n touchZoomRotate: require('./handler/touch_zoom_rotate')\n};\n\nmodule.exports = function bindHandlers(map, options) {\n const el = map.getCanvasContainer();\n let contextMenuEvent = null;\n let mouseDown = false;\n let startPos = null;\n let tapped = null;\n\n for (const name in handlers) {\n map[name] = new handlers[name](map, options);\n if (options.interactive && options[name]) {\n map[name].enable(options[name]);\n }\n }\n\n el.addEventListener('mouseout', onMouseOut, false);\n el.addEventListener('mousedown', onMouseDown, false);\n el.addEventListener('mouseup', onMouseUp, false);\n el.addEventListener('mousemove', onMouseMove, false);\n el.addEventListener('touchstart', onTouchStart, false);\n el.addEventListener('touchend', onTouchEnd, false);\n el.addEventListener('touchmove', onTouchMove, false);\n el.addEventListener('touchcancel', onTouchCancel, false);\n el.addEventListener('click', onClick, false);\n el.addEventListener('dblclick', onDblClick, false);\n el.addEventListener('contextmenu', onContextMenu, false);\n\n function onMouseOut(e) {\n fireMouseEvent('mouseout', e);\n }\n\n function onMouseDown(e) {\n map.stop();\n startPos = DOM.mousePos(el, e);\n fireMouseEvent('mousedown', e);\n\n mouseDown = true;\n }\n\n function onMouseUp(e) {\n const rotating = map.dragRotate && map.dragRotate.isActive();\n\n if (contextMenuEvent && !rotating) {\n // This will be the case for Mac\n fireMouseEvent('contextmenu', contextMenuEvent);\n }\n\n contextMenuEvent = null;\n mouseDown = false;\n fireMouseEvent('mouseup', e);\n }\n\n function onMouseMove(e) {\n if (map.dragPan && map.dragPan.isActive()) return;\n if (map.dragRotate && map.dragRotate.isActive()) return;\n\n let target = e.toElement || e.target;\n while (target && target !== el) target = target.parentNode;\n if (target !== el) return;\n\n fireMouseEvent('mousemove', e);\n }\n\n function onTouchStart(e) {\n map.stop();\n fireTouchEvent('touchstart', e);\n\n if (!e.touches || e.touches.length > 1) return;\n\n if (!tapped) {\n tapped = setTimeout(onTouchTimeout, 300);\n\n } else {\n clearTimeout(tapped);\n tapped = null;\n fireMouseEvent('dblclick', e);\n }\n }\n\n function onTouchMove(e) {\n fireTouchEvent('touchmove', e);\n }\n\n function onTouchEnd(e) {\n fireTouchEvent('touchend', e);\n }\n\n function onTouchCancel(e) {\n fireTouchEvent('touchcancel', e);\n }\n\n function onTouchTimeout() {\n tapped = null;\n }\n\n function onClick(e) {\n const pos = DOM.mousePos(el, e);\n\n if (pos.equals(startPos)) {\n fireMouseEvent('click', e);\n }\n }\n\n function onDblClick(e) {\n fireMouseEvent('dblclick', e);\n e.preventDefault();\n }\n\n function onContextMenu(e) {\n const rotating = map.dragRotate && map.dragRotate.isActive();\n if (!mouseDown && !rotating) {\n // Windows: contextmenu fired on mouseup, so fire event now\n fireMouseEvent('contextmenu', e);\n } else if (mouseDown) {\n // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake\n contextMenuEvent = e;\n }\n\n e.preventDefault();\n }\n\n function fireMouseEvent(type, e) {\n const pos = DOM.mousePos(el, e);\n\n return map.fire(type, {\n lngLat: map.unproject(pos),\n point: pos,\n originalEvent: e\n });\n }\n\n function fireTouchEvent(type, e) {\n const touches = DOM.touchPos(el, e);\n const singular = touches.reduce((prev, curr, i, arr) => {\n return prev.add(curr.div(arr.length));\n }, new Point(0, 0));\n\n return map.fire(type, {\n lngLat: map.unproject(singular),\n point: singular,\n lngLats: touches.map((t) => { return map.unproject(t); }, this),\n points: touches,\n originalEvent: e\n });\n }\n};\n\n/**\n * @typedef {Object} MapMouseEvent\n * @property {string} type The event type.\n * @property {Map} target The `Map` object that fired the event.\n * @property {MouseEvent} originalEvent\n * @property {Point} point The pixel coordinates of the mouse event target, relative to the map\n * and measured from the top left corner.\n * @property {LngLat} lngLat The geographic location on the map of the mouse event target.\n */\n\n/**\n * @typedef {Object} MapTouchEvent\n * @property {string} type The event type.\n * @property {Map} target The `Map` object that fired the event.\n * @property {TouchEvent} originalEvent\n * @property {Point} point The pixel coordinates of the center of the touch event points, relative to the map\n * and measured from the top left corner.\n * @property {LngLat} lngLat The geographic location on the map of the center of the touch event points.\n * @property {Array} points The array of pixel coordinates corresponding to\n * a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches)\n * property.\n * @property {Array} lngLats The geographical locations on the map corresponding to\n * a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches)\n * property.\n */\n","'use strict';\n\nconst util = require('../util/util');\nconst interpolate = require('../util/interpolate');\nconst browser = require('../util/browser');\nconst LngLat = require('../geo/lng_lat');\nconst LngLatBounds = require('../geo/lng_lat_bounds');\nconst Point = require('point-geometry');\nconst Evented = require('../util/evented');\n\n/**\n * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo},\n * controlling the destination's location, zoom level, bearing, and pitch.\n * All properties are optional. Unspecified\n * options will default to the map's current value for that property.\n *\n * @typedef {Object} CameraOptions\n * @property {LngLatLike} center The destination's center.\n * @property {number} zoom The destination's zoom level.\n * @property {number} bearing The destination's bearing (rotation), measured in degrees counter-clockwise from north.\n * @property {number} pitch The destination's pitch (tilt), measured in degrees.\n * @property {LngLatLike} around If a `zoom` is specified, `around` determines the zoom center (defaults to the center of the map).\n */\n\n/**\n * Options common to map movement methods that involve animation, such as {@link Map#panBy} and\n * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration The animation's duration, measured in milliseconds.\n * @property {Function} easing A function taking a time in the range 0..1 and returning a number where 0 is\n * the initial state and 1 is the final state.\n * @property {PointLike} offset `x` and `y` coordinates representing the animation's origin of movement relative to the map's center.\n * @property {boolean} animate If `false`, no animation will occur.\n */\n\n/**\n * Options for setting padding on a call to {@link Map#fitBounds}. All properties of this object must be\n * non-negative integers.\n *\n * @typedef {Object} PaddingOptions\n * @property {number} top Padding in pixels from the top of the map canvas.\n * @property {number} bottom Padding in pixels from the bottom of the map canvas.\n * @property {number} left Padding in pixels from the left of the map canvas.\n * @property {number} right Padding in pixels from the right of the map canvas.\n */\n\nclass Camera extends Evented {\n\n constructor(transform, options) {\n super();\n this.moving = false;\n this.transform = transform;\n this._bearingSnap = options.bearingSnap;\n }\n\n /**\n * Returns the map's geographical centerpoint.\n *\n * @memberof Map#\n * @returns {LngLat} The map's geographical centerpoint.\n */\n getCenter() { return this.transform.center; }\n\n /**\n * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`.\n *\n * @memberof Map#\n * @param {LngLatLike} center The centerpoint to set.\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n * @example\n * map.setCenter([-74, 38]);\n * @see [Move symbol with the keyboard](https://www.mapbox.com/mapbox-gl-js/example/rotating-controllable-marker/)\n */\n setCenter(center, eventData) {\n this.jumpTo({center: center}, eventData);\n return this;\n }\n\n /**\n * Pans the map by the specified offest.\n *\n * @memberof Map#\n * @param {Array} offset `x` and `y` coordinates by which to pan the map.\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/)\n */\n panBy(offset, options, eventData) {\n this.panTo(this.transform.center,\n util.extend({offset: Point.convert(offset).mult(-1)}, options), eventData);\n return this;\n }\n\n /**\n * Pans the map to the specified location, with an animated transition.\n *\n * @memberof Map#\n * @param {LngLatLike} lnglat The location to pan the map to.\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n panTo(lnglat, options, eventData) {\n return this.easeTo(util.extend({\n center: lnglat\n }, options), eventData);\n }\n\n /**\n * Returns the map's current zoom level.\n *\n * @memberof Map#\n * @returns {number} The map's current zoom level.\n */\n getZoom() { return this.transform.zoom; }\n\n /**\n * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`.\n *\n * @memberof Map#\n * @param {number} zoom The zoom level to set (0-20).\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires moveend\n * @fires zoomend\n * @returns {Map} `this`\n * @example\n * // zoom the map to 5\n * map.setZoom(5);\n */\n setZoom(zoom, eventData) {\n this.jumpTo({zoom: zoom}, eventData);\n return this;\n }\n\n /**\n * Zooms the map to the specified zoom level, with an animated transition.\n *\n * @memberof Map#\n * @param {number} zoom The zoom level to transition to.\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires moveend\n * @fires zoomend\n * @returns {Map} `this`\n */\n zoomTo(zoom, options, eventData) {\n return this.easeTo(util.extend({\n zoom: zoom\n }, options), eventData);\n }\n\n /**\n * Increases the map's zoom level by 1.\n *\n * @memberof Map#\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires moveend\n * @fires zoomend\n * @returns {Map} `this`\n */\n zoomIn(options, eventData) {\n this.zoomTo(this.getZoom() + 1, options, eventData);\n return this;\n }\n\n /**\n * Decreases the map's zoom level by 1.\n *\n * @memberof Map#\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires moveend\n * @fires zoomend\n * @returns {Map} `this`\n */\n zoomOut(options, eventData) {\n this.zoomTo(this.getZoom() - 1, options, eventData);\n return this;\n }\n\n /**\n * Returns the map's current bearing (rotation).\n *\n * @memberof Map#\n * @returns {number} The map's current bearing, measured in degrees counter-clockwise from north.\n * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/)\n */\n getBearing() { return this.transform.bearing; }\n\n /**\n * Sets the maps' bearing (rotation). Equivalent to `jumpTo({bearing: bearing})`.\n *\n * @memberof Map#\n * @param {number} bearing The bearing to set, measured in degrees counter-clockwise from north.\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n * @example\n * // rotate the map to 90 degrees\n * map.setBearing(90);\n */\n setBearing(bearing, eventData) {\n this.jumpTo({bearing: bearing}, eventData);\n return this;\n }\n\n /**\n * Rotates the map to the specified bearing, with an animated transition.\n *\n * @memberof Map#\n * @param {number} bearing The bearing to rotate the map to, measured in degrees counter-clockwise from north.\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n rotateTo(bearing, options, eventData) {\n return this.easeTo(util.extend({\n bearing: bearing\n }, options), eventData);\n }\n\n /**\n * Rotates the map to a bearing of 0 (due north), with an animated transition.\n *\n * @memberof Map#\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n resetNorth(options, eventData) {\n this.rotateTo(0, util.extend({duration: 1000}, options), eventData);\n return this;\n }\n\n /**\n * Snaps the map's bearing to 0 (due north), if the current bearing is close enough to it (i.e. within the `bearingSnap` threshold).\n *\n * @memberof Map#\n * @param {AnimationOptions} [options]\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n snapToNorth(options, eventData) {\n if (Math.abs(this.getBearing()) < this._bearingSnap) {\n return this.resetNorth(options, eventData);\n }\n return this;\n }\n\n /**\n * Returns the map's current pitch (tilt).\n *\n * @memberof Map#\n * @returns {number} The map's current pitch, measured in degrees away from the plane of the screen.\n */\n getPitch() { return this.transform.pitch; }\n\n /**\n * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`.\n *\n * @memberof Map#\n * @param {number} pitch The pitch to set, measured in degrees away from the plane of the screen (0-60).\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n setPitch(pitch, eventData) {\n this.jumpTo({pitch: pitch}, eventData);\n return this;\n }\n\n\n /**\n * Pans and zooms the map to contain its visible area within the specified geographical bounds.\n * This function will also reset the map's bearing to 0 if bearing is nonzero.\n *\n * @memberof Map#\n * @param {LngLatBoundsLike} bounds Center these bounds in the viewport and use the highest\n * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport.\n * @param {AnimationOptions | CameraOptions } [options]\n * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds.\n * @param {boolean} [options.linear=false] If `true`, the map transitions using\n * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See\n * those functions and @{link AnimationOptions} for information about options available.\n * @param {Function} [options.easing] An easing function for the animated transition. See [AnimationOptions](#AnimationOptions).\n * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels.\n * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds.\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n\t * @example\n * var bbox = [[-79, 43], [-73, 45]];\n * map.fitBounds(bbox, {\n * padding: {top: 10, bottom:25, left: 15, right: 5}\n * });\n * @see [Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/)\n */\n fitBounds(bounds, options, eventData) {\n\n options = util.extend({\n padding: {\n top: 0,\n bottom: 0,\n right: 0,\n left: 0\n },\n offset: [0, 0],\n maxZoom: this.transform.maxZoom\n }, options);\n\n if (typeof options.padding === 'number') {\n const p = options.padding;\n options.padding = {\n top: p,\n bottom: p,\n right: p,\n left: p\n };\n }\n if (!util.deepEqual(Object.keys(options.padding).sort((a, b) => {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }), [\"bottom\", \"left\", \"right\", \"top\"])) {\n util.warnOnce(\"options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'\");\n return;\n }\n\n bounds = LngLatBounds.convert(bounds);\n\n // we separate the passed padding option into two parts, the part that does not affect the map's center\n // (lateral and vertical padding), and the part that does (paddingOffset). We add the padding offset\n // to the options `offset` object where it can alter the map's center in the subsequent calls to\n // `easeTo` and `flyTo`.\n const paddingOffset = [options.padding.left - options.padding.right, options.padding.top - options.padding.bottom],\n lateralPadding = Math.min(options.padding.right, options.padding.left),\n verticalPadding = Math.min(options.padding.top, options.padding.bottom);\n options.offset = [options.offset[0] + paddingOffset[0], options.offset[1] + paddingOffset[1]];\n\n const offset = Point.convert(options.offset),\n tr = this.transform,\n nw = tr.project(bounds.getNorthWest()),\n se = tr.project(bounds.getSouthEast()),\n size = se.sub(nw),\n scaleX = (tr.width - lateralPadding * 2 - Math.abs(offset.x) * 2) / size.x,\n scaleY = (tr.height - verticalPadding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n if (scaleY < 0 || scaleX < 0) {\n util.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.');\n return;\n }\n\n options.center = tr.unproject(nw.add(se).div(2));\n options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);\n options.bearing = 0;\n\n return options.linear ?\n this.easeTo(options, eventData) :\n this.flyTo(options, eventData);\n }\n\n /**\n * Changes any combination of center, zoom, bearing, and pitch, without\n * an animated transition. The map will retain its current values for any\n * details not specified in `options`.\n *\n * @memberof Map#\n * @param {CameraOptions} options\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires rotate\n * @fires pitch\n * @fires zoomend\n * @fires moveend\n * @returns {Map} `this`\n */\n jumpTo(options, eventData) {\n this.stop();\n\n const tr = this.transform;\n let zoomChanged = false,\n bearingChanged = false,\n pitchChanged = false;\n\n if ('zoom' in options && tr.zoom !== +options.zoom) {\n zoomChanged = true;\n tr.zoom = +options.zoom;\n }\n\n if ('center' in options) {\n tr.center = LngLat.convert(options.center);\n }\n\n if ('bearing' in options && tr.bearing !== +options.bearing) {\n bearingChanged = true;\n tr.bearing = +options.bearing;\n }\n\n if ('pitch' in options && tr.pitch !== +options.pitch) {\n pitchChanged = true;\n tr.pitch = +options.pitch;\n }\n\n this.fire('movestart', eventData)\n .fire('move', eventData);\n\n if (zoomChanged) {\n this.fire('zoomstart', eventData)\n .fire('zoom', eventData)\n .fire('zoomend', eventData);\n }\n\n if (bearingChanged) {\n this.fire('rotate', eventData);\n }\n\n if (pitchChanged) {\n this.fire('pitch', eventData);\n }\n\n return this.fire('moveend', eventData);\n }\n\n /**\n * Changes any combination of center, zoom, bearing, and pitch, with an animated transition\n * between old and new values. The map will retain its current values for any\n * details not specified in `options`.\n *\n * @memberof Map#\n * @param {Object} options Options describing the destination and animation of the transition.\n * Accepts [CameraOptions](#CameraOptions) and [AnimationOptions](#AnimationOptions).\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires rotate\n * @fires pitch\n * @fires zoomend\n * @fires moveend\n * @returns {Map} `this`\n * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/)\n */\n easeTo(options, eventData) {\n this.stop();\n\n options = util.extend({\n offset: [0, 0],\n duration: 500,\n easing: util.ease\n }, options);\n\n const tr = this.transform,\n offset = Point.convert(options.offset),\n startZoom = this.getZoom(),\n startBearing = this.getBearing(),\n startPitch = this.getPitch(),\n\n zoom = 'zoom' in options ? +options.zoom : startZoom,\n bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n pitch = 'pitch' in options ? +options.pitch : startPitch;\n\n let toLngLat,\n toPoint;\n\n if ('center' in options) {\n toLngLat = LngLat.convert(options.center);\n toPoint = tr.centerPoint.add(offset);\n } else if ('around' in options) {\n toLngLat = LngLat.convert(options.around);\n toPoint = tr.locationPoint(toLngLat);\n } else {\n toPoint = tr.centerPoint.add(offset);\n toLngLat = tr.pointLocation(toPoint);\n }\n\n const fromPoint = tr.locationPoint(toLngLat);\n\n if (options.animate === false) options.duration = 0;\n\n this.zooming = (zoom !== startZoom);\n this.rotating = (startBearing !== bearing);\n this.pitching = (pitch !== startPitch);\n\n if (options.smoothEasing && options.duration !== 0) {\n options.easing = this._smoothOutEasing(options.duration);\n }\n\n if (!options.noMoveStart) {\n this.moving = true;\n this.fire('movestart', eventData);\n }\n if (this.zooming) {\n this.fire('zoomstart', eventData);\n }\n\n clearTimeout(this._onEaseEnd);\n\n this._ease(function (k) {\n if (this.zooming) {\n tr.zoom = interpolate(startZoom, zoom, k);\n }\n\n if (this.rotating) {\n tr.bearing = interpolate(startBearing, bearing, k);\n }\n\n if (this.pitching) {\n tr.pitch = interpolate(startPitch, pitch, k);\n }\n\n tr.setLocationAtPoint(toLngLat, fromPoint.add(toPoint.sub(fromPoint)._mult(k)));\n\n this.fire('move', eventData);\n if (this.zooming) {\n this.fire('zoom', eventData);\n }\n if (this.rotating) {\n this.fire('rotate', eventData);\n }\n if (this.pitching) {\n this.fire('pitch', eventData);\n }\n }, () => {\n if (options.delayEndEvents) {\n this._onEaseEnd = setTimeout(this._easeToEnd.bind(this, eventData), options.delayEndEvents);\n } else {\n this._easeToEnd(eventData);\n }\n }, options);\n\n return this;\n }\n\n _easeToEnd(eventData) {\n const wasZooming = this.zooming;\n this.moving = false;\n this.zooming = false;\n this.rotating = false;\n this.pitching = false;\n\n if (wasZooming) {\n this.fire('zoomend', eventData);\n }\n this.fire('moveend', eventData);\n\n }\n\n /**\n * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that\n * evokes flight. The animation seamlessly incorporates zooming and panning to help\n * the user maintain her bearings even after traversing a great distance.\n *\n * @memberof Map#\n * @param {Object} options Options describing the destination and animation of the transition.\n * Accepts [CameraOptions](#CameraOptions), [AnimationOptions](#AnimationOptions),\n * and the following additional options.\n * @param {number} [options.curve=1.42] The zooming \"curve\" that will occur along the\n * flight path. A high value maximizes zooming for an exaggerated animation, while a low\n * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average\n * value selected by participants in the user study discussed in\n * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of\n * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A\n * value of 1 would produce a circular motion.\n * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If\n * `options.curve` is specified, this option is ignored.\n * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to\n * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path\n * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span.\n * It does not correspond to a fixed physical distance, but varies by zoom level.\n * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls\n * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored.\n * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method.\n * @fires movestart\n * @fires zoomstart\n * @fires move\n * @fires zoom\n * @fires rotate\n * @fires pitch\n * @fires zoomend\n * @fires moveend\n * @returns {Map} `this`\n * @example\n * // fly with default options to null island\n * map.flyTo({center: [0, 0], zoom: 9});\n * // using flyTo options\n * map.flyTo({\n * center: [0, 0],\n * zoom: 9,\n * speed: 0.2,\n * curve: 1,\n * easing(t) {\n * return t;\n * }\n * });\n * @see [Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/)\n * @see [Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/)\n * @see [Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/)\n */\n flyTo(options, eventData) {\n // This method implements an “optimal path” animation, as detailed in:\n //\n // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS\n // ’03. pp. 15–22. .\n //\n // Where applicable, local variable documentation begins with the associated variable or\n // function in van Wijk (2003).\n\n this.stop();\n\n options = util.extend({\n offset: [0, 0],\n speed: 1.2,\n curve: 1.42,\n easing: util.ease\n }, options);\n\n const tr = this.transform,\n offset = Point.convert(options.offset),\n startZoom = this.getZoom(),\n startBearing = this.getBearing(),\n startPitch = this.getPitch();\n\n const center = 'center' in options ? LngLat.convert(options.center) : this.getCenter();\n const zoom = 'zoom' in options ? +options.zoom : startZoom;\n const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n const pitch = 'pitch' in options ? +options.pitch : startPitch;\n\n // If a path crossing the antimeridian would be shorter, extend the final coordinate so that\n // interpolating between the two endpoints will cross it.\n if (Math.abs(tr.center.lng) + Math.abs(center.lng) > 180) {\n if (tr.center.lng > 0 && center.lng < 0) {\n center.lng += 360;\n } else if (tr.center.lng < 0 && center.lng > 0) {\n center.lng -= 360;\n }\n }\n\n const scale = tr.zoomScale(zoom - startZoom),\n from = tr.point,\n to = 'center' in options ? tr.project(center).sub(offset.div(scale)) : from;\n\n let rho = options.curve;\n\n // w₀: Initial visible span, measured in pixels at the initial scale.\n const w0 = Math.max(tr.width, tr.height),\n // w₁: Final visible span, measured in pixels with respect to the initial scale.\n w1 = w0 / scale,\n // Length of the flight path as projected onto the ground plane, measured in pixels from\n // the world image origin at the initial scale.\n u1 = to.sub(from).mag();\n\n if ('minZoom' in options) {\n const minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom);\n // wm: Maximum visible span, measured in pixels with respect to the initial\n // scale.\n const wMax = w0 / tr.zoomScale(minZoom - startZoom);\n rho = Math.sqrt(wMax / u1 * 2);\n }\n\n // ρ²\n const rho2 = rho * rho;\n\n /**\n * rᵢ: Returns the zoom-out factor at one end of the animation.\n *\n * @param i 0 for the ascent or 1 for the descent.\n * @private\n */\n function r(i) {\n const b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n return Math.log(Math.sqrt(b * b + 1) - b);\n }\n\n function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n function tanh(n) { return sinh(n) / cosh(n); }\n\n // r₀: Zoom-out factor during ascent.\n const r0 = r(0);\n /**\n * w(s): Returns the visible span on the ground, measured in pixels with respect to the\n * initial scale.\n *\n * Assumes an angular field of view of 2 arctan ½ ≈ 53°.\n * @private\n */\n let w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); },\n /**\n * u(s): Returns the distance along the flight path as projected onto the ground plane,\n * measured in pixels from the world image origin at the initial scale.\n * @private\n */\n u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; },\n // S: Total length of the flight path, measured in ρ-screenfuls.\n S = (r(1) - r0) / rho;\n\n // When u₀ = u₁, the optimal path doesn’t require both ascent and descent.\n if (Math.abs(u1) < 0.000001) {\n // Perform a more or less instantaneous transition if the path is too short.\n if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options, eventData);\n\n const k = w1 < w0 ? -1 : 1;\n S = Math.abs(Math.log(w1 / w0)) / rho;\n\n u = function() { return 0; };\n w = function(s) { return Math.exp(k * rho * s); };\n }\n\n if ('duration' in options) {\n options.duration = +options.duration;\n } else {\n const V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed;\n options.duration = 1000 * S / V;\n }\n\n this.moving = true;\n this.zooming = true;\n if (startBearing !== bearing) this.rotating = true;\n if (startPitch !== pitch) this.pitching = true;\n\n this.fire('movestart', eventData);\n this.fire('zoomstart', eventData);\n\n this._ease(function (k) {\n // s: The distance traveled along the flight path, measured in ρ-screenfuls.\n const s = k * S,\n us = u(s);\n\n const scale = 1 / w(s);\n tr.zoom = startZoom + tr.scaleZoom(scale);\n tr.center = tr.unproject(from.add(to.sub(from).mult(us)).mult(scale));\n\n if (this.rotating) {\n tr.bearing = interpolate(startBearing, bearing, k);\n }\n if (this.pitching) {\n tr.pitch = interpolate(startPitch, pitch, k);\n }\n\n this.fire('move', eventData);\n this.fire('zoom', eventData);\n if (this.rotating) {\n this.fire('rotate', eventData);\n }\n if (this.pitching) {\n this.fire('pitch', eventData);\n }\n }, function() {\n this.moving = false;\n this.zooming = false;\n this.rotating = false;\n this.pitching = false;\n\n this.fire('zoomend', eventData);\n this.fire('moveend', eventData);\n }, options);\n\n return this;\n }\n\n isEasing() {\n return !!this._abortFn;\n }\n\n /**\n * Returns a Boolean indicating whether the camera is moving.\n *\n * @memberof Map#\n * @returns {boolean} A Boolean indicating whether the camera is moving.\n */\n isMoving() {\n return this.moving;\n }\n\n /**\n * Stops any animated transition underway.\n *\n * @memberof Map#\n * @returns {Map} `this`\n */\n stop() {\n if (this._abortFn) {\n this._abortFn();\n this._finishEase();\n }\n return this;\n }\n\n _ease(frame, finish, options) {\n this._finishFn = finish;\n this._abortFn = browser.timed(function (t) {\n frame.call(this, options.easing(t));\n if (t === 1) {\n this._finishEase();\n }\n }, options.animate === false ? 0 : options.duration, this);\n }\n\n _finishEase() {\n delete this._abortFn;\n // The finish function might emit events which trigger new eases, which\n // set a new _finishFn. Ensure we don't delete it unintentionally.\n const finish = this._finishFn;\n delete this._finishFn;\n finish.call(this);\n }\n\n // convert bearing so that it's numerically close to the current one so that it interpolates properly\n _normalizeBearing(bearing, currentBearing) {\n bearing = util.wrap(bearing, -180, 180);\n const diff = Math.abs(bearing - currentBearing);\n if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n return bearing;\n }\n\n // only used on mouse-wheel zoom to smooth out animation\n _smoothOutEasing(duration) {\n let easing = util.ease;\n\n if (this._prevEase) {\n const ease = this._prevEase,\n t = (Date.now() - ease.start) / ease.duration,\n speed = ease.easing(t + 0.01) - ease.easing(t),\n\n // Quick hack to make new bezier that is continuous with last\n x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n y = Math.sqrt(0.27 * 0.27 - x * x);\n\n easing = util.bezier(x, y, 0.25, 1);\n }\n\n this._prevEase = {\n start: (new Date()).getTime(),\n duration: duration,\n easing: easing\n };\n\n return easing;\n }\n}\n\n/**\n * Fired whenever the map's pitch (tilt) changes.\n *\n * @event pitch\n * @memberof Map\n * @instance\n * @property {MapEventData} data\n */\n\nmodule.exports = Camera;\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\n\n/**\n * An `AttributionControl` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/).\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {boolean} [options.compact] If `true` force a compact attribution that shows the full attribution on mouse hover, or if `false` force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide.\n * @example\n * var map = new mapboxgl.Map({attributionControl: false})\n * .addControl(new mapboxgl.AttributionControl({\n * compact: true\n * }));\n */\nclass AttributionControl {\n\n constructor(options) {\n this.options = options;\n\n util.bindAll([\n '_updateEditLink',\n '_updateData',\n '_updateCompact'\n ], this);\n }\n\n getDefaultPosition() {\n return 'bottom-right';\n }\n\n onAdd(map) {\n const compact = this.options && this.options.compact;\n\n this._map = map;\n this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib');\n\n if (compact) {\n this._container.classList.add('compact');\n }\n\n this._updateAttributions();\n this._updateEditLink();\n\n this._map.on('sourcedata', this._updateData);\n this._map.on('moveend', this._updateEditLink);\n\n if (compact === undefined) {\n this._map.on('resize', this._updateCompact);\n this._updateCompact();\n }\n\n return this._container;\n }\n\n onRemove() {\n this._container.parentNode.removeChild(this._container);\n\n this._map.off('sourcedata', this._updateData);\n this._map.off('moveend', this._updateEditLink);\n this._map.off('resize', this._updateCompact);\n\n this._map = undefined;\n }\n\n _updateEditLink() {\n if (!this._editLink) this._editLink = this._container.querySelector('.mapbox-improve-map');\n if (this._editLink) {\n const center = this._map.getCenter();\n this._editLink.href = `https://www.mapbox.com/map-feedback/#/${\n center.lng}/${center.lat}/${Math.round(this._map.getZoom() + 1)}`;\n }\n }\n\n _updateData(e) {\n this._updateAttributions(e);\n this._updateEditLink();\n }\n\n _updateAttributions(e) {\n if (!this._map.style) return;\n if (e && e.sourceDataType !== 'metadata') return;\n let attributions = [];\n\n const sourceCaches = this._map.style.sourceCaches;\n for (const id in sourceCaches) {\n const source = sourceCaches[id].getSource();\n if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n attributions.push(source.attribution);\n }\n }\n\n // remove any entries that are substrings of another entry.\n // first sort by length so that substrings come first\n attributions.sort((a, b) => a.length - b.length);\n attributions = attributions.filter((attrib, i) => {\n for (let j = i + 1; j < attributions.length; j++) {\n if (attributions[j].indexOf(attrib) >= 0) { return false; }\n }\n return true;\n });\n this._container.innerHTML = attributions.join(' | ');\n // remove old DOM node from _editLink\n this._editLink = null;\n }\n\n _updateCompact() {\n const compact = this._map.getCanvasContainer().offsetWidth <= 640;\n\n this._container.classList[compact ? 'add' : 'remove']('compact');\n }\n\n}\n\nmodule.exports = AttributionControl;\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\nconst window = require('../../util/window');\n\n/**\n * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode.\n *\n * @implements {IControl}\n * @example\n * map.addControl(new mapboxgl.FullscreenControl());\n * @see [View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/)\n */\n\nclass FullscreenControl {\n\n constructor() {\n this._fullscreen = false;\n util.bindAll([\n '_onClickFullscreen',\n '_changeIcon'\n ], this);\n if ('onfullscreenchange' in window.document) {\n this._fullscreenchange = 'fullscreenchange';\n } else if ('onmozfullscreenchange' in window.document) {\n this._fullscreenchange = 'mozfullscreenchange';\n } else if ('onwebkitfullscreenchange' in window.document) {\n this._fullscreenchange = 'webkitfullscreenchange';\n } else if ('onmsfullscreenchange' in window.document) {\n this._fullscreenchange = 'MSFullscreenChange';\n }\n }\n\n onAdd(map) {\n const className = 'mapboxgl-ctrl';\n const container = this._container = DOM.create('div', `${className} mapboxgl-ctrl-group`);\n const button = this._fullscreenButton = DOM.create('button', (`${className}-icon ${className}-fullscreen`), this._container);\n button.setAttribute(\"aria-label\", \"Toggle fullscreen\");\n button.type = 'button';\n this._fullscreenButton.addEventListener('click', this._onClickFullscreen);\n this._mapContainer = map.getContainer();\n window.document.addEventListener(this._fullscreenchange, this._changeIcon);\n return container;\n }\n\n onRemove() {\n this._container.parentNode.removeChild(this._container);\n this._map = null;\n window.document.removeEventListener(this._fullscreenchange, this._changeIcon);\n }\n\n _isFullscreen() {\n return this._fullscreen;\n }\n\n _changeIcon(e) {\n if (e.target === this._mapContainer) {\n this._fullscreen = !this._fullscreen;\n const className = 'mapboxgl-ctrl';\n this._fullscreenButton.classList.toggle(`${className}-shrink`);\n this._fullscreenButton.classList.toggle(`${className}-fullscreen`);\n }\n }\n\n _onClickFullscreen() {\n if (this._isFullscreen()) {\n if (window.document.exitFullscreen) {\n window.document.exitFullscreen();\n } else if (window.document.mozCancelFullScreen) {\n window.document.mozCancelFullScreen();\n } else if (window.document.msExitFullscreen) {\n window.document.msExitFullscreen();\n } else if (window.document.webkitCancelFullScreen) {\n window.document.webkitCancelFullScreen();\n }\n } else if (this._mapContainer.requestFullscreen) {\n this._mapContainer.requestFullscreen();\n } else if (this._mapContainer.mozRequestFullScreen) {\n this._mapContainer.mozRequestFullScreen();\n } else if (this._mapContainer.msRequestFullscreen) {\n this._mapContainer.msRequestFullscreen();\n } else if (this._mapContainer.webkitRequestFullscreen) {\n this._mapContainer.webkitRequestFullscreen();\n }\n }\n}\n\nmodule.exports = FullscreenControl;\n","'use strict';\n\nconst Evented = require('../../util/evented');\nconst DOM = require('../../util/dom');\nconst window = require('../../util/window');\nconst util = require('../../util/util');\n\nconst defaultGeoPositionOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };\nconst className = 'mapboxgl-ctrl';\n\nlet supportsGeolocation;\n\nfunction checkGeolocationSupport(callback) {\n if (supportsGeolocation !== undefined) {\n callback(supportsGeolocation);\n\n } else if (window.navigator.permissions !== undefined) {\n // navigator.permissions has incomplete browser support\n // http://caniuse.com/#feat=permissions-api\n // Test for the case where a browser disables Geolocation because of an\n // insecure origin\n window.navigator.permissions.query({ name: 'geolocation' }).then((p) => {\n supportsGeolocation = p.state !== 'denied';\n callback(supportsGeolocation);\n });\n\n } else {\n supportsGeolocation = !!window.navigator.geolocation;\n callback(supportsGeolocation);\n }\n}\n\n/**\n * A `GeolocateControl` control provides a button that uses the browser's geolocation\n * API to locate the user on the map.\n *\n * Not all browsers support geolocation,\n * and some users may disable the feature. Geolocation support for modern\n * browsers including Chrome requires sites to be served over HTTPS. If\n * geolocation support is not available, the GeolocateControl will not\n * be visible.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object.\n * @param {Object} [options.watchPosition=false] If `true` the map will reposition each time the position of the device changes and the control becomes a toggle.\n * @example\n * map.addControl(new mapboxgl.GeolocateControl({\n * positionOptions: {\n * enableHighAccuracy: true\n * }\n * }));\n */\nclass GeolocateControl extends Evented {\n\n constructor(options) {\n super();\n this.options = options || {};\n util.bindAll([\n '_onSuccess',\n '_onError',\n '_finish',\n '_setupUI'\n ], this);\n }\n\n onAdd(map) {\n this._map = map;\n this._container = DOM.create('div', `${className} ${className}-group`);\n checkGeolocationSupport(this._setupUI);\n return this._container;\n }\n\n onRemove() {\n this._container.parentNode.removeChild(this._container);\n this._map = undefined;\n }\n\n _onSuccess(position) {\n this._map.jumpTo({\n center: [position.coords.longitude, position.coords.latitude],\n zoom: 17,\n bearing: 0,\n pitch: 0\n });\n\n this.fire('geolocate', position);\n this._finish();\n }\n\n _onError(error) {\n this.fire('error', error);\n this._finish();\n }\n\n _finish() {\n if (this._timeoutId) { clearTimeout(this._timeoutId); }\n this._timeoutId = undefined;\n }\n\n _setupUI(supported) {\n if (supported === false) return;\n this._container.addEventListener('contextmenu',\n e => e.preventDefault());\n this._geolocateButton = DOM.create('button',\n `${className}-icon ${className}-geolocate`,\n this._container);\n this._geolocateButton.type = 'button';\n this._geolocateButton.setAttribute('aria-label', 'Geolocate');\n if (this.options.watchPosition) this._geolocateButton.setAttribute('aria-pressed', false);\n this._geolocateButton.addEventListener('click',\n this._onClickGeolocate.bind(this));\n }\n\n _onClickGeolocate() {\n const positionOptions = util.extend(defaultGeoPositionOptions, this.options && this.options.positionOptions || {});\n\n // toggle watching the device location\n if (this.options.watchPosition) {\n if (this._geolocationWatchID !== undefined) {\n // clear watchPosition\n this._geolocateButton.classList.remove('watching');\n this._geolocateButton.setAttribute('aria-pressed', false);\n window.navigator.geolocation.clearWatch(this._geolocationWatchID);\n this._geolocationWatchID = undefined;\n } else {\n // enable watchPosition\n this._geolocateButton.classList.add('watching');\n this._geolocateButton.setAttribute('aria-pressed', true);\n this._geolocationWatchID = window.navigator.geolocation.watchPosition(\n this._onSuccess, this._onError, positionOptions);\n }\n } else {\n window.navigator.geolocation.getCurrentPosition(\n this._onSuccess, this._onError, positionOptions);\n\n // This timeout ensures that we still call finish() even if\n // the user declines to share their location in Firefox\n this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */);\n }\n }\n}\n\nmodule.exports = GeolocateControl;\n\n/**\n * geolocate event.\n *\n * @event geolocate\n * @memberof GeolocateControl\n * @instance\n * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition).\n *\n */\n\n/**\n * error event.\n *\n * @event error\n * @memberof GeolocateControl\n * @instance\n * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition).\n *\n */\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\n\n/**\n * A `LogoControl` is a control that adds the Mapbox watermark\n * to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox\n * vector tiles and core styles.\n *\n * @implements {IControl}\n * @private\n**/\n\nclass LogoControl {\n\n constructor() {\n util.bindAll(['_updateLogo'], this);\n }\n\n onAdd(map) {\n this._map = map;\n this._container = DOM.create('div', 'mapboxgl-ctrl');\n\n this._map.on('sourcedata', this._updateLogo);\n this._updateLogo();\n return this._container;\n }\n\n onRemove() {\n this._container.parentNode.removeChild(this._container);\n this._map.off('sourcedata', this._updateLogo);\n }\n\n getDefaultPosition() {\n return 'bottom-left';\n }\n\n _updateLogo(e) {\n if (e && e.sourceDataType === 'metadata') {\n if (!this._container.childNodes.length && this._logoRequired()) {\n const anchor = DOM.create('a', 'mapboxgl-ctrl-logo');\n anchor.target = \"_blank\";\n anchor.href = \"https://www.mapbox.com/\";\n anchor.setAttribute(\"aria-label\", \"Mapbox logo\");\n this._container.appendChild(anchor);\n this._map.off('data', this._updateLogo);\n } else if (this._container.childNodes.length && !this._logoRequired()) {\n this.onRemove();\n }\n }\n }\n\n _logoRequired() {\n if (!this._map.style) return;\n\n const sourceCaches = this._map.style.sourceCaches;\n for (const id in sourceCaches) {\n const source = sourceCaches[id].getSource();\n if (source.mapbox_logo) {\n return true;\n }\n }\n\n return false;\n }\n\n}\n\n\nmodule.exports = LogoControl;\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst window = require('../../util/window');\nconst util = require('../../util/util');\n\nconst className = 'mapboxgl-ctrl';\n\n/**\n * A `NavigationControl` control contains zoom buttons and a compass.\n *\n * @implements {IControl}\n * @example\n * var nav = new mapboxgl.NavigationControl();\n * map.addControl(nav, 'top-left');\n * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/)\n * @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/)\n */\nclass NavigationControl {\n\n constructor() {\n util.bindAll([\n '_rotateCompassArrow'\n ], this);\n }\n\n _rotateCompassArrow() {\n const rotate = `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;\n this._compassArrow.style.transform = rotate;\n }\n\n onAdd(map) {\n this._map = map;\n this._container = DOM.create('div', `${className} ${className}-group`, map.getContainer());\n this._container.addEventListener('contextmenu', this._onContextMenu.bind(this));\n\n this._zoomInButton = this._createButton(`${className}-icon ${className}-zoom-in`, 'Zoom In', map.zoomIn.bind(map));\n this._zoomOutButton = this._createButton(`${className}-icon ${className}-zoom-out`, 'Zoom Out', map.zoomOut.bind(map));\n this._compass = this._createButton(`${className}-icon ${className}-compass`, 'Reset North', map.resetNorth.bind(map));\n\n this._compassArrow = DOM.create('span', `${className}-compass-arrow`, this._compass);\n\n this._compass.addEventListener('mousedown', this._onCompassDown.bind(this));\n this._onCompassMove = this._onCompassMove.bind(this);\n this._onCompassUp = this._onCompassUp.bind(this);\n\n this._map.on('rotate', this._rotateCompassArrow);\n this._rotateCompassArrow();\n\n return this._container;\n }\n\n onRemove() {\n this._container.parentNode.removeChild(this._container);\n this._map.off('rotate', this._rotateCompassArrow);\n this._map = undefined;\n }\n\n _onContextMenu(e) {\n e.preventDefault();\n }\n\n _onCompassDown(e) {\n if (e.button !== 0) return;\n\n DOM.disableDrag();\n window.document.addEventListener('mousemove', this._onCompassMove);\n window.document.addEventListener('mouseup', this._onCompassUp);\n\n this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(e));\n e.stopPropagation();\n }\n\n _onCompassMove(e) {\n if (e.button !== 0) return;\n\n this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(e));\n e.stopPropagation();\n }\n\n _onCompassUp(e) {\n if (e.button !== 0) return;\n\n window.document.removeEventListener('mousemove', this._onCompassMove);\n window.document.removeEventListener('mouseup', this._onCompassUp);\n DOM.enableDrag();\n\n this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(e));\n e.stopPropagation();\n }\n\n _createButton(className, ariaLabel, fn) {\n const a = DOM.create('button', className, this._container);\n a.type = 'button';\n a.setAttribute('aria-label', ariaLabel);\n a.addEventListener('click', () => { fn(); });\n return a;\n }\n\n}\n\nmodule.exports = NavigationControl;\n\nfunction copyMouseEvent(e) {\n return new window.MouseEvent(e.type, {\n button: 2, // right click\n buttons: 2, // right click\n bubbles: true,\n cancelable: true,\n detail: e.detail,\n view: e.view,\n screenX: e.screenX,\n screenY: e.screenY,\n clientX: e.clientX,\n clientY: e.clientY,\n movementX: e.movementX,\n movementY: e.movementY,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n metaKey: e.metaKey\n });\n}\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\n\n/**\n * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground.\n *\n * @implements {IControl}\n * @param {Object} [options]\n * @param {number} [options.maxWidth='150'] The maximum length of the scale control in pixels.\n * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'` or `'metric'`).\n * @example\n * map.addControl(new mapboxgl.ScaleControl({\n * maxWidth: 80,\n * unit: 'imperial'\n * }));\n */\nclass ScaleControl {\n\n constructor(options) {\n this.options = options;\n\n util.bindAll([\n '_onMove'\n ], this);\n }\n\n getDefaultPosition() {\n return 'bottom-left';\n }\n\n _onMove() {\n updateScale(this._map, this._container, this.options);\n }\n\n onAdd(map) {\n this._map = map;\n this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer());\n\n this._map.on('move', this._onMove);\n this._onMove();\n\n return this._container;\n }\n\n onRemove() {\n this._container.parentNode.removeChild(this._container);\n this._map.off('move', this._onMove);\n this._map = undefined;\n }\n}\n\nmodule.exports = ScaleControl;\n\nfunction updateScale(map, container, options) {\n // A horizontal scale is imagined to be present at center of the map\n // container with maximum length (Default) as 100px.\n // Using spherical law of cosines approximation, the real distance is\n // found between the two coordinates.\n const maxWidth = options && options.maxWidth || 100;\n\n const y = map._container.clientHeight / 2;\n const maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y]));\n // The real distance corresponding to 100px scale length is rounded off to\n // near pretty number and the scale length for the same is found out.\n // Default unit of the scale is based on User's locale.\n if (options && options.unit === 'imperial') {\n const maxFeet = 3.2808 * maxMeters;\n if (maxFeet > 5280) {\n const maxMiles = maxFeet / 5280;\n setScale(container, maxWidth, maxMiles, 'mi');\n } else {\n setScale(container, maxWidth, maxFeet, 'ft');\n }\n } else {\n setScale(container, maxWidth, maxMeters, 'm');\n }\n}\n\nfunction setScale(container, maxWidth, maxDistance, unit) {\n let distance = getRoundNum(maxDistance);\n const ratio = distance / maxDistance;\n\n if (unit === 'm' && distance >= 1000) {\n distance = distance / 1000;\n unit = 'km';\n }\n\n container.style.width = `${maxWidth * ratio}px`;\n container.innerHTML = distance + unit;\n}\n\nfunction getDistance(latlng1, latlng2) {\n // Uses spherical law of cosines approximation.\n const R = 6371000;\n\n const rad = Math.PI / 180,\n lat1 = latlng1.lat * rad,\n lat2 = latlng2.lat * rad,\n a = Math.sin(lat1) * Math.sin(lat2) +\n Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad);\n\n const maxMeters = R * Math.acos(Math.min(a, 1));\n return maxMeters;\n\n}\n\nfunction getRoundNum(num) {\n const pow10 = Math.pow(10, (`${Math.floor(num)}`).length - 1);\n let d = num / pow10;\n\n d = d >= 10 ? 10 :\n d >= 5 ? 5 :\n d >= 3 ? 3 :\n d >= 2 ? 2 : 1;\n\n return pow10 * d;\n}\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst LngLatBounds = require('../../geo/lng_lat_bounds');\nconst util = require('../../util/util');\nconst window = require('../../util/window');\n\n/**\n * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box.\n * The bounding box is defined by clicking and holding `shift` while dragging the cursor.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nclass BoxZoomHandler {\n\n constructor(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n this._container = map.getContainer();\n\n util.bindAll([\n '_onMouseDown',\n '_onMouseMove',\n '_onMouseUp',\n '_onKeyDown'\n ], this);\n }\n\n /**\n * Returns a Boolean indicating whether the \"box zoom\" interaction is enabled.\n *\n * @returns {boolean} `true` if the \"box zoom\" interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Returns a Boolean indicating whether the \"box zoom\" interaction is active, i.e. currently being used.\n *\n * @returns {boolean} `true` if the \"box zoom\" interaction is active.\n */\n isActive() {\n return !!this._active;\n }\n\n /**\n * Enables the \"box zoom\" interaction.\n *\n * @example\n * map.boxZoom.enable();\n */\n enable() {\n if (this.isEnabled()) return;\n this._el.addEventListener('mousedown', this._onMouseDown, false);\n this._enabled = true;\n }\n\n /**\n * Disables the \"box zoom\" interaction.\n *\n * @example\n * map.boxZoom.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._el.removeEventListener('mousedown', this._onMouseDown);\n this._enabled = false;\n }\n\n _onMouseDown(e) {\n if (!(e.shiftKey && e.button === 0)) return;\n\n window.document.addEventListener('mousemove', this._onMouseMove, false);\n window.document.addEventListener('keydown', this._onKeyDown, false);\n window.document.addEventListener('mouseup', this._onMouseUp, false);\n\n DOM.disableDrag();\n this._startPos = DOM.mousePos(this._el, e);\n this._active = true;\n }\n\n _onMouseMove(e) {\n const p0 = this._startPos,\n p1 = DOM.mousePos(this._el, e);\n\n if (!this._box) {\n this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n this._container.classList.add('mapboxgl-crosshair');\n this._fireEvent('boxzoomstart', e);\n }\n\n const minX = Math.min(p0.x, p1.x),\n maxX = Math.max(p0.x, p1.x),\n minY = Math.min(p0.y, p1.y),\n maxY = Math.max(p0.y, p1.y);\n\n DOM.setTransform(this._box, `translate(${minX}px,${minY}px)`);\n\n this._box.style.width = `${maxX - minX}px`;\n this._box.style.height = `${maxY - minY}px`;\n }\n\n _onMouseUp(e) {\n if (e.button !== 0) return;\n\n const p0 = this._startPos,\n p1 = DOM.mousePos(this._el, e),\n bounds = new LngLatBounds()\n .extend(this._map.unproject(p0))\n .extend(this._map.unproject(p1));\n\n this._finish();\n\n if (p0.x === p1.x && p0.y === p1.y) {\n this._fireEvent('boxzoomcancel', e);\n } else {\n this._map\n .fitBounds(bounds, {linear: true})\n .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds });\n }\n }\n\n _onKeyDown(e) {\n if (e.keyCode === 27) {\n this._finish();\n this._fireEvent('boxzoomcancel', e);\n }\n }\n\n _finish() {\n this._active = false;\n\n window.document.removeEventListener('mousemove', this._onMouseMove, false);\n window.document.removeEventListener('keydown', this._onKeyDown, false);\n window.document.removeEventListener('mouseup', this._onMouseUp, false);\n\n this._container.classList.remove('mapboxgl-crosshair');\n\n if (this._box) {\n this._box.parentNode.removeChild(this._box);\n this._box = null;\n }\n\n DOM.enableDrag();\n }\n\n _fireEvent(type, e) {\n return this._map.fire(type, { originalEvent: e });\n }\n}\n\nmodule.exports = BoxZoomHandler;\n\n/**\n * @typedef {Object} MapBoxZoomEvent\n * @property {MouseEvent} originalEvent\n * @property {LngLatBounds} boxZoomBounds The bounding box of the \"box zoom\" interaction.\n * This property is only provided for `boxzoomend` events.\n */\n\n/**\n * Fired when a \"box zoom\" interaction starts. See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomstart\n * @memberof Map\n * @instance\n * @property {MapBoxZoomEvent} data\n */\n\n/**\n * Fired when a \"box zoom\" interaction ends. See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomend\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {MapBoxZoomEvent} data\n */\n\n/**\n * Fired when the user cancels a \"box zoom\" interaction, or when the bounding box does not meet the minimum size threshold.\n * See [`BoxZoomHandler`](#BoxZoomHandler).\n *\n * @event boxzoomcancel\n * @memberof Map\n * @instance\n * @property {MapBoxZoomEvent} data\n */\n","'use strict';\n\n/**\n * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by\n * double clicking.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nclass DoubleClickZoomHandler {\n constructor(map) {\n this._map = map;\n this._onDblClick = this._onDblClick.bind(this);\n }\n\n /**\n * Returns a Boolean indicating whether the \"double click to zoom\" interaction is enabled.\n *\n * @returns {boolean} `true` if the \"double click to zoom\" interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Enables the \"double click to zoom\" interaction.\n *\n * @example\n * map.doubleClickZoom.enable();\n */\n enable() {\n if (this.isEnabled()) return;\n this._map.on('dblclick', this._onDblClick);\n this._enabled = true;\n }\n\n /**\n * Disables the \"double click to zoom\" interaction.\n *\n * @example\n * map.doubleClickZoom.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._map.off('dblclick', this._onDblClick);\n this._enabled = false;\n }\n\n _onDblClick(e) {\n this._map.zoomTo(\n this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1),\n {around: e.lngLat},\n e\n );\n }\n}\n\nmodule.exports = DoubleClickZoomHandler;\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\nconst window = require('../../util/window');\n\nconst inertiaLinearity = 0.3,\n inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n inertiaMaxSpeed = 1400, // px/s\n inertiaDeceleration = 2500; // px/s^2\n\n/**\n * The `DragPanHandler` allows the user to pan the map by clicking and dragging\n * the cursor.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nclass DragPanHandler {\n constructor(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindAll([\n '_onDown',\n '_onMove',\n '_onUp',\n '_onTouchEnd',\n '_onMouseUp'\n ], this);\n }\n\n /**\n * Returns a Boolean indicating whether the \"drag to pan\" interaction is enabled.\n *\n * @returns {boolean} `true` if the \"drag to pan\" interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Returns a Boolean indicating whether the \"drag to pan\" interaction is active, i.e. currently being used.\n *\n * @returns {boolean} `true` if the \"drag to pan\" interaction is active.\n */\n isActive() {\n return !!this._active;\n }\n\n /**\n * Enables the \"drag to pan\" interaction.\n *\n * @example\n * map.dragPan.enable();\n */\n enable() {\n if (this.isEnabled()) return;\n this._el.addEventListener('mousedown', this._onDown);\n this._el.addEventListener('touchstart', this._onDown);\n this._enabled = true;\n }\n\n /**\n * Disables the \"drag to pan\" interaction.\n *\n * @example\n * map.dragPan.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._el.removeEventListener('mousedown', this._onDown);\n this._el.removeEventListener('touchstart', this._onDown);\n this._enabled = false;\n }\n\n _onDown(e) {\n if (this._ignoreEvent(e)) return;\n if (this.isActive()) return;\n\n if (e.touches) {\n window.document.addEventListener('touchmove', this._onMove);\n window.document.addEventListener('touchend', this._onTouchEnd);\n } else {\n window.document.addEventListener('mousemove', this._onMove);\n window.document.addEventListener('mouseup', this._onMouseUp);\n }\n /* Deactivate DragPan when the window looses focus. Otherwise if a mouseup occurs when the window isn't in focus, DragPan will still be active even though the mouse is no longer pressed. */\n window.addEventListener('blur', this._onMouseUp);\n\n this._active = false;\n this._startPos = this._pos = DOM.mousePos(this._el, e);\n this._inertia = [[Date.now(), this._pos]];\n }\n\n _onMove(e) {\n if (this._ignoreEvent(e)) return;\n\n if (!this.isActive()) {\n this._active = true;\n this._map.moving = true;\n this._fireEvent('dragstart', e);\n this._fireEvent('movestart', e);\n }\n\n const pos = DOM.mousePos(this._el, e),\n map = this._map;\n\n map.stop();\n this._drainInertiaBuffer();\n this._inertia.push([Date.now(), pos]);\n\n map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos);\n\n this._fireEvent('drag', e);\n this._fireEvent('move', e);\n\n this._pos = pos;\n\n e.preventDefault();\n }\n\n _onUp(e) {\n if (!this.isActive()) return;\n\n this._active = false;\n this._fireEvent('dragend', e);\n this._drainInertiaBuffer();\n\n const finish = () => {\n this._map.moving = false;\n this._fireEvent('moveend', e);\n };\n\n const inertia = this._inertia;\n if (inertia.length < 2) {\n finish();\n return;\n }\n\n const last = inertia[inertia.length - 1],\n first = inertia[0],\n flingOffset = last[1].sub(first[1]),\n flingDuration = (last[0] - first[0]) / 1000;\n\n if (flingDuration === 0 || last[1].equals(first[1])) {\n finish();\n return;\n }\n\n // calculate px/s velocity & adjust for increased initial animation speed when easing out\n const velocity = flingOffset.mult(inertiaLinearity / flingDuration);\n let speed = velocity.mag(); // px/s\n\n if (speed > inertiaMaxSpeed) {\n speed = inertiaMaxSpeed;\n velocity._unit()._mult(speed);\n }\n\n const duration = speed / (inertiaDeceleration * inertiaLinearity),\n offset = velocity.mult(-duration / 2);\n\n this._map.panBy(offset, {\n duration: duration * 1000,\n easing: inertiaEasing,\n noMoveStart: true\n }, { originalEvent: e });\n }\n\n _onMouseUp(e) {\n if (this._ignoreEvent(e)) return;\n this._onUp(e);\n window.document.removeEventListener('mousemove', this._onMove);\n window.document.removeEventListener('mouseup', this._onMouseUp);\n window.removeEventListener('blur', this._onMouseUp);\n }\n\n _onTouchEnd(e) {\n if (this._ignoreEvent(e)) return;\n this._onUp(e);\n window.document.removeEventListener('touchmove', this._onMove);\n window.document.removeEventListener('touchend', this._onTouchEnd);\n }\n\n _fireEvent(type, e) {\n return this._map.fire(type, { originalEvent: e });\n }\n\n _ignoreEvent(e) {\n const map = this._map;\n\n if (map.boxZoom && map.boxZoom.isActive()) return true;\n if (map.dragRotate && map.dragRotate.isActive()) return true;\n if (e.touches) {\n return (e.touches.length > 1);\n } else {\n if (e.ctrlKey) return true;\n const buttons = 1, // left button\n button = 0; // left button\n return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button && e.button !== button);\n }\n }\n\n _drainInertiaBuffer() {\n const inertia = this._inertia,\n now = Date.now(),\n cutoff = 160; // msec\n\n while (inertia.length > 0 && now - inertia[0][0] > cutoff) inertia.shift();\n }\n}\n\nmodule.exports = DragPanHandler;\n\n/**\n * Fired when a \"drag to pan\" interaction starts. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event dragstart\n * @memberof Map\n * @instance\n * @property {{originalEvent: DragEvent}} data\n */\n\n/**\n * Fired repeatedly during a \"drag to pan\" interaction. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event drag\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired when a \"drag to pan\" interaction ends. See [`DragPanHandler`](#DragPanHandler).\n *\n * @event dragend\n * @memberof Map\n * @instance\n * @property {{originalEvent: DragEvent}} data\n */\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\nconst window = require('../../util/window');\n\nconst inertiaLinearity = 0.25,\n inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n inertiaMaxSpeed = 180, // deg/s\n inertiaDeceleration = 720; // deg/s^2\n\n/**\n * The `DragRotateHandler` allows the user to rotate the map by clicking and\n * dragging the cursor while holding the right mouse button or `ctrl` key.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n * @param {Object} [options]\n * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's\n * bearing (rotation) will snap to north.\n * @param {bool} [options.pitchWithRotate=true] Control the map pitch in addition to the bearing\n */\nclass DragRotateHandler {\n constructor(map, options) {\n this._map = map;\n this._el = map.getCanvasContainer();\n this._bearingSnap = options.bearingSnap;\n this._pitchWithRotate = options.pitchWithRotate !== false;\n\n util.bindAll([\n '_onDown',\n '_onMove',\n '_onUp'\n ], this);\n\n }\n\n /**\n * Returns a Boolean indicating whether the \"drag to rotate\" interaction is enabled.\n *\n * @returns {boolean} `true` if the \"drag to rotate\" interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Returns a Boolean indicating whether the \"drag to rotate\" interaction is active, i.e. currently being used.\n *\n * @returns {boolean} `true` if the \"drag to rotate\" interaction is active.\n */\n isActive() {\n return !!this._active;\n }\n\n /**\n * Enables the \"drag to rotate\" interaction.\n *\n * @example\n * map.dragRotate.enable();\n */\n enable() {\n if (this.isEnabled()) return;\n this._el.addEventListener('mousedown', this._onDown);\n this._enabled = true;\n }\n\n /**\n * Disables the \"drag to rotate\" interaction.\n *\n * @example\n * map.dragRotate.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._el.removeEventListener('mousedown', this._onDown);\n this._enabled = false;\n }\n\n _onDown(e) {\n if (this._ignoreEvent(e)) return;\n if (this.isActive()) return;\n\n window.document.addEventListener('mousemove', this._onMove);\n window.document.addEventListener('mouseup', this._onUp);\n /* Deactivate DragRotate when the window looses focus. Otherwise if a mouseup occurs when the window isn't in focus, DragRotate will still be active even though the mouse is no longer pressed. */\n window.addEventListener('blur', this._onUp);\n\n this._active = false;\n this._inertia = [[Date.now(), this._map.getBearing()]];\n this._startPos = this._pos = DOM.mousePos(this._el, e);\n this._center = this._map.transform.centerPoint; // Center of rotation\n\n e.preventDefault();\n }\n\n _onMove(e) {\n if (this._ignoreEvent(e)) return;\n\n if (!this.isActive()) {\n this._active = true;\n this._map.moving = true;\n this._fireEvent('rotatestart', e);\n this._fireEvent('movestart', e);\n }\n\n const map = this._map;\n map.stop();\n\n const p1 = this._pos,\n p2 = DOM.mousePos(this._el, e),\n bearingDiff = (p1.x - p2.x) * 0.8,\n pitchDiff = (p1.y - p2.y) * -0.5,\n bearing = map.getBearing() - bearingDiff,\n pitch = map.getPitch() - pitchDiff,\n inertia = this._inertia,\n last = inertia[inertia.length - 1];\n\n this._drainInertiaBuffer();\n inertia.push([Date.now(), map._normalizeBearing(bearing, last[1])]);\n\n map.transform.bearing = bearing;\n if (this._pitchWithRotate) map.transform.pitch = pitch;\n\n this._fireEvent('rotate', e);\n this._fireEvent('move', e);\n\n this._pos = p2;\n }\n\n _onUp(e) {\n if (this._ignoreEvent(e)) return;\n window.document.removeEventListener('mousemove', this._onMove);\n window.document.removeEventListener('mouseup', this._onUp);\n window.removeEventListener('blur', this._onUp);\n\n if (!this.isActive()) return;\n\n this._active = false;\n this._fireEvent('rotateend', e);\n this._drainInertiaBuffer();\n\n const map = this._map,\n mapBearing = map.getBearing(),\n inertia = this._inertia;\n\n const finish = () => {\n if (Math.abs(mapBearing) < this._bearingSnap) {\n map.resetNorth({noMoveStart: true}, { originalEvent: e });\n } else {\n this._map.moving = false;\n this._fireEvent('moveend', e);\n }\n };\n\n if (inertia.length < 2) {\n finish();\n return;\n }\n\n const first = inertia[0],\n last = inertia[inertia.length - 1],\n previous = inertia[inertia.length - 2];\n let bearing = map._normalizeBearing(mapBearing, previous[1]);\n const flingDiff = last[1] - first[1],\n sign = flingDiff < 0 ? -1 : 1,\n flingDuration = (last[0] - first[0]) / 1000;\n\n if (flingDiff === 0 || flingDuration === 0) {\n finish();\n return;\n }\n\n let speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration)); // deg/s\n if (speed > inertiaMaxSpeed) {\n speed = inertiaMaxSpeed;\n }\n\n const duration = speed / (inertiaDeceleration * inertiaLinearity),\n offset = sign * speed * (duration / 2);\n\n bearing += offset;\n\n if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) {\n bearing = map._normalizeBearing(0, bearing);\n }\n\n map.rotateTo(bearing, {\n duration: duration * 1000,\n easing: inertiaEasing,\n noMoveStart: true\n }, { originalEvent: e });\n }\n\n _fireEvent(type, e) {\n return this._map.fire(type, { originalEvent: e });\n }\n\n _ignoreEvent(e) {\n const map = this._map;\n\n if (map.boxZoom && map.boxZoom.isActive()) return true;\n if (map.dragPan && map.dragPan.isActive()) return true;\n if (e.touches) {\n return (e.touches.length > 1);\n } else {\n const buttons = (e.ctrlKey ? 1 : 2), // ? ctrl+left button : right button\n button = (e.ctrlKey ? 0 : 2); // ? ctrl+left button : right button\n let eventButton = e.button;\n if (typeof InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey &&\n window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) {\n // Fix for https://github.com/mapbox/mapbox-gl-js/issues/3131:\n // Firefox (detected by InstallTrigger) on Mac determines e.button = 2 when\n // using Control + left click\n eventButton = 0;\n }\n return (e.type === 'mousemove' ? e.buttons & buttons === 0 : !this.isActive() && eventButton !== button);\n }\n }\n\n _drainInertiaBuffer() {\n const inertia = this._inertia,\n now = Date.now(),\n cutoff = 160; //msec\n\n while (inertia.length > 0 && now - inertia[0][0] > cutoff)\n inertia.shift();\n }\n}\n\nmodule.exports = DragRotateHandler;\n\n/**\n * Fired when a \"drag to rotate\" interaction starts. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotatestart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during a \"drag to rotate\" interaction. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotate\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired when a \"drag to rotate\" interaction ends. See [`DragRotateHandler`](#DragRotateHandler).\n *\n * @event rotateend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n","'use strict';\n\nconst panStep = 100,\n bearingStep = 15,\n pitchStep = 10;\n\n/**\n * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using\n * the following keyboard shortcuts:\n *\n * - `=` / `+`: Increase the zoom level by 1.\n * - `Shift-=` / `Shift-+`: Increase the zoom level by 2.\n * - `-`: Decrease the zoom level by 1.\n * - `Shift--`: Decrease the zoom level by 2.\n * - Arrow keys: Pan by 100 pixels.\n * - `Shift+⇢`: Increase the rotation by 15 degrees.\n * - `Shift+⇠`: Decrease the rotation by 15 degrees.\n * - `Shift+⇡`: Increase the pitch by 10 degrees.\n * - `Shift+⇣`: Decrease the pitch by 10 degrees.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nclass KeyboardHandler {\n constructor(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n this._onKeyDown = this._onKeyDown.bind(this);\n }\n\n /**\n * Returns a Boolean indicating whether keyboard interaction is enabled.\n *\n * @returns {boolean} `true` if keyboard interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Enables keyboard interaction.\n *\n * @example\n * map.keyboard.enable();\n */\n enable() {\n if (this.isEnabled()) return;\n this._el.addEventListener('keydown', this._onKeyDown, false);\n this._enabled = true;\n }\n\n /**\n * Disables keyboard interaction.\n *\n * @example\n * map.keyboard.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._el.removeEventListener('keydown', this._onKeyDown);\n this._enabled = false;\n }\n\n _onKeyDown(e) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n let zoomDir = 0;\n let bearingDir = 0;\n let pitchDir = 0;\n let xDir = 0;\n let yDir = 0;\n\n switch (e.keyCode) {\n case 61:\n case 107:\n case 171:\n case 187:\n zoomDir = 1;\n break;\n\n case 189:\n case 109:\n case 173:\n zoomDir = -1;\n break;\n\n case 37:\n if (e.shiftKey) {\n bearingDir = -1;\n } else {\n e.preventDefault();\n xDir = -1;\n }\n break;\n\n case 39:\n if (e.shiftKey) {\n bearingDir = 1;\n } else {\n e.preventDefault();\n xDir = 1;\n }\n break;\n\n case 38:\n if (e.shiftKey) {\n pitchDir = 1;\n } else {\n e.preventDefault();\n yDir = -1;\n }\n break;\n\n case 40:\n if (e.shiftKey) {\n pitchDir = -1;\n } else {\n yDir = 1;\n e.preventDefault();\n }\n break;\n }\n\n const map = this._map;\n const zoom = map.getZoom();\n\n const easeOptions = {\n duration: 300,\n delayEndEvents: 500,\n easing: easeOut,\n\n zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom,\n bearing: map.getBearing() + bearingDir * bearingStep,\n pitch: map.getPitch() + pitchDir * pitchStep,\n offset: [-xDir * panStep, -yDir * panStep],\n center: map.getCenter()\n };\n\n map.easeTo(easeOptions, {originalEvent: e});\n }\n}\n\nfunction easeOut(t) {\n return t * (2 - t);\n}\n\nmodule.exports = KeyboardHandler;\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\nconst browser = require('../../util/browser');\nconst window = require('../../util/window');\n\nconst ua = window.navigator.userAgent.toLowerCase(),\n firefox = ua.indexOf('firefox') !== -1,\n safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1;\n\n/**\n * The `ScrollZoomHandler` allows the user to zoom the map by scrolling.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nclass ScrollZoomHandler {\n constructor(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindAll([\n '_onWheel',\n '_onTimeout'\n ], this);\n }\n\n /**\n * Returns a Boolean indicating whether the \"scroll to zoom\" interaction is enabled.\n *\n * @returns {boolean} `true` if the \"scroll to zoom\" interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Enables the \"scroll to zoom\" interaction.\n *\n * @param {Object} [options]\n * @param {string} [options.around] If \"center\" is passed, map will zoom around center of map\n *\n * @example\n * map.scrollZoom.enable();\n * @example\n * map.scrollZoom.enable({ around: 'center' })\n */\n enable(options) {\n if (this.isEnabled()) return;\n this._el.addEventListener('wheel', this._onWheel, false);\n this._el.addEventListener('mousewheel', this._onWheel, false);\n this._enabled = true;\n this._aroundCenter = options && options.around === 'center';\n }\n\n /**\n * Disables the \"scroll to zoom\" interaction.\n *\n * @example\n * map.scrollZoom.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._el.removeEventListener('wheel', this._onWheel);\n this._el.removeEventListener('mousewheel', this._onWheel);\n this._enabled = false;\n }\n\n _onWheel(e) {\n let value;\n\n if (e.type === 'wheel') {\n value = e.deltaY;\n // Firefox doubles the values on retina screens...\n if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio;\n if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40;\n\n } else if (e.type === 'mousewheel') {\n value = -e.wheelDeltaY;\n if (safari) value = value / 3;\n }\n\n const now = browser.now(),\n timeDelta = now - (this._time || 0);\n\n this._pos = DOM.mousePos(this._el, e);\n this._time = now;\n\n if (value !== 0 && (value % 4.000244140625) === 0) {\n // This one is definitely a mouse wheel event.\n this._type = 'wheel';\n\n } else if (value !== 0 && Math.abs(value) < 4) {\n // This one is definitely a trackpad event because it is so small.\n this._type = 'trackpad';\n\n } else if (timeDelta > 400) {\n // This is likely a new scroll action.\n this._type = null;\n this._lastValue = value;\n\n // Start a timeout in case this was a singular event, and dely it by up to 40ms.\n this._timeout = setTimeout(this._onTimeout, 40);\n\n } else if (!this._type) {\n // This is a repeating event, but we don't know the type of event just yet.\n // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n // Make sure our delayed event isn't fired again, because we accumulate\n // the previous event (which was less than 40ms ago) into this event.\n if (this._timeout) {\n clearTimeout(this._timeout);\n this._timeout = null;\n value += this._lastValue;\n }\n }\n\n // Slow down zoom if shift key is held for more precise zooming\n if (e.shiftKey && value) value = value / 4;\n\n // Only fire the callback if we actually know what type of scrolling device the user uses.\n if (this._type) this._zoom(-value, e);\n\n e.preventDefault();\n }\n\n _onTimeout() {\n this._type = 'wheel';\n this._zoom(-this._lastValue);\n }\n\n _zoom(delta, e) {\n if (delta === 0) return;\n const map = this._map;\n\n // Scale by sigmoid of scroll wheel delta.\n let scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n if (delta < 0 && scale !== 0) scale = 1 / scale;\n\n const fromScale = map.ease ? map.ease.to : map.transform.scale,\n targetZoom = map.transform.scaleZoom(fromScale * scale);\n\n map.zoomTo(targetZoom, {\n duration: this._type === 'wheel' ? 200 : 0,\n around: this._aroundCenter ? map.getCenter() : map.unproject(this._pos),\n delayEndEvents: 200,\n smoothEasing: true\n }, { originalEvent: e });\n }\n}\n\nmodule.exports = ScrollZoomHandler;\n\n/**\n * Fired just before the map begins a transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoomstart\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired repeatedly during an animated transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoom\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n * @see [Update a choropleth layer by zoom level](https://www.mapbox.com/mapbox-gl-js/example/updating-choropleth/)\n */\n\n/**\n * Fired just after the map completes a transition from one zoom level to another,\n * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event zoomend\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n","'use strict';\n\nconst DOM = require('../../util/dom');\nconst util = require('../../util/util');\nconst window = require('../../util/window');\n\nconst inertiaLinearity = 0.15,\n inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n inertiaDeceleration = 12, // scale / s^2\n inertiaMaxSpeed = 2.5, // scale / s\n significantScaleThreshold = 0.15,\n significantRotateThreshold = 4;\n\n/**\n * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by\n * pinching on a touchscreen.\n *\n * @param {Map} map The Mapbox GL JS map to add the handler to.\n */\nclass TouchZoomRotateHandler {\n constructor(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindAll([\n '_onStart',\n '_onMove',\n '_onEnd'\n ], this);\n }\n\n /**\n * Returns a Boolean indicating whether the \"pinch to rotate and zoom\" interaction is enabled.\n *\n * @returns {boolean} `true` if the \"pinch to rotate and zoom\" interaction is enabled.\n */\n isEnabled() {\n return !!this._enabled;\n }\n\n /**\n * Enables the \"pinch to rotate and zoom\" interaction.\n *\n * @param {Object} [options]\n * @param {string} [options.around] If \"center\" is passed, map will zoom around the center\n *\n * @example\n * map.touchZoomRotate.enable();\n * @example\n * map.touchZoomRotate.enable({ around: 'center' });\n */\n enable(options) {\n if (this.isEnabled()) return;\n this._el.addEventListener('touchstart', this._onStart, false);\n this._enabled = true;\n this._aroundCenter = options && options.around === 'center';\n }\n\n /**\n * Disables the \"pinch to rotate and zoom\" interaction.\n *\n * @example\n * map.touchZoomRotate.disable();\n */\n disable() {\n if (!this.isEnabled()) return;\n this._el.removeEventListener('touchstart', this._onStart);\n this._enabled = false;\n }\n\n /**\n * Disables the \"pinch to rotate\" interaction, leaving the \"pinch to zoom\"\n * interaction enabled.\n *\n * @example\n * map.touchZoomRotate.disableRotation();\n */\n disableRotation() {\n this._rotationDisabled = true;\n }\n\n /**\n * Enables the \"pinch to rotate\" interaction.\n *\n * @example\n * map.touchZoomRotate.enable();\n * map.touchZoomRotate.enableRotation();\n */\n enableRotation() {\n this._rotationDisabled = false;\n }\n\n _onStart(e) {\n if (e.touches.length !== 2) return;\n\n const p0 = DOM.mousePos(this._el, e.touches[0]),\n p1 = DOM.mousePos(this._el, e.touches[1]);\n\n this._startVec = p0.sub(p1);\n this._startScale = this._map.transform.scale;\n this._startBearing = this._map.transform.bearing;\n this._gestureIntent = undefined;\n this._inertia = [];\n\n window.document.addEventListener('touchmove', this._onMove, false);\n window.document.addEventListener('touchend', this._onEnd, false);\n }\n\n _onMove(e) {\n if (e.touches.length !== 2) return;\n\n const p0 = DOM.mousePos(this._el, e.touches[0]),\n p1 = DOM.mousePos(this._el, e.touches[1]),\n p = p0.add(p1).div(2),\n vec = p0.sub(p1),\n scale = vec.mag() / this._startVec.mag(),\n bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI,\n map = this._map;\n\n // Determine 'intent' by whichever threshold is surpassed first,\n // then keep that state for the duration of this gesture.\n if (!this._gestureIntent) {\n const scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold),\n rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold);\n\n if (rotatingSignificantly) {\n this._gestureIntent = 'rotate';\n } else if (scalingSignificantly) {\n this._gestureIntent = 'zoom';\n }\n\n if (this._gestureIntent) {\n this._startVec = vec;\n this._startScale = map.transform.scale;\n this._startBearing = map.transform.bearing;\n }\n\n } else {\n const param = { duration: 0, around: map.unproject(p) };\n\n if (this._gestureIntent === 'rotate') {\n param.bearing = this._startBearing + bearing;\n }\n if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') {\n param.zoom = map.transform.scaleZoom(this._startScale * scale);\n }\n\n map.stop();\n this._drainInertiaBuffer();\n this._inertia.push([Date.now(), scale, p]);\n\n map.easeTo(param, { originalEvent: e });\n }\n\n e.preventDefault();\n }\n\n _onEnd(e) {\n window.document.removeEventListener('touchmove', this._onMove);\n window.document.removeEventListener('touchend', this._onEnd);\n this._drainInertiaBuffer();\n\n const inertia = this._inertia,\n map = this._map;\n\n if (inertia.length < 2) {\n map.snapToNorth({}, { originalEvent: e });\n return;\n }\n\n const last = inertia[inertia.length - 1],\n first = inertia[0],\n lastScale = map.transform.scaleZoom(this._startScale * last[1]),\n firstScale = map.transform.scaleZoom(this._startScale * first[1]),\n scaleOffset = lastScale - firstScale,\n scaleDuration = (last[0] - first[0]) / 1000,\n p = last[2];\n\n if (scaleDuration === 0 || lastScale === firstScale) {\n map.snapToNorth({}, { originalEvent: e });\n return;\n }\n\n // calculate scale/s speed and adjust for increased initial animation speed when easing\n let speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s\n\n if (Math.abs(speed) > inertiaMaxSpeed) {\n if (speed > 0) {\n speed = inertiaMaxSpeed;\n } else {\n speed = -inertiaMaxSpeed;\n }\n }\n\n const duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000;\n let targetScale = lastScale + speed * duration / 2000;\n\n if (targetScale < 0) {\n targetScale = 0;\n }\n\n map.easeTo({\n zoom: targetScale,\n duration: duration,\n easing: inertiaEasing,\n around: this._aroundCenter ? map.getCenter() : map.unproject(p)\n }, { originalEvent: e });\n }\n\n _drainInertiaBuffer() {\n const inertia = this._inertia,\n now = Date.now(),\n cutoff = 160; // msec\n\n while (inertia.length > 2 && now - inertia[0][0] > cutoff) inertia.shift();\n }\n}\n\nmodule.exports = TouchZoomRotateHandler;\n","'use strict';\n\nconst util = require('../util/util');\nconst window = require('../util/window');\n\n/*\n * Adds the map's position to its page's location hash.\n * Passed as an option to the map object.\n *\n * @returns {Hash} `this`\n */\nclass Hash {\n constructor() {\n util.bindAll([\n '_onHashChange',\n '_updateHash'\n ], this);\n }\n\n /*\n * Map element to listen for coordinate changes\n *\n * @param {Object} map\n * @returns {Hash} `this`\n */\n addTo(map) {\n this._map = map;\n window.addEventListener('hashchange', this._onHashChange, false);\n this._map.on('moveend', this._updateHash);\n return this;\n }\n\n /*\n * Removes hash\n *\n * @returns {Popup} `this`\n */\n remove() {\n window.removeEventListener('hashchange', this._onHashChange, false);\n this._map.off('moveend', this._updateHash);\n delete this._map;\n return this;\n }\n\n _onHashChange() {\n const loc = window.location.hash.replace('#', '').split('/');\n if (loc.length >= 3) {\n this._map.jumpTo({\n center: [+loc[2], +loc[1]],\n zoom: +loc[0],\n bearing: +(loc[3] || 0),\n pitch: +(loc[4] || 0)\n });\n return true;\n }\n return false;\n }\n\n _updateHash() {\n const center = this._map.getCenter(),\n zoom = this._map.getZoom(),\n bearing = this._map.getBearing(),\n pitch = this._map.getPitch(),\n precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));\n\n let hash = `#${Math.round(zoom * 100) / 100\n }/${center.lat.toFixed(precision)\n }/${center.lng.toFixed(precision)}`;\n\n if (bearing || pitch) hash += (`/${Math.round(bearing * 10) / 10}`);\n if (pitch) hash += (`/${Math.round(pitch)}`);\n\n window.history.replaceState('', '', hash);\n }\n}\n\nmodule.exports = Hash;\n","'use strict';\n\nconst util = require('../util/util');\nconst browser = require('../util/browser');\nconst window = require('../util/window');\nconst DOM = require('../util/dom');\n\nconst Style = require('../style/style');\nconst AnimationLoop = require('../style/animation_loop');\nconst Painter = require('../render/painter');\n\nconst Transform = require('../geo/transform');\nconst Hash = require('./hash');\n\nconst bindHandlers = require('./bind_handlers');\n\nconst Camera = require('./camera');\nconst LngLat = require('../geo/lng_lat');\nconst LngLatBounds = require('../geo/lng_lat_bounds');\nconst Point = require('point-geometry');\nconst AttributionControl = require('./control/attribution_control');\nconst LogoControl = require('./control/logo_control');\nconst isSupported = require('mapbox-gl-supported');\n\nconst defaultMinZoom = 0;\nconst defaultMaxZoom = 22;\nconst defaultOptions = {\n center: [0, 0],\n zoom: 0,\n bearing: 0,\n pitch: 0,\n\n minZoom: defaultMinZoom,\n maxZoom: defaultMaxZoom,\n\n interactive: true,\n\n scrollZoom: true,\n boxZoom: true,\n dragRotate: true,\n dragPan: true,\n keyboard: true,\n doubleClickZoom: true,\n touchZoomRotate: true,\n\n bearingSnap: 7,\n\n hash: false,\n\n attributionControl: true,\n\n failIfMajorPerformanceCaveat: false,\n preserveDrawingBuffer: false,\n\n trackResize: true,\n\n renderWorldCopies: true,\n\n refreshExpiredTiles: true\n};\n\n/**\n * The `Map` object represents the map on your page. It exposes methods\n * and properties that enable you to programmatically change the map,\n * and fires events as users interact with it.\n *\n * You create a `Map` by specifying a `container` and other options.\n * Then Mapbox GL JS initializes the map on the page and returns your `Map`\n * object.\n *\n * @extends Evented\n * @param {Object} options\n * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. The specified element must have no children.\n * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-22).\n * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-22).\n * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to\n * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to\n * such JSON.\n *\n * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`,\n * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following\n * [the predefined Mapbox styles](https://www.mapbox.com/maps/):\n *\n * * `mapbox://styles/mapbox/streets-v9`\n * * `mapbox://styles/mapbox/outdoors-v9`\n * * `mapbox://styles/mapbox/light-v9`\n * * `mapbox://styles/mapbox/dark-v9`\n * * `mapbox://styles/mapbox/satellite-v9`\n * * `mapbox://styles/mapbox/satellite-streets-v9`\n *\n * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v9?optimize=true`.\n * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/#retrieve-tiles).\n *\n * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL.\n * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`.\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction.\n * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's\n * bearing (rotation) will snap to north. For example, with a `bearingSnap` of 7, if the user rotates\n * the map within 7 degrees of north, the map will automatically snap to exact north.\n * @param {Array} [options.classes] Mapbox style class names with which to initialize the map.\n * Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected\n * in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about\n * [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification.\n * @param {boolean} [options.attributionControl=true] If `true`, an [AttributionControl](#AttributionControl) will be added to the map.\n * @param {boolean} [options.logoPosition='bottom-left'] Position of the Mapbox wordmark on the map. Valid options are ['top-left','top-right', 'bottom-left', 'bottom-right'].\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox\n * GL JS would be dramatically worse than expected (i.e. a software renderer would be used).\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization.\n * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers.\n * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds.\n * @param {boolean|Object} [options.scrollZoom=true] If `true`, the \"scroll to zoom\" interaction is enabled. An `Object` value is passed as options to [`ScrollZoomHandler#enable`](#ScrollZoomHandler#enable).\n * @param {boolean} [options.boxZoom=true] If `true`, the \"box zoom\" interaction is enabled (see [`BoxZoomHandler`](#BoxZoomHandler)).\n * @param {boolean} [options.dragRotate=true] If `true`, the \"drag to rotate\" interaction is enabled (see [`DragRotateHandler`](#DragRotateHandler)).\n * @param {boolean} [options.dragPan=true] If `true`, the \"drag to pan\" interaction is enabled (see [`DragPanHandler`](#DragPanHandler)).\n * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see [`KeyboardHandler`](#KeyboardHandler)).\n * @param {boolean} [options.doubleClickZoom=true] If `true`, the \"double click to zoom\" interaction is enabled (see [`DoubleClickZoomHandler`](#DoubleClickZoomHandler)).\n * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the \"pinch to rotate and zoom\" interaction is enabled. An `Object` value is passed as options to [`TouchZoomRotateHandler#enable`](#TouchZoomRotateHandler#enable).\n * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes.\n * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]`.\n * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`.\n * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered, when zoomed out.\n * @example\n * var map = new mapboxgl.Map({\n * container: 'map',\n * center: [-122.420679, 37.772537],\n * zoom: 13,\n * style: style_object,\n * hash: true\n * });\n * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/)\n */\nclass Map extends Camera {\n\n constructor(options) {\n options = util.extend({}, defaultOptions, options);\n\n if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) {\n throw new Error(`maxZoom must be greater than minZoom`);\n }\n\n const transform = new Transform(options.minZoom, options.maxZoom, options.renderWorldCopies);\n super(transform, options);\n\n this._interactive = options.interactive;\n this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat;\n this._preserveDrawingBuffer = options.preserveDrawingBuffer;\n this._trackResize = options.trackResize;\n this._bearingSnap = options.bearingSnap;\n this._refreshExpiredTiles = options.refreshExpiredTiles;\n\n if (typeof options.container === 'string') {\n this._container = window.document.getElementById(options.container);\n if (!this._container) throw new Error(`Container '${options.container}' not found.`);\n } else {\n this._container = options.container;\n }\n\n this.animationLoop = new AnimationLoop();\n\n if (options.maxBounds) {\n this.setMaxBounds(options.maxBounds);\n }\n\n util.bindAll([\n '_onWindowOnline',\n '_onWindowResize',\n '_contextLost',\n '_contextRestored',\n '_update',\n '_render',\n '_onData',\n '_onDataLoading'\n ], this);\n\n this._setupContainer();\n this._setupPainter();\n\n this.on('move', this._update.bind(this, false));\n this.on('zoom', this._update.bind(this, true));\n this.on('moveend', () => {\n this.animationLoop.set(300); // text fading\n this._rerender();\n });\n\n if (typeof window !== 'undefined') {\n window.addEventListener('online', this._onWindowOnline, false);\n window.addEventListener('resize', this._onWindowResize, false);\n }\n\n bindHandlers(this, options);\n\n this._hash = options.hash && (new Hash()).addTo(this);\n // don't set position from options if set through hash\n if (!this._hash || !this._hash._onHashChange()) {\n this.jumpTo({\n center: options.center,\n zoom: options.zoom,\n bearing: options.bearing,\n pitch: options.pitch\n });\n }\n\n this._classes = [];\n\n this.resize();\n\n if (options.classes) this.setClasses(options.classes);\n if (options.style) this.setStyle(options.style);\n\n if (options.attributionControl) this.addControl(new AttributionControl());\n this.addControl(new LogoControl(), options.logoPosition);\n\n this.on('style.load', function() {\n if (this.transform.unmodified) {\n this.jumpTo(this.style.stylesheet);\n }\n this.style.update(this._classes, {transition: false});\n });\n\n this.on('data', this._onData);\n this.on('dataloading', this._onDataLoading);\n }\n\n /**\n * Adds a [`IControl`](#IControl) to the map, calling `control.onAdd(this)`.\n *\n * @param {IControl} control The [`IControl`](#IControl) to add.\n * @param {string} [position] position on the map to which the control will be added.\n * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`.\n * @returns {Map} `this`\n * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/)\n */\n addControl(control, position) {\n if (position === undefined && control.getDefaultPosition) {\n position = control.getDefaultPosition();\n }\n if (position === undefined) {\n position = 'top-right';\n }\n const controlElement = control.onAdd(this);\n const positionContainer = this._controlPositions[position];\n if (position.indexOf('bottom') !== -1) {\n positionContainer.insertBefore(controlElement, positionContainer.firstChild);\n } else {\n positionContainer.appendChild(controlElement);\n }\n return this;\n }\n\n /**\n * Removes the control from the map.\n *\n * @param {IControl} control The [`IControl`](#IControl) to remove.\n * @returns {Map} `this`\n */\n removeControl(control) {\n control.onRemove(this);\n return this;\n }\n\n /**\n * Adds a Mapbox style class to the map.\n *\n * Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected\n * in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about\n * [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification.\n *\n * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.\n *\n * @param {string} klass The style class to add.\n * @param {Object} [options]\n * @param {boolean} [options.transition] If `true`, property changes will smoothly transition.\n * @fires change\n * @returns {Map} `this`\n */\n addClass(klass, options) {\n util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.');\n if (this._classes.indexOf(klass) >= 0 || klass === '') return this;\n this._classes.push(klass);\n this._classOptions = options;\n\n if (this.style) this.style.updateClasses();\n return this._update(true);\n }\n\n /**\n * Removes a Mapbox style class from the map.\n *\n * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.\n *\n * @param {string} klass The style class to remove.\n * @param {Object} [options]\n * @param {boolean} [options.transition] If `true`, property changes will smoothly transition.\n * @fires change\n * @returns {Map} `this`\n */\n removeClass(klass, options) {\n util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.');\n const i = this._classes.indexOf(klass);\n if (i < 0 || klass === '') return this;\n this._classes.splice(i, 1);\n this._classOptions = options;\n\n if (this.style) this.style.updateClasses();\n return this._update(true);\n }\n\n /**\n * Replaces the map's existing Mapbox style classes with a new array of classes.\n *\n * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.\n *\n * @param {Array} klasses The style classes to set.\n * @param {Object} [options]\n * @param {boolean} [options.transition] If `true`, property changes will smoothly transition.\n * @fires change\n * @returns {Map} `this`\n */\n setClasses(klasses, options) {\n util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.');\n const uniqueClasses = {};\n for (let i = 0; i < klasses.length; i++) {\n if (klasses[i] !== '') uniqueClasses[klasses[i]] = true;\n }\n this._classes = Object.keys(uniqueClasses);\n this._classOptions = options;\n\n if (this.style) this.style.updateClasses();\n return this._update(true);\n }\n\n /**\n * Returns a Boolean indicating whether the map has the\n * specified Mapbox style class.\n *\n * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.\n *\n * @param {string} klass The style class to test.\n * @returns {boolean} `true` if the map has the specified style class.\n */\n hasClass(klass) {\n util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.');\n return this._classes.indexOf(klass) >= 0;\n }\n\n /**\n * Returns the map's Mapbox style classes.\n *\n * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.\n *\n * @returns {Array} The map's style classes.\n */\n getClasses() {\n util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.');\n return this._classes;\n }\n\n /**\n * Resizes the map according to the dimensions of its\n * `container` element.\n *\n * This method must be called after the map's `container` is resized by another script,\n * or when the map is shown after being initially hidden with CSS.\n *\n * @returns {Map} `this`\n */\n resize() {\n const dimensions = this._containerDimensions();\n const width = dimensions[0];\n const height = dimensions[1];\n\n this._resizeCanvas(width, height);\n this.transform.resize(width, height);\n this.painter.resize(width, height);\n\n return this\n .fire('movestart')\n .fire('move')\n .fire('resize')\n .fire('moveend');\n }\n\n /**\n * Returns the map's geographical bounds.\n *\n * @returns {LngLatBounds} The map's geographical bounds.\n */\n getBounds() {\n const bounds = new LngLatBounds(\n this.transform.pointLocation(new Point(0, this.transform.height)),\n this.transform.pointLocation(new Point(this.transform.width, 0)));\n\n if (this.transform.angle || this.transform.pitch) {\n bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0)));\n bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y)));\n }\n\n return bounds;\n }\n\n /**\n * Sets or clears the map's geographical bounds.\n *\n * Pan and zoom operations are constrained within these bounds.\n * If a pan or zoom is performed that would\n * display regions outside these bounds, the map will\n * instead display a position and zoom level\n * as close as possible to the operation's request while still\n * remaining within the bounds.\n *\n * @param {LngLatBoundsLike | null | undefined} lnglatbounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds.\n * @returns {Map} `this`\n */\n setMaxBounds (lnglatbounds) {\n if (lnglatbounds) {\n const b = LngLatBounds.convert(lnglatbounds);\n this.transform.lngRange = [b.getWest(), b.getEast()];\n this.transform.latRange = [b.getSouth(), b.getNorth()];\n this.transform._constrain();\n this._update();\n } else if (lnglatbounds === null || lnglatbounds === undefined) {\n this.transform.lngRange = [];\n this.transform.latRange = [];\n this._update();\n }\n return this;\n\n }\n /**\n * Sets or clears the map's minimum zoom level.\n * If the map's current zoom level is lower than the new minimum,\n * the map will zoom to the new minimum.\n *\n * @param {?number} minZoom The minimum zoom level to set (0-20).\n * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0).\n * @returns {Map} `this`\n */\n setMinZoom(minZoom) {\n\n minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom;\n\n if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) {\n this.transform.minZoom = minZoom;\n this._update();\n\n if (this.getZoom() < minZoom) this.setZoom(minZoom);\n\n return this;\n\n } else throw new Error(`minZoom must be between ${defaultMinZoom} and the current maxZoom, inclusive`);\n }\n\n /**\n * Returns the map's minimum allowable zoom level.\n *\n * @returns {number} minZoom\n */\n getMinZoom() { return this.transform.minZoom; }\n\n /**\n * Sets or clears the map's maximum zoom level.\n * If the map's current zoom level is higher than the new maximum,\n * the map will zoom to the new maximum.\n *\n * @param {?number} maxZoom The maximum zoom level to set.\n * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 20).\n * @returns {Map} `this`\n */\n setMaxZoom(maxZoom) {\n\n maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom;\n\n if (maxZoom >= this.transform.minZoom) {\n this.transform.maxZoom = maxZoom;\n this._update();\n\n if (this.getZoom() > maxZoom) this.setZoom(maxZoom);\n\n return this;\n\n } else throw new Error(`maxZoom must be greater than the current minZoom`);\n }\n\n /**\n * Returns the map's maximum allowable zoom level.\n *\n * @returns {number} maxZoom\n */\n getMaxZoom() { return this.transform.maxZoom; }\n\n /**\n * Returns a [`Point`](#Point) representing pixel coordinates, relative to the map's `container`,\n * that correspond to the specified geographical location.\n *\n * @param {LngLatLike} lnglat The geographical location to project.\n * @returns {Point} The [`Point`](#Point) corresponding to `lnglat`, relative to the map's `container`.\n */\n project(lnglat) {\n return this.transform.locationPoint(LngLat.convert(lnglat));\n }\n\n /**\n * Returns a [`LngLat`](#LngLat) representing geographical coordinates that correspond\n * to the specified pixel coordinates.\n *\n * @param {PointLike} point The pixel coordinates to unproject.\n * @returns {LngLat} The [`LngLat`](#LngLat) corresponding to `point`.\n * @see [Show polygon information on click](https://www.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/)\n */\n unproject(point) {\n return this.transform.pointLocation(Point.convert(point));\n }\n\n /**\n * Returns an array of [GeoJSON](http://geojson.org/)\n * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects)\n * representing visible features that satisfy the query parameters.\n *\n * @param {PointLike|Array} [geometry] - The geometry of the query region:\n * either a single point or southwest and northeast points describing a bounding box.\n * Omitting this parameter (i.e. calling [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures) with zero arguments,\n * or with only a `parameters` argument) is equivalent to passing a bounding box encompassing the entire\n * map viewport.\n * @param {Object} [parameters]\n * @param {Array} [parameters.layers] An array of style layer IDs for the query to inspect.\n * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked.\n * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n * to limit query results.\n *\n * @returns {Array} An array of [GeoJSON](http://geojson.org/)\n * [feature objects](http://geojson.org/geojson-spec.html#feature-objects).\n *\n * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only\n * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported).\n *\n * Each feature includes a top-level `layer` property whose value is an object representing the style layer to\n * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated\n * for the given zoom level and feature.\n *\n * Features from layers whose `visibility` property is `\"none\"`, or from layers whose zoom range excludes the\n * current zoom level are not included. Symbol features that have been hidden due to text or icon collision are\n * not included. Features from all other layers are included, including features that may have no visible\n * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to\n * 0.\n *\n * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by\n * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low\n * zoom levels) are returned only once (though subject to the following caveat).\n *\n * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple\n * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.\n * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding\n * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile\n * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple\n * tiles due to tile buffering.\n *\n * @example\n * // Find all features at a point\n * var features = map.queryRenderedFeatures(\n * [20, 35],\n * { layers: ['my-layer-name'] }\n * );\n *\n * @example\n * // Find all features within a static bounding box\n * var features = map.queryRenderedFeatures(\n * [[10, 20], [30, 50]],\n * { layers: ['my-layer-name'] }\n * );\n *\n * @example\n * // Find all features within a bounding box around a point\n * var width = 10;\n * var height = 20;\n * var features = map.queryRenderedFeatures([\n * [point.x - width / 2, point.y - height / 2],\n * [point.x + width / 2, point.y + height / 2]\n * ], { layers: ['my-layer-name'] });\n *\n * @example\n * // Query all rendered features from a single layer\n * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] });\n * @see [Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/)\n * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n */\n queryRenderedFeatures() {\n let params = {};\n let geometry;\n\n if (arguments.length === 2) {\n geometry = arguments[0];\n params = arguments[1];\n } else if (arguments.length === 1 && isPointLike(arguments[0])) {\n geometry = arguments[0];\n } else if (arguments.length === 1) {\n params = arguments[0];\n }\n\n return this.style.queryRenderedFeatures(\n this._makeQueryGeometry(geometry),\n params,\n this.transform.zoom,\n this.transform.angle\n );\n\n function isPointLike(input) {\n return input instanceof Point || Array.isArray(input);\n }\n }\n\n _makeQueryGeometry(pointOrBox) {\n if (pointOrBox === undefined) {\n // bounds was omitted: use full viewport\n pointOrBox = [\n Point.convert([0, 0]),\n Point.convert([this.transform.width, this.transform.height])\n ];\n }\n\n let queryGeometry;\n const isPoint = pointOrBox instanceof Point || typeof pointOrBox[0] === 'number';\n\n if (isPoint) {\n const point = Point.convert(pointOrBox);\n queryGeometry = [point];\n } else {\n const box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])];\n queryGeometry = [\n box[0],\n new Point(box[1].x, box[0].y),\n box[1],\n new Point(box[0].x, box[1].y),\n box[0]\n ];\n }\n\n queryGeometry = queryGeometry.map((p) => {\n return this.transform.pointCoordinate(p);\n });\n\n return queryGeometry;\n }\n\n /**\n * Returns an array of [GeoJSON](http://geojson.org/)\n * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects)\n * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters.\n *\n * @param {string} sourceID The ID of the vector tile or GeoJSON source to query.\n * @param {Object} [parameters]\n * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile\n * sources, this parameter is required.* For GeoJSON sources, it is ignored.\n * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)\n * to limit query results.\n *\n * @returns {Array} An array of [GeoJSON](http://geojson.org/)\n * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects).\n *\n * In contrast to [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures), this function\n * returns all features matching the query parameters,\n * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded\n * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently\n * visible viewport.\n *\n * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature\n * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple\n * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query.\n * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding\n * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile\n * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple\n * tiles due to tile buffering.\n * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/)\n */\n querySourceFeatures(sourceID, parameters) {\n return this.style.querySourceFeatures(sourceID, parameters);\n }\n\n /**\n * Updates the map's Mapbox style object with a new value. If the given\n * value is style JSON object, compares it against the the map's current\n * state and perform only the changes necessary to make the map style match\n * the desired state.\n *\n * @param {Object|string} style A JSON object conforming to the schema described in the\n * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON.\n * @param {Object} [options]\n * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style\n * and adding building the given one instead of attempting a diff-based update.\n * @returns {Map} `this`\n * @see [Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/)\n */\n setStyle(style, options) {\n const shouldTryDiff = (!options || options.diff !== false) && this.style && style &&\n !(style instanceof Style) && typeof style !== 'string';\n if (shouldTryDiff) {\n try {\n if (this.style.setState(style)) {\n this._update(true);\n }\n return this;\n } catch (e) {\n util.warnOnce(`Unable to perform style diff: ${e.message || e.error || e}. Rebuilding the style from scratch.`);\n }\n }\n\n if (this.style) {\n this.style.setEventedParent(null);\n this.style._remove();\n this.off('rotate', this.style._redoPlacement);\n this.off('pitch', this.style._redoPlacement);\n }\n\n if (!style) {\n this.style = null;\n return this;\n } else if (style instanceof Style) {\n this.style = style;\n } else {\n this.style = new Style(style, this);\n }\n\n this.style.setEventedParent(this, {style: this.style});\n\n this.on('rotate', this.style._redoPlacement);\n this.on('pitch', this.style._redoPlacement);\n\n return this;\n }\n\n /**\n * Returns the map's Mapbox style object, which can be used to recreate the map's style.\n *\n * @returns {Object} The map's style object.\n */\n getStyle() {\n if (this.style) {\n return this.style.serialize();\n }\n }\n\n /**\n * Adds a source to the map's style.\n *\n * @param {string} id The ID of the source to add. Must not conflict with existing sources.\n * @param {Object} source The source object, conforming to the\n * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources).\n * @param {string} source.type The source type, which must be either one of the core Mapbox GL source types defined in the style specification or a custom type that has been added to the map with {@link Map#addSourceType}.\n * @fires source.add\n * @returns {Map} `this`\n * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/)\n * @see [Style circles using data-driven styling](https://www.mapbox.com/mapbox-gl-js/example/data-driven-circle-colors/)\n * @see [Set a point after Geocoder result](https://www.mapbox.com/mapbox-gl-js/example/point-from-geocoder-result/)\n */\n addSource(id, source) {\n this.style.addSource(id, source);\n this._update(true);\n return this;\n }\n\n /**\n * Returns a Boolean indicating whether the source is loaded.\n *\n * @param {string} id The ID of the source to be checked.\n * @returns {boolean} A Boolean indicating whether the source is loaded.\n */\n isSourceLoaded(id) {\n const source = this.style && this.style.sourceCaches[id];\n if (source === undefined) {\n this.fire('error', {\n error: new Error(`There is no source with ID '${id}'`)\n });\n return;\n }\n return source.loaded();\n }\n\n /**\n * Adds a [custom source type](#Custom Sources), making it available for use with\n * {@link Map#addSource}.\n * @private\n * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field.\n * @param {Function} SourceType A {@link Source} constructor.\n * @param {Function} callback Called when the source type is ready or with an error argument if there is an error.\n */\n addSourceType(name, SourceType, callback) {\n return this.style.addSourceType(name, SourceType, callback);\n }\n\n /**\n * Removes a source from the map's style.\n *\n * @param {string} id The ID of the source to remove.\n * @returns {Map} `this`\n */\n removeSource(id) {\n this.style.removeSource(id);\n this._update(true);\n return this;\n }\n\n /**\n * Returns the source with the specified ID in the map's style.\n *\n * @param {string} id The ID of the source to get.\n * @returns {?Object} The style source with the specified ID, or `undefined`\n * if the ID corresponds to no existing sources.\n * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/)\n * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/)\n */\n getSource(id) {\n return this.style.getSource(id);\n }\n\n /**\n * Add an image to the style. This image can be used in `icon-image`,\n * `background-pattern`, `fill-pattern`, and `line-pattern`. An\n * {@link Map#error} event will be fired if there is not enough space in the\n * sprite to add this image.\n *\n * @param {string} name The name of the image.\n * @param {HTMLImageElement|ArrayBufferView} image The image as an `HTMLImageElement` or `ArrayBufferView` (using the format of [`ImageData#data`](https://developer.mozilla.org/en-US/docs/Web/API/ImageData/data))\n * @param {Object} [options] Required if and only if passing an `ArrayBufferView`\n * @param {number} [options.width] The pixel width of the `ArrayBufferView` image\n * @param {number} [options.height] The pixel height of the `ArrayBufferView` image\n * @param {number} [options.pixelRatio] The ratio of pixels in the `ArrayBufferView` image to physical pixels on the screen\n */\n addImage(name, image, options) {\n this.style.spriteAtlas.addImage(name, image, options);\n }\n\n /**\n * Remove an image from the style (such as one used by `icon-image` or `background-pattern`).\n *\n * @param {string} name The name of the image.\n */\n removeImage(name) {\n this.style.spriteAtlas.removeImage(name);\n }\n\n /**\n * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers)\n * to the map's style.\n *\n * A layer defines styling for data from a specified source.\n *\n * @param {Object} layer The style layer to add, conforming to the Mapbox Style Specification's\n * [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers).\n * @param {string} [before] The ID of an existing layer to insert the new layer before.\n * If this argument is omitted, the layer will be appended to the end of the layers array.\n * @returns {Map} `this`\n * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/)\n * @see [Add a vector tile source](https://www.mapbox.com/mapbox-gl-js/example/vector-source/)\n * @see [Add a WMS source](https://www.mapbox.com/mapbox-gl-js/example/wms/)\n */\n addLayer(layer, before) {\n this.style.addLayer(layer, before);\n this._update(true);\n return this;\n }\n\n /**\n * Moves a layer to a different z-position.\n *\n * @param {string} id The ID of the layer to move.\n * @param {string} [beforeId] The ID of an existing layer to insert the new layer before.\n * If this argument is omitted, the layer will be appended to the end of the layers array.\n * @returns {Map} `this`\n */\n moveLayer(id, beforeId) {\n this.style.moveLayer(id, beforeId);\n this._update(true);\n return this;\n }\n\n /**\n * Removes a layer from the map's style.\n *\n * @param {string} id The ID of the layer to remove.\n * @throws {Error} if no layer with the specified `id` exists.\n * @returns {Map} `this`\n */\n removeLayer(id) {\n this.style.removeLayer(id);\n this._update(true);\n return this;\n }\n\n /**\n * Returns the layer with the specified ID in the map's style.\n *\n * @param {string} id The ID of the layer to get.\n * @returns {?Object} The layer with the specified ID, or `undefined`\n * if the ID corresponds to no existing layers.\n * @see [Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/)\n * @see [Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/)\n */\n getLayer(id) {\n return this.style.getLayer(id);\n }\n\n /**\n * Sets the filter for the specified style layer.\n *\n * @param {string} layer The ID of the layer to which the filter will be applied.\n * @param {Array} filter The filter, conforming to the Mapbox Style Specification's\n * [filter definition](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter).\n * @returns {Map} `this`\n * @example\n * map.setFilter('my-layer', ['==', 'name', 'USA']);\n * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/)\n * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/)\n */\n setFilter(layer, filter) {\n this.style.setFilter(layer, filter);\n this._update(true);\n return this;\n }\n\n /**\n * Sets the zoom extent for the specified style layer.\n *\n * @param {string} layerId The ID of the layer to which the zoom extent will be applied.\n * @param {number} minzoom The minimum zoom to set (0-20).\n * @param {number} maxzoom The maximum zoom to set (0-20).\n * @returns {Map} `this`\n * @example\n * map.setLayerZoomRange('my-layer', 2, 5);\n */\n setLayerZoomRange(layerId, minzoom, maxzoom) {\n this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n this._update(true);\n return this;\n }\n\n /**\n * Returns the filter applied to the specified style layer.\n *\n * @param {string} layer The ID of the style layer whose filter to get.\n * @returns {Array} The layer's filter.\n */\n getFilter(layer) {\n return this.style.getFilter(layer);\n }\n\n /**\n * Sets the value of a paint property in the specified style layer.\n *\n * @param {string} layer The ID of the layer to set the paint property in.\n * @param {string} name The name of the paint property to set.\n * @param {*} value The value of the paint propery to set.\n * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n * @param {string=} klass A style class specifier for the paint property.\n * @returns {Map} `this`\n * @example\n * map.setPaintProperty('my-layer', 'fill-color', '#faafee');\n * @see [Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/)\n * @see [Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/)\n * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n */\n setPaintProperty(layer, name, value, klass) {\n this.style.setPaintProperty(layer, name, value, klass);\n this._update(true);\n return this;\n }\n\n /**\n * Returns the value of a paint property in the specified style layer.\n *\n * @param {string} layer The ID of the layer to get the paint property from.\n * @param {string} name The name of a paint property to get.\n * @param {string=} klass A class specifier for the paint property.\n * @returns {*} The value of the specified paint property.\n */\n getPaintProperty(layer, name, klass) {\n return this.style.getPaintProperty(layer, name, klass);\n }\n\n /**\n * Sets the value of a layout property in the specified style layer.\n *\n * @param {string} layer The ID of the layer to set the layout property in.\n * @param {string} name The name of the layout property to set.\n * @param {*} value The value of the layout propery. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n * @returns {Map} `this`\n * @example\n * map.setLayoutProperty('my-layer', 'visibility', 'none');\n */\n setLayoutProperty(layer, name, value) {\n this.style.setLayoutProperty(layer, name, value);\n this._update(true);\n return this;\n }\n\n /**\n * Returns the value of a layout property in the specified style layer.\n *\n * @param {string} layer The ID of the layer to get the layout property from.\n * @param {string} name The name of the layout property to get.\n * @returns {*} The value of the specified layout property.\n */\n getLayoutProperty(layer, name) {\n return this.style.getLayoutProperty(layer, name);\n }\n\n /**\n * Sets the any combination of light values.\n *\n * @param {Object} options Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/).\n * @returns {Map} `this`\n */\n setLight(lightOptions) {\n this.style.setLight(lightOptions);\n this._update(true);\n return this;\n }\n\n /**\n * Returns the value of the light object.\n *\n * @returns {Object} light Light properties of the style.\n */\n getLight() {\n return this.style.getLight();\n }\n\n /**\n * Returns the map's containing HTML element.\n *\n * @returns {HTMLElement} The map's container.\n */\n getContainer() {\n return this._container;\n }\n\n /**\n * Returns the HTML element containing the map's `` element.\n *\n * If you want to add non-GL overlays to the map, you should append them to this element.\n *\n * This is the element to which event bindings for map interactivity (such as panning and zooming) are\n * attached. It will receive bubbled events from child elements such as the ``, but not from\n * map controls.\n *\n * @returns {HTMLElement} The container of the map's ``.\n * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n */\n getCanvasContainer() {\n return this._canvasContainer;\n }\n\n /**\n * Returns the map's `` element.\n *\n * @returns {HTMLCanvasElement} The map's `` element.\n * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/)\n * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n */\n getCanvas() {\n return this._canvas;\n }\n\n _containerDimensions() {\n let width = 0;\n let height = 0;\n\n if (this._container) {\n width = this._container.offsetWidth || 400;\n height = this._container.offsetHeight || 300;\n }\n\n return [width, height];\n }\n\n _setupContainer() {\n const container = this._container;\n container.classList.add('mapboxgl-map');\n\n const canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n if (this._interactive) {\n canvasContainer.classList.add('mapboxgl-interactive');\n }\n\n this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer);\n this._canvas.style.position = 'absolute';\n this._canvas.addEventListener('webglcontextlost', this._contextLost, false);\n this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false);\n this._canvas.setAttribute('tabindex', 0);\n this._canvas.setAttribute('aria-label', 'Map');\n\n const dimensions = this._containerDimensions();\n this._resizeCanvas(dimensions[0], dimensions[1]);\n\n const controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n const positions = this._controlPositions = {};\n ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach((positionName) => {\n positions[positionName] = DOM.create('div', `mapboxgl-ctrl-${positionName}`, controlContainer);\n });\n }\n\n _resizeCanvas(width, height) {\n const pixelRatio = window.devicePixelRatio || 1;\n\n // Request the required canvas size taking the pixelratio into account.\n this._canvas.width = pixelRatio * width;\n this._canvas.height = pixelRatio * height;\n\n // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n this._canvas.style.width = `${width}px`;\n this._canvas.style.height = `${height}px`;\n }\n\n _setupPainter() {\n const attributes = util.extend({\n failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat,\n preserveDrawingBuffer: this._preserveDrawingBuffer\n }, isSupported.webGLContextAttributes);\n\n const gl = this._canvas.getContext('webgl', attributes) ||\n this._canvas.getContext('experimental-webgl', attributes);\n\n if (!gl) {\n this.fire('error', { error: new Error('Failed to initialize WebGL') });\n return;\n }\n\n this.painter = new Painter(gl, this.transform);\n }\n\n /**\n * Fired when the WebGL context is lost.\n *\n * @event webglcontextlost\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {WebGLContextEvent} originalEvent The original DOM event.\n */\n _contextLost(event) {\n event.preventDefault();\n if (this._frameId) {\n browser.cancelFrame(this._frameId);\n }\n this.fire('webglcontextlost', {originalEvent: event});\n }\n\n /**\n * Fired when the WebGL context is restored.\n *\n * @event webglcontextrestored\n * @memberof Map\n * @instance\n * @type {Object}\n * @property {WebGLContextEvent} originalEvent The original DOM event.\n */\n _contextRestored(event) {\n this._setupPainter();\n this.resize();\n this._update();\n this.fire('webglcontextrestored', {originalEvent: event});\n }\n\n /**\n * Returns a Boolean indicating whether the map is fully loaded.\n *\n * Returns `false` if the style is not yet fully loaded,\n * or if there has been a change to the sources or style that\n * has not yet fully loaded.\n *\n * @returns {boolean} A Boolean indicating whether the map is fully loaded.\n */\n loaded() {\n if (this._styleDirty || this._sourcesDirty)\n return false;\n if (!this.style || !this.style.loaded())\n return false;\n return true;\n }\n\n /**\n * Update this map's style and sources, and re-render the map.\n *\n * @param {boolean} updateStyle mark the map's style for reprocessing as\n * well as its sources\n * @returns {Map} this\n * @private\n */\n _update(updateStyle) {\n if (!this.style) return this;\n\n this._styleDirty = this._styleDirty || updateStyle;\n this._sourcesDirty = true;\n\n this._rerender();\n\n return this;\n }\n\n /**\n * Call when a (re-)render of the map is required:\n * - The style has changed (`setPaintProperty()`, etc.)\n * - Source data has changed (e.g. tiles have finished loading)\n * - The map has is moving (or just finished moving)\n * - A transition is in progress\n *\n * @returns {Map} this\n * @private\n */\n _render() {\n // If the style has changed, the map is being zoomed, or a transition\n // is in progress:\n // - Apply style changes (in a batch)\n // - Recalculate zoom-dependent paint properties.\n if (this.style && this._styleDirty) {\n this._styleDirty = false;\n this.style.update(this._classes, this._classOptions);\n this._classOptions = null;\n this.style._recalculate(this.transform.zoom);\n }\n\n // If we are in _render for any reason other than an in-progress paint\n // transition, update source caches to check for and load any tiles we\n // need for the current transform\n if (this.style && this._sourcesDirty) {\n this._sourcesDirty = false;\n this.style._updateSources(this.transform);\n }\n\n // Actually draw\n this.painter.render(this.style, {\n showTileBoundaries: this.showTileBoundaries,\n showOverdrawInspector: this._showOverdrawInspector,\n rotating: this.rotating,\n zooming: this.zooming\n });\n\n this.fire('render');\n\n if (this.loaded() && !this._loaded) {\n this._loaded = true;\n this.fire('load');\n }\n\n this._frameId = null;\n\n // Flag an ongoing transition\n if (!this.animationLoop.stopped()) {\n this._styleDirty = true;\n }\n\n // Schedule another render frame if it's needed.\n //\n // Even though `_styleDirty` and `_sourcesDirty` are reset in this\n // method, synchronous events fired during Style#update or\n // Style#_updateSources could have caused them to be set again.\n if (this._sourcesDirty || this._repaint || this._styleDirty) {\n this._rerender();\n }\n\n return this;\n }\n\n /**\n * Clean up and release all internal resources associated with this map.\n *\n * This includes DOM elements, event bindings, web workers, and WebGL resources.\n *\n * Use this method when you are done using the map and wish to ensure that it no\n * longer consumes browser resources. Afterwards, you must not call any other\n * methods on the map.\n */\n remove() {\n if (this._hash) this._hash.remove();\n browser.cancelFrame(this._frameId);\n this.setStyle(null);\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this._onWindowResize, false);\n window.removeEventListener('online', this._onWindowOnline, false);\n }\n const extension = this.painter.gl.getExtension('WEBGL_lose_context');\n if (extension) extension.loseContext();\n removeNode(this._canvasContainer);\n removeNode(this._controlContainer);\n this._container.classList.remove('mapboxgl-map');\n this.fire('remove');\n }\n\n _rerender() {\n if (this.style && !this._frameId) {\n this._frameId = browser.frame(this._render);\n }\n }\n\n _onWindowOnline() {\n this._update();\n }\n\n _onWindowResize() {\n if (this._trackResize) {\n this.stop().resize()._update();\n }\n }\n\n /**\n * Gets and sets a Boolean indicating whether the map will render an outline\n * around each tile. These tile boundaries are useful for debugging.\n *\n * @name showTileBoundaries\n * @type {boolean}\n * @instance\n * @memberof Map\n */\n get showTileBoundaries() { return !!this._showTileBoundaries; }\n set showTileBoundaries(value) {\n if (this._showTileBoundaries === value) return;\n this._showTileBoundaries = value;\n this._update();\n }\n\n /**\n * Gets and sets a Boolean indicating whether the map will render boxes\n * around all symbols in the data source, revealing which symbols\n * were rendered or which were hidden due to collisions.\n * This information is useful for debugging.\n *\n * @name showCollisionBoxes\n * @type {boolean}\n * @instance\n * @memberof Map\n */\n get showCollisionBoxes() { return !!this._showCollisionBoxes; }\n set showCollisionBoxes(value) {\n if (this._showCollisionBoxes === value) return;\n this._showCollisionBoxes = value;\n this.style._redoPlacement();\n }\n\n /*\n * Gets and sets a Boolean indicating whether the map should color-code\n * each fragment to show how many times it has been shaded.\n * White fragments have been shaded 8 or more times.\n * Black fragments have been shaded 0 times.\n * This information is useful for debugging.\n *\n * @name showOverdraw\n * @type {boolean}\n * @instance\n * @memberof Map\n */\n get showOverdrawInspector() { return !!this._showOverdrawInspector; }\n set showOverdrawInspector(value) {\n if (this._showOverdrawInspector === value) return;\n this._showOverdrawInspector = value;\n this._update();\n }\n\n /**\n * Gets and sets a Boolean indicating whether the map will\n * continuously repaint. This information is useful for analyzing performance.\n *\n * @name repaint\n * @type {boolean}\n * @instance\n * @memberof Map\n */\n get repaint() { return !!this._repaint; }\n set repaint(value) { this._repaint = value; this._update(); }\n\n // show vertices\n get vertices() { return !!this._vertices; }\n set vertices(value) { this._vertices = value; this._update(); }\n\n _onData(event) {\n this._update(event.dataType === 'style');\n this.fire(`${event.dataType}data`, event);\n }\n\n _onDataLoading(event) {\n this.fire(`${event.dataType}dataloading`, event);\n }\n}\n\nmodule.exports = Map;\n\nfunction removeNode(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\n\n/**\n * Interface for interactive controls added to the map. This is an\n * specification for implementers to model: it is not\n * an exported method or class.\n *\n * Controls must implement `onAdd` and `onRemove`, and must own an\n * element, which is often a `div` element. To use Mapbox GL JS's\n * default control styling, add the `mapboxgl-ctrl` class to your control's\n * node.\n *\n * @interface IControl\n * @example\n * // Control implemented as ES6 class\n * class HelloWorldControl {\n * onAdd(map) {\n * this._map = map;\n * this._container = document.createElement('div');\n * this._container.className = 'mapboxgl-ctrl';\n * this._container.textContent = 'Hello, world';\n * return this._container;\n * }\n *\n * onRemove() {\n * this._container.parentNode.removeChild(this._container);\n * this._map = undefined;\n * }\n * }\n *\n * // Control implemented as ES5 prototypical class\n * function HelloWorldControl() { }\n *\n * HelloWorldControl.prototype.onAdd = function(map) {\n * this._map = map;\n * this._container = document.createElement('div');\n * this._container.className = 'mapboxgl-ctrl';\n * this._container.textContent = 'Hello, world';\n * return this._container;\n * };\n *\n * HelloWorldControl.prototype.onRemove() {\n * this._container.parentNode.removeChild(this._container);\n * this._map = undefined;\n * };\n */\n\n/**\n * Register a control on the map and give it a chance to register event listeners\n * and resources. This method is called by {@link Map#addControl}\n * internally.\n *\n * @function\n * @memberof IControl\n * @instance\n * @name onAdd\n * @param {Map} map the Map this control will be added to\n * @returns {HTMLElement} The control's container element. This should\n * be created by the control and returned by onAdd without being attached\n * to the DOM: the map will insert the control's element into the DOM\n * as necessary.\n */\n\n/**\n * Unregister a control on the map and give it a chance to detach event listeners\n * and resources. This method is called by {@link Map#removeControl}\n * internally.\n *\n * @function\n * @memberof IControl\n * @instance\n * @name onRemove\n * @param {Map} map the Map this control will be removed from\n * @returns {undefined} there is no required return value for this method\n */\n\n/**\n * Optionally provide a default position for this control. If this method\n * is implemented and {@link Map#addControl} is called without the `position`\n * parameter, the value returned by getDefaultPosition will be used as the\n * control's position.\n *\n * @function\n * @memberof IControl\n * @instance\n * @name getDefaultPosition\n * @returns {string} a control position, one of the values valid in addControl.\n */\n\n/**\n * A [`LngLat`](#LngLat) object or an array of two numbers representing longitude and latitude.\n *\n * @typedef {(LngLat | Array)} LngLatLike\n * @example\n * var v1 = new mapboxgl.LngLat(-122.420679, 37.772537);\n * var v2 = [-122.420679, 37.772537];\n */\n\n/**\n * A [`LngLatBounds`](#LngLatBounds) object or an array of [`LngLatLike`](#LngLatLike) objects in [sw, ne] order.\n *\n * @typedef {(LngLatBounds | Array)} LngLatBoundsLike\n * @example\n * var v1 = new mapboxgl.LngLatBounds(\n * new mapboxgl.LngLat(-73.9876, 40.7661),\n * new mapboxgl.LngLat(-73.9397, 40.8002)\n * );\n * var v2 = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002])\n * var v3 = [[-73.9876, 40.7661], [-73.9397, 40.8002]];\n */\n\n/**\n * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has\n * `x` and `y` properties representing screen coordinates in pixels.\n *\n * @typedef {Object} Point\n */\n\n/**\n * A [`Point`](#Point) or an array of two numbers representing `x` and `y` screen coordinates in pixels.\n *\n * @typedef {(Point | Array)} PointLike\n */\n\n/**\n * Fired whenever the map is drawn to the screen, as the result of\n *\n * - a change to the map's position, zoom, pitch, or bearing\n * - a change to the map's style\n * - a change to a GeoJSON source\n * - the loading of a vector tile, GeoJSON file, glyph, or sprite\n *\n * @event render\n * @memberof Map\n * @instance\n */\n\n/**\n * Fired when a point device (usually a mouse) leaves the map's canvas.\n *\n * @event mouseout\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n * @see [Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/)\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is pressed within the map.\n *\n * @event mousedown\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is released within the map.\n *\n * @event mouseup\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/)\n * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/)\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is moved within the map.\n *\n * @event mousemove\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/)\n * @see [Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/)\n * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n */\n\n/**\n * Fired when a touch point is placed on the map.\n *\n * @event touchstart\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point is removed from the map.\n *\n * @event touchend\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point is moved within the map.\n *\n * @event touchmove\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a touch point has been disrupted.\n *\n * @event touchcancel\n * @memberof Map\n * @instance\n * @property {MapTouchEvent} data\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is pressed and released at the same point on the map.\n *\n * @event click\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/)\n * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/)\n */\n\n/**\n * Fired when a pointing device (usually a mouse) is clicked twice at the same point on the map.\n *\n * @event dblclick\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired when the right button of the mouse is clicked or the context menu key is pressed within the map.\n *\n * @event contextmenu\n * @memberof Map\n * @instance\n * @property {MapMouseEvent} data\n */\n\n/**\n * Fired immediately after all necessary resources have been downloaded\n * and the first visually complete rendering of the map has occurred.\n *\n * @event load\n * @memberof Map\n * @instance\n * @type {Object}\n * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/)\n * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/)\n * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/)\n */\n\n/**\n * Fired just before the map begins a transition from one\n * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo).\n *\n * @event movestart\n * @memberof Map\n * @instance\n * @property {{originalEvent: DragEvent}} data\n */\n\n/**\n * Fired repeatedly during an animated transition from one view to\n * another, as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo).\n *\n * @event move\n * @memberof Map\n * @instance\n * @property {MapMouseEvent | MapTouchEvent} data\n */\n\n/**\n * Fired just after the map completes a transition from one\n * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo).\n *\n * @event moveend\n * @memberof Map\n * @instance\n * @property {{originalEvent: DragEvent}} data\n * @see [Play map locations as a slideshow](https://www.mapbox.com/mapbox-gl-js/example/playback-locations/)\n * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/)\n */\n\n /**\n * Fired when an error occurs. This is GL JS's primary error reporting\n * mechanism. We use an event instead of `throw` to better accommodate\n * asyncronous operations. If no listeners are bound to the `error` event, the\n * error will be printed to the console.\n *\n * @event error\n * @memberof Map\n * @instance\n * @property {{error: {message: string}}} data\n */\n\n/**\n * Fired when any map data loads or changes. See [`MapDataEvent`](#MapDataEvent)\n * for more information.\n *\n * @event data\n * @memberof Map\n * @instance\n * @property {MapDataEvent} data\n */\n\n/**\n * Fired when the map's style loads or changes. See\n * [`MapDataEvent`](#MapDataEvent) for more information.\n *\n * @event styledata\n * @memberof Map\n * @instance\n * @property {MapDataEvent} data\n */\n\n/**\n * Fired when one of the map's sources loads or changes, including if a tile belonging\n * to a source loads or changes. See [`MapDataEvent`](#MapDataEvent) for more information.\n *\n * @event sourcedata\n * @memberof Map\n * @instance\n * @property {MapDataEvent} data\n */\n\n/**\n * Fired when any map data (style, source, tile, etc) begins loading or\n * changing asyncronously. All `dataloading` events are followed by a `data`\n * or `error` event. See [`MapDataEvent`](#MapDataEvent) for more information.\n *\n * @event dataloading\n * @memberof Map\n * @instance\n * @property {MapDataEvent} data\n */\n\n/**\n * Fired when the map's style begins loading or changing asyncronously.\n * All `styledataloading` events are followed by a `styledata`\n * or `error` event. See [`MapDataEvent`](#MapDataEvent) for more information.\n *\n * @event styledataloading\n * @memberof Map\n * @instance\n * @property {MapDataEvent} data\n */\n\n/**\n * Fired when one of the map's sources begins loading or changing asyncronously.\n * All `sourcedataloading` events are followed by a `sourcedata` or `error` event.\n * See [`MapDataEvent`](#MapDataEvent) for more information.\n *\n * @event sourcedataloading\n * @memberof Map\n * @instance\n * @property {MapDataEvent} data\n */\n\n /**\n * A `MapDataEvent` object is emitted with the [`Map#data`](#Map.event:data)\n * and [`Map#dataloading`](#Map.event:dataloading) events. Possible values for\n * `dataType`s are:\n *\n * - `'source'`: The non-tile data associated with any source\n * - `'style'`: The [style](https://www.mapbox.com/mapbox-gl-style-spec/) used by the map\n *\n * @typedef {Object} MapDataEvent\n * @property {string} type The event type.\n * @property {string} dataType The type of data that has changed. One of `'source'`, `'style'`.\n * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests.\n * @property {Object} [source] The [style spec representation of the source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) if the event has a `dataType` of `source`.\n * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals\n * that internal data has been received or changed. Possible values are `metadata` and `content`.\n * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and\n * the event is related to loading of a tile.\n * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and\n * the event is related to loading of a tile.\n */\n\n /**\n * Fired immediately after the map has been removed with [`Map#remove`](#Map#remove).\n *\n * @event remove\n * @memberof Map\n * @instance\n */\n\n /**\n * Fired immediately after the map has been resized.\n *\n * @event resize\n * @memberof Map\n * @instance\n */\n","'use strict';\n\nconst DOM = require('../util/dom');\nconst LngLat = require('../geo/lng_lat');\nconst Point = require('point-geometry');\n\n/**\n * Creates a marker component\n * @param {HTMLElement=} element DOM element to use as a marker (creates a div element by default)\n * @param {Object=} options\n * @param {PointLike=} options.offset The offset in pixels as a [`PointLike`](#PointLike) object to apply relative to the element's top left corner. Negatives indicate left and up.\n * @example\n * var marker = new mapboxgl.Marker()\n * .setLngLat([30.5, 50.5])\n * .addTo(map);\n * @see [Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/)\n */\nclass Marker {\n\n constructor(element, options) {\n this._offset = Point.convert(options && options.offset || [0, 0]);\n\n this._update = this._update.bind(this);\n this._onMapClick = this._onMapClick.bind(this);\n\n if (!element) element = DOM.create('div');\n element.classList.add('mapboxgl-marker');\n this._element = element;\n\n this._popup = null;\n }\n\n /**\n * Attaches the marker to a map\n * @param {Map} map\n * @returns {Marker} `this`\n */\n addTo(map) {\n this.remove();\n this._map = map;\n map.getCanvasContainer().appendChild(this._element);\n map.on('move', this._update);\n map.on('moveend', this._update);\n this._update();\n\n // If we attached the `click` listener to the marker element, the popup\n // would close once the event propogated to `map` due to the\n // `Popup#_onClickClose` listener.\n this._map.on('click', this._onMapClick);\n\n return this;\n }\n\n /**\n * Removes the marker from a map\n * @example\n * var marker = new mapboxgl.Marker().addTo(map);\n * marker.remove();\n * @returns {Marker} `this`\n */\n remove() {\n if (this._map) {\n this._map.off('click', this._onMapClick);\n this._map.off('move', this._update);\n this._map.off('moveend', this._update);\n this._map = null;\n }\n DOM.remove(this._element);\n if (this._popup) this._popup.remove();\n return this;\n }\n\n /**\n * Get the marker's geographical location\n * @returns {LngLat}\n */\n getLngLat() {\n return this._lngLat;\n }\n\n /**\n * Set the marker's geographical position and move it.\n * @param {LngLat} lnglat\n * @returns {Marker} `this`\n */\n setLngLat(lnglat) {\n this._lngLat = LngLat.convert(lnglat);\n if (this._popup) this._popup.setLngLat(this._lngLat);\n this._update();\n return this;\n }\n\n getElement() {\n return this._element;\n }\n\n /**\n * Binds a Popup to the Marker\n * @param {Popup=} popup an instance of the `Popup` class. If undefined or null, any popup\n * set on this `Marker` instance is unset\n * @returns {Marker} `this`\n */\n\n setPopup(popup) {\n if (this._popup) {\n this._popup.remove();\n this._popup = null;\n }\n\n if (popup) {\n this._popup = popup;\n this._popup.setLngLat(this._lngLat);\n }\n\n return this;\n }\n\n _onMapClick(event) {\n const targetElement = event.originalEvent.target;\n const element = this._element;\n\n if (this._popup && (targetElement === element || element.contains(targetElement))) {\n this.togglePopup();\n }\n }\n\n /**\n * Returns the Popup instance that is bound to the Marker\n * @returns {Popup} popup\n */\n getPopup() {\n return this._popup;\n }\n\n /**\n * Opens or closes the bound popup, depending on the current state\n * @returns {Marker} `this`\n */\n togglePopup() {\n const popup = this._popup;\n\n if (!popup) return;\n else if (popup.isOpen()) popup.remove();\n else popup.addTo(this._map);\n }\n\n _update(e) {\n if (!this._map) return;\n let pos = this._map.project(this._lngLat)._add(this._offset);\n // because rouding the coordinates at every `move` event causes stuttered zooming\n // we only round them when _update is called with `moveend` or when its called with\n // no arguments (when the Marker is initialized or Marker#setLngLat is invoked).\n if (!e || e.type === \"moveend\") pos = pos.round();\n DOM.setTransform(this._element, `translate(${pos.x}px, ${pos.y}px)`);\n }\n}\n\nmodule.exports = Marker;\n","'use strict';\n\nconst util = require('../util/util');\nconst Evented = require('../util/evented');\nconst DOM = require('../util/dom');\nconst LngLat = require('../geo/lng_lat');\nconst Point = require('point-geometry');\nconst window = require('../util/window');\n\nconst defaultOptions = {\n closeButton: true,\n closeOnClick: true\n};\n\n/**\n * A popup component.\n *\n * @param {Object} [options]\n * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the\n * top right corner of the popup.\n * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the\n * map is clicked.\n * @param {string} [options.anchor] - A string indicating the popup's location relative to\n * the coordinate set via [Popup#setLngLat](#Popup#setLngLat).\n * Options are `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`,\n * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be\n * dynamically set to ensure the popup falls within the map container with a preference\n * for `'bottom'`.\n * @param {number|PointLike|Object} [options.offset] -\n * A pixel offset applied to the popup's location specified as:\n * - a single number specifying a distance from the popup's location\n * - a [`PointLike`](#PointLike) specifying a constant offset\n * - an object of [`PointLike`](#PointLike)s specifing an offset for each anchor position\n * Negative offsets indicate left and up.\n * @example\n * var markerHeight = 50, markerRadius = 10, linearOffset = 25;\n * var popupOffsets = {\n * 'top': [0, 0],\n * 'top-left': [0,0],\n * 'top-right': [0,0],\n * 'bottom': [0, -markerHeight],\n * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1],\n * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1],\n * 'left': [markerRadius, (markerHeight - markerRadius) * -1],\n * 'right': [-markerRadius, (markerHeight - markerRadius) * -1]\n * };\n * var popup = new mapboxgl.Popup({offset:popupOffsets})\n * .setLngLat(e.lngLat)\n * .setHTML(\"

Hello World!

\")\n * .addTo(map);\n * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/)\n * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/)\n * @see [Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/)\n */\nclass Popup extends Evented {\n constructor(options) {\n super();\n this.options = util.extend(Object.create(defaultOptions), options);\n util.bindAll([\n '_update',\n '_onClickClose'],\n this);\n }\n\n /**\n * Adds the popup to a map.\n *\n * @param {Map} map The Mapbox GL JS map to add the popup to.\n * @returns {Popup} `this`\n */\n addTo(map) {\n this._map = map;\n this._map.on('move', this._update);\n if (this.options.closeOnClick) {\n this._map.on('click', this._onClickClose);\n }\n this._update();\n return this;\n }\n\n /**\n * @returns {boolean} `true` if the popup is open, `false` if it is closed.\n */\n isOpen() {\n return !!this._map;\n }\n\n /**\n * Removes the popup from the map it has been added to.\n *\n * @example\n * var popup = new mapboxgl.Popup().addTo(map);\n * popup.remove();\n * @returns {Popup} `this`\n */\n remove() {\n if (this._content && this._content.parentNode) {\n this._content.parentNode.removeChild(this._content);\n }\n\n if (this._container) {\n this._container.parentNode.removeChild(this._container);\n delete this._container;\n }\n\n if (this._map) {\n this._map.off('move', this._update);\n this._map.off('click', this._onClickClose);\n delete this._map;\n }\n\n /**\n * Fired when the popup is closed manually or programatically.\n *\n * @event close\n * @memberof Popup\n * @instance\n * @type {Object}\n * @property {Popup} popup object that was closed\n */\n this.fire('close');\n\n return this;\n }\n\n /**\n * Returns the geographical location of the popup's anchor.\n *\n * @returns {LngLat} The geographical location of the popup's anchor.\n */\n getLngLat() {\n return this._lngLat;\n }\n\n /**\n * Sets the geographical location of the popup's anchor, and moves the popup to it.\n *\n * @param {LngLatLike} lnglat The geographical location to set as the popup's anchor.\n * @returns {Popup} `this`\n */\n setLngLat(lnglat) {\n this._lngLat = LngLat.convert(lnglat);\n this._update();\n return this;\n }\n\n /**\n * Sets the popup's content to a string of text.\n *\n * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM,\n * so it cannot insert raw HTML. Use this method for security against XSS\n * if the popup content is user-provided.\n *\n * @param {string} text Textual content for the popup.\n * @returns {Popup} `this`\n * @example\n * var popup = new mapboxgl.Popup()\n * .setLngLat(e.lngLat)\n * .setText('Hello, world!')\n * .addTo(map);\n */\n setText(text) {\n return this.setDOMContent(window.document.createTextNode(text));\n }\n\n /**\n * Sets the popup's content to the HTML provided as a string.\n *\n * This method does not perform HTML filtering or sanitization, and must be\n * used only with trusted content. Consider [`setText`](#Popup#setText) if\n * the content is an untrusted text string.\n *\n * @param {string} html A string representing HTML content for the popup.\n * @returns {Popup} `this`\n */\n setHTML(html) {\n const frag = window.document.createDocumentFragment();\n const temp = window.document.createElement('body');\n let child;\n temp.innerHTML = html;\n while (true) {\n child = temp.firstChild;\n if (!child) break;\n frag.appendChild(child);\n }\n\n return this.setDOMContent(frag);\n }\n\n /**\n * Sets the popup's content to the element provided as a DOM node.\n *\n * @param {Node} htmlNode A DOM node to be used as content for the popup.\n * @returns {Popup} `this`\n * @example\n * // create an element with the popup content\n * var div = window.document.createElement('div');\n * div.innerHTML = 'Hello, world!';\n * var popup = new mapboxgl.Popup()\n * .setLngLat(e.lngLat)\n * .setDOMContent(div)\n * .addTo(map);\n */\n setDOMContent(htmlNode) {\n this._createContent();\n this._content.appendChild(htmlNode);\n this._update();\n return this;\n }\n\n _createContent() {\n if (this._content && this._content.parentNode) {\n this._content.parentNode.removeChild(this._content);\n }\n\n this._content = DOM.create('div', 'mapboxgl-popup-content', this._container);\n\n if (this.options.closeButton) {\n this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content);\n this._closeButton.type = 'button';\n this._closeButton.innerHTML = '×';\n this._closeButton.addEventListener('click', this._onClickClose);\n }\n }\n\n _update() {\n if (!this._map || !this._lngLat || !this._content) { return; }\n\n if (!this._container) {\n this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer());\n this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container);\n this._container.appendChild(this._content);\n }\n\n let anchor = this.options.anchor;\n const offset = normalizeOffset(this.options.offset);\n const pos = this._map.project(this._lngLat).round();\n\n if (!anchor) {\n const width = this._container.offsetWidth,\n height = this._container.offsetHeight;\n\n if (pos.y + offset.bottom.y < height) {\n anchor = ['top'];\n } else if (pos.y > this._map.transform.height - height) {\n anchor = ['bottom'];\n } else {\n anchor = [];\n }\n\n if (pos.x < width / 2) {\n anchor.push('left');\n } else if (pos.x > this._map.transform.width - width / 2) {\n anchor.push('right');\n }\n\n if (anchor.length === 0) {\n anchor = 'bottom';\n } else {\n anchor = anchor.join('-');\n }\n }\n\n const offsetedPos = pos.add(offset[anchor]);\n\n const anchorTranslate = {\n 'top': 'translate(-50%,0)',\n 'top-left': 'translate(0,0)',\n 'top-right': 'translate(-100%,0)',\n 'bottom': 'translate(-50%,-100%)',\n 'bottom-left': 'translate(0,-100%)',\n 'bottom-right': 'translate(-100%,-100%)',\n 'left': 'translate(0,-50%)',\n 'right': 'translate(-100%,-50%)'\n };\n\n const classList = this._container.classList;\n for (const key in anchorTranslate) {\n classList.remove(`mapboxgl-popup-anchor-${key}`);\n }\n classList.add(`mapboxgl-popup-anchor-${anchor}`);\n\n DOM.setTransform(this._container, `${anchorTranslate[anchor]} translate(${offsetedPos.x}px,${offsetedPos.y}px)`);\n }\n\n _onClickClose() {\n this.remove();\n }\n}\n\nfunction normalizeOffset(offset) {\n\n if (!offset) {\n return normalizeOffset(new Point(0, 0));\n\n } else if (typeof offset === 'number') {\n // input specifies a radius from which to calculate offsets at all positions\n const cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2)));\n return {\n 'top': new Point(0, offset),\n 'top-left': new Point(cornerOffset, cornerOffset),\n 'top-right': new Point(-cornerOffset, cornerOffset),\n 'bottom': new Point(0, -offset),\n 'bottom-left': new Point(cornerOffset, -cornerOffset),\n 'bottom-right': new Point(-cornerOffset, -cornerOffset),\n 'left': new Point(offset, 0),\n 'right': new Point(-offset, 0)\n };\n\n } else if (isPointLike(offset)) {\n // input specifies a single offset to be applied to all positions\n const convertedOffset = Point.convert(offset);\n return {\n 'top': convertedOffset,\n 'top-left': convertedOffset,\n 'top-right': convertedOffset,\n 'bottom': convertedOffset,\n 'bottom-left': convertedOffset,\n 'bottom-right': convertedOffset,\n 'left': convertedOffset,\n 'right': convertedOffset\n };\n\n } else {\n // input specifies an offset per position\n return {\n 'top': Point.convert(offset['top'] || [0, 0]),\n 'top-left': Point.convert(offset['top-left'] || [0, 0]),\n 'top-right': Point.convert(offset['top-right'] || [0, 0]),\n 'bottom': Point.convert(offset['bottom'] || [0, 0]),\n 'bottom-left': Point.convert(offset['bottom-left'] || [0, 0]),\n 'bottom-right': Point.convert(offset['bottom-right'] || [0, 0]),\n 'left': Point.convert(offset['left'] || [0, 0]),\n 'right': Point.convert(offset['right'] || [0, 0])\n };\n }\n}\n\nfunction isPointLike(input) {\n return input instanceof Point || Array.isArray(input);\n}\n\nmodule.exports = Popup;\n","'use strict';\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @param {string|number} mapId A unique identifier for the Map instance using this Actor.\n * @private\n */\nclass Actor {\n constructor(target, parent, mapId) {\n this.target = target;\n this.parent = parent;\n this.mapId = mapId;\n this.callbacks = {};\n this.callbackID = 0;\n this.receive = this.receive.bind(this);\n this.target.addEventListener('message', this.receive, false);\n }\n\n /**\n * Sends a message from a main-thread map to a Worker or from a Worker back to\n * a main-thread map instance.\n *\n * @param {string} type The name of the target method to invoke or '[source-type].name' for a method on a WorkerSource.\n * @param {Object} data\n * @param {Function} [callback]\n * @param {Array} [buffers] A list of buffers to \"transfer\" (see https://developer.mozilla.org/en-US/docs/Web/API/Transferable)\n * @param {string} [targetMapId] A particular mapId to which to send this message.\n * @private\n */\n send(type, data, callback, buffers, targetMapId) {\n const id = callback ? `${this.mapId}:${this.callbackID++}` : null;\n if (callback) this.callbacks[id] = callback;\n this.target.postMessage({\n targetMapId: targetMapId,\n sourceMapId: this.mapId,\n type: type,\n id: String(id),\n data: data\n }, buffers);\n }\n\n receive(message) {\n const data = message.data,\n id = data.id;\n let callback;\n\n if (data.targetMapId && this.mapId !== data.targetMapId)\n return;\n\n const done = (err, data, buffers) => {\n this.target.postMessage({\n sourceMapId: this.mapId,\n type: '',\n id: String(id),\n error: err ? String(err) : null,\n data: data\n }, buffers);\n };\n\n if (data.type === '') {\n callback = this.callbacks[data.id];\n delete this.callbacks[data.id];\n if (callback) callback(data.error || null, data.data);\n } else if (typeof data.id !== 'undefined' && this.parent[data.type]) {\n // data.type == 'loadTile', 'removeTile', etc.\n this.parent[data.type](data.sourceMapId, data.data, done);\n } else if (typeof data.id !== 'undefined' && this.parent.getWorkerSource) {\n // data.type == sourcetype.method\n const keys = data.type.split('.');\n const workerSource = this.parent.getWorkerSource(data.sourceMapId, keys[0]);\n workerSource[keys[1]](data.data, done);\n } else {\n this.parent[data.type](data.data);\n }\n }\n\n remove() {\n this.target.removeEventListener('message', this.receive, false);\n }\n}\n\nmodule.exports = Actor;\n","'use strict';\n\nconst window = require('./window');\n\nexports.getJSON = function(url, callback) {\n const xhr = new window.XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.onerror = function(e) {\n callback(e);\n };\n xhr.onload = function() {\n if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n let data;\n try {\n data = JSON.parse(xhr.response);\n } catch (err) {\n return callback(err);\n }\n callback(null, data);\n } else {\n callback(new Error(xhr.statusText));\n }\n };\n xhr.send();\n return xhr;\n};\n\nexports.getArrayBuffer = function(url, callback) {\n const xhr = new window.XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onerror = function(e) {\n callback(e);\n };\n xhr.onload = function() {\n if (xhr.response.byteLength === 0 && xhr.status === 200) {\n return callback(new Error('http status 200 returned without content.'));\n }\n if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n callback(null, {\n data: xhr.response,\n cacheControl: xhr.getResponseHeader('Cache-Control'),\n expires: xhr.getResponseHeader('Expires')\n });\n } else {\n callback(new Error(xhr.statusText));\n }\n };\n xhr.send();\n return xhr;\n};\n\nfunction sameOrigin(url) {\n const a = window.document.createElement('a');\n a.href = url;\n return a.protocol === window.document.location.protocol && a.host === window.document.location.host;\n}\n\nconst transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=';\n\nexports.getImage = function(url, callback) {\n // request the image with XHR to work around caching issues\n // see https://github.com/mapbox/mapbox-gl-js/issues/1470\n return exports.getArrayBuffer(url, (err, imgData) => {\n if (err) return callback(err);\n const img = new window.Image();\n const URL = window.URL || window.webkitURL;\n img.onload = () => {\n callback(null, img);\n URL.revokeObjectURL(img.src);\n };\n const blob = new window.Blob([new Uint8Array(imgData.data)], { type: 'image/png' });\n img.cacheControl = imgData.cacheControl;\n img.expires = imgData.expires;\n img.src = imgData.data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl;\n });\n};\n\nexports.getVideo = function(urls, callback) {\n const video = window.document.createElement('video');\n video.onloadstart = function() {\n callback(null, video);\n };\n for (let i = 0; i < urls.length; i++) {\n const s = window.document.createElement('source');\n if (!sameOrigin(urls[i])) {\n video.crossOrigin = 'Anonymous';\n }\n s.src = urls[i];\n video.appendChild(s);\n }\n return video;\n};\n","'use strict';\n\n/**\n * @module browser\n * @private\n */\n\nconst window = require('./window');\n\n/**\n * Provides a function that outputs milliseconds: either performance.now()\n * or a fallback to Date.now()\n */\nmodule.exports.now = (function() {\n if (window.performance &&\n window.performance.now) {\n return window.performance.now.bind(window.performance);\n } else {\n return Date.now.bind(Date);\n }\n}());\n\nconst frame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.msRequestAnimationFrame;\n\nexports.frame = function(fn) {\n return frame(fn);\n};\n\nconst cancel = window.cancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n window.webkitCancelAnimationFrame ||\n window.msCancelAnimationFrame;\n\nexports.cancelFrame = function(id) {\n cancel(id);\n};\n\nexports.timed = function (fn, dur, ctx) {\n if (!dur) {\n fn.call(ctx, 1);\n return null;\n }\n\n let abort = false;\n const start = module.exports.now();\n\n function tick(now) {\n if (abort) return;\n now = module.exports.now();\n\n if (now >= start + dur) {\n fn.call(ctx, 1);\n } else {\n fn.call(ctx, (now - start) / dur);\n exports.frame(tick);\n }\n }\n\n exports.frame(tick);\n\n return function() { abort = true; };\n};\n\nexports.getImageData = function (img) {\n const canvas = window.document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0);\n return context.getImageData(0, 0, img.width, img.height).data;\n};\n\n/**\n * Test if the current browser supports Mapbox GL JS\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false`\n * if the performance of Mapbox GL JS would be dramatically worse than\n * expected (i.e. a software renderer would be used)\n * @return {boolean}\n */\nexports.supported = require('mapbox-gl-supported');\n\nexports.hardwareConcurrency = window.navigator.hardwareConcurrency || 4;\n\nObject.defineProperty(exports, 'devicePixelRatio', {\n get: function() { return window.devicePixelRatio; }\n});\n\nexports.supportsWebp = false;\n\nconst webpImgTest = window.document.createElement('img');\nwebpImgTest.onload = function() {\n exports.supportsWebp = true;\n};\nwebpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=';\n","'use strict';\n\nconst WebWorkify = require('webworkify');\nconst window = require('../window');\nconst workerURL = window.URL.createObjectURL(new WebWorkify(require('../../source/worker'), {bare: true}));\n\nmodule.exports = function () {\n return new window.Worker(workerURL);\n};\n","'use strict';\n\n/* eslint-env browser */\nmodule.exports = self;\n","'use strict';\n\nconst quickselect = require('quickselect');\nconst calculateSignedArea = require('./util').calculateSignedArea;\n\n// classifies an array of rings into polygons with outer rings and holes\nmodule.exports = function classifyRings(rings, maxRings) {\n const len = rings.length;\n\n if (len <= 1) return [rings];\n\n const polygons = [];\n let polygon,\n ccw;\n\n for (let i = 0; i < len; i++) {\n const area = calculateSignedArea(rings[i]);\n if (area === 0) continue;\n\n rings[i].area = Math.abs(area);\n\n if (ccw === undefined) ccw = area < 0;\n\n if (ccw === area < 0) {\n if (polygon) polygons.push(polygon);\n polygon = [rings[i]];\n\n } else {\n polygon.push(rings[i]);\n }\n }\n if (polygon) polygons.push(polygon);\n\n // Earcut performance degrages with the # of rings in a polygon. For this\n // reason, we limit strip out all but the `maxRings` largest rings.\n if (maxRings > 1) {\n for (let j = 0; j < polygons.length; j++) {\n if (polygons[j].length <= maxRings) continue;\n quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas);\n polygons[j] = polygons[j].slice(0, maxRings);\n }\n }\n\n return polygons;\n};\n\nfunction compareAreas(a, b) {\n return b.area - a.area;\n}\n","'use strict';\n// \n\n \n \n \n \n \n\nconst config = {\n API_URL: 'https://api.mapbox.com',\n REQUIRE_ACCESS_TOKEN: true,\n ACCESS_TOKEN: null\n};\n\nmodule.exports = config;\n","'use strict';\n\nconst assert = require('assert');\n\nclass DictionaryCoder {\n\n constructor(strings) {\n this._stringToNumber = {};\n this._numberToString = [];\n for (let i = 0; i < strings.length; i++) {\n const string = strings[i];\n this._stringToNumber[string] = i;\n this._numberToString[i] = string;\n }\n }\n\n encode(string) {\n assert(string in this._stringToNumber);\n return this._stringToNumber[string];\n }\n\n decode(n) {\n assert(n < this._numberToString.length);\n return this._numberToString[n];\n }\n}\n\nmodule.exports = DictionaryCoder;\n","'use strict';\n\nconst util = require('./util');\nconst Actor = require('./actor');\n\n/**\n * Responsible for sending messages from a {@link Source} to an associated\n * {@link WorkerSource}.\n *\n * @interface Dispatcher\n * @private\n */\nclass Dispatcher {\n\n constructor(workerPool, parent) {\n this.workerPool = workerPool;\n this.actors = [];\n this.currentActor = 0;\n this.id = util.uniqueId();\n const workers = this.workerPool.acquire(this.id);\n for (let i = 0; i < workers.length; i++) {\n const worker = workers[i];\n const actor = new Actor(worker, parent, this.id);\n actor.name = `Worker ${i}`;\n this.actors.push(actor);\n }\n }\n\n /**\n * Broadcast a message to all Workers.\n * @method\n * @name broadcast\n * @param {string} type\n * @param {Object} data\n * @param {Function} callback\n * @memberof Dispatcher\n * @instance\n */\n broadcast(type, data, cb) {\n cb = cb || function () {};\n util.asyncAll(this.actors, (actor, done) => {\n actor.send(type, data, done);\n }, cb);\n }\n\n /**\n * Send a message to a Worker.\n * @method\n * @name send\n * @param {string} type\n * @param {Object} data\n * @param {Function} callback\n * @param {number|undefined} [targetID] The ID of the Worker to which to send this message. Omit to allow the dispatcher to choose.\n * @returns {number} The ID of the worker to which the message was sent.\n * @memberof Dispatcher\n * @instance\n */\n send(type, data, callback, targetID, buffers) {\n if (typeof targetID !== 'number' || isNaN(targetID)) {\n // Use round robin to send requests to web workers.\n targetID = this.currentActor = (this.currentActor + 1) % this.actors.length;\n }\n\n this.actors[targetID].send(type, data, callback, buffers);\n return targetID;\n }\n\n remove() {\n this.actors.forEach((actor) => { actor.remove(); });\n this.actors = [];\n this.workerPool.release(this.id);\n }\n}\n\nmodule.exports = Dispatcher;\n","'use strict';\n\nconst Point = require('point-geometry');\nconst window = require('./window');\n\nexports.create = function (tagName, className, container) {\n const el = window.document.createElement(tagName);\n if (className) el.className = className;\n if (container) container.appendChild(el);\n return el;\n};\n\nconst docStyle = window.document.documentElement.style;\n\nfunction testProp(props) {\n for (let i = 0; i < props.length; i++) {\n if (props[i] in docStyle) {\n return props[i];\n }\n }\n return props[0];\n}\n\nconst selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']);\nlet userSelect;\nexports.disableDrag = function () {\n if (selectProp) {\n userSelect = docStyle[selectProp];\n docStyle[selectProp] = 'none';\n }\n};\nexports.enableDrag = function () {\n if (selectProp) {\n docStyle[selectProp] = userSelect;\n }\n};\n\nconst transformProp = testProp(['transform', 'WebkitTransform']);\nexports.setTransform = function(el, value) {\n el.style[transformProp] = value;\n};\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClick(e) {\n e.preventDefault();\n e.stopPropagation();\n window.removeEventListener('click', suppressClick, true);\n}\nexports.suppressClick = function() {\n window.addEventListener('click', suppressClick, true);\n window.setTimeout(() => {\n window.removeEventListener('click', suppressClick, true);\n }, 0);\n};\n\nexports.mousePos = function (el, e) {\n const rect = el.getBoundingClientRect();\n e = e.touches ? e.touches[0] : e;\n return new Point(\n e.clientX - rect.left - el.clientLeft,\n e.clientY - rect.top - el.clientTop\n );\n};\n\nexports.touchPos = function (el, e) {\n const rect = el.getBoundingClientRect(),\n points = [];\n const touches = (e.type === 'touchend') ? e.changedTouches : e.touches;\n for (let i = 0; i < touches.length; i++) {\n points.push(new Point(\n touches[i].clientX - rect.left - el.clientLeft,\n touches[i].clientY - rect.top - el.clientTop\n ));\n }\n return points;\n};\n\nexports.remove = function(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n};\n","'use strict';\n\nconst util = require('./util');\n\nfunction _addEventListener(type, listener, listenerList) {\n listenerList[type] = listenerList[type] || [];\n listenerList[type].push(listener);\n}\n\nfunction _removeEventListener(type, listener, listenerList) {\n if (listenerList && listenerList[type]) {\n const index = listenerList[type].indexOf(listener);\n if (index !== -1) {\n listenerList[type].splice(index, 1);\n }\n }\n}\n\n/**\n * Methods mixed in to other classes for event capabilities.\n *\n * @mixin Evented\n */\nclass Evented {\n\n /**\n * Adds a listener to a specified event type.\n *\n * @param {string} type The event type to add a listen for.\n * @param {Function} listener The function to be called when the event is fired.\n * The listener function is called with the data object passed to `fire`,\n * extended with `target` and `type` properties.\n * @returns {Object} `this`\n */\n on(type, listener) {\n this._listeners = this._listeners || {};\n _addEventListener(type, listener, this._listeners);\n\n return this;\n }\n\n /**\n * Removes a previously registered event listener.\n *\n * @param {string} type The event type to remove listeners for.\n * @param {Function} listener The listener function to remove.\n * @returns {Object} `this`\n */\n off(type, listener) {\n _removeEventListener(type, listener, this._listeners);\n _removeEventListener(type, listener, this._oneTimeListeners);\n\n return this;\n }\n\n /**\n * Adds a listener that will be called only once to a specified event type.\n *\n * The listener will be called first time the event fires after the listener is registered.\n *\n * @param {string} type The event type to listen for.\n * @param {Function} listener The function to be called when the event is fired the first time.\n * @returns {Object} `this`\n */\n once(type, listener) {\n this._oneTimeListeners = this._oneTimeListeners || {};\n _addEventListener(type, listener, this._oneTimeListeners);\n\n return this;\n }\n\n /**\n * Fires an event of the specified type.\n *\n * @param {string} type The type of event to fire.\n * @param {Object} [data] Data to be passed to any listeners.\n * @returns {Object} `this`\n */\n fire(type, data) {\n if (this.listens(type)) {\n data = util.extend({}, data, {type: type, target: this});\n\n // make sure adding or removing listeners inside other listeners won't cause an infinite loop\n const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : [];\n\n for (let i = 0; i < listeners.length; i++) {\n listeners[i].call(this, data);\n }\n\n const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : [];\n\n for (let i = 0; i < oneTimeListeners.length; i++) {\n oneTimeListeners[i].call(this, data);\n _removeEventListener(type, oneTimeListeners[i], this._oneTimeListeners);\n }\n\n if (this._eventedParent) {\n this._eventedParent.fire(type, util.extend({}, data, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData));\n }\n\n // To ensure that no error events are dropped, print them to the\n // console if they have no listeners.\n } else if (util.endsWith(type, 'error')) {\n console.error((data && data.error) || data || 'Empty error event');\n }\n\n return this;\n }\n\n /**\n * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type.\n *\n * @param {string} type The event type\n * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise\n */\n listens(type) {\n return (\n (this._listeners && this._listeners[type] && this._listeners[type].length > 0) ||\n (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) ||\n (this._eventedParent && this._eventedParent.listens(type))\n );\n }\n\n /**\n * Bubble all events fired by this instance of Evented to this parent instance of Evented.\n *\n * @private\n * @param {parent}\n * @param {data}\n * @returns {Object} `this`\n */\n setEventedParent(parent, data) {\n this._eventedParent = parent;\n this._eventedParentData = data;\n\n return this;\n }\n}\n\nmodule.exports = Evented;\n","'use strict';\nconst Queue = require('tinyqueue');\nconst Point = require('point-geometry');\nconst distToSegmentSquared = require('./intersection_tests').distToSegmentSquared;\n\n/**\n * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility\n * This is a copy of http://github.com/mapbox/polylabel adapted to use Points\n *\n * @param {Array>} List of polygon rings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings\n * @param {number} [precision=1] Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision\n * @param {bool} [debug=false] Print some statistics to the console during execution\n *\n * @returns {Point} Pole of Inaccessibiliy.\n * @private\n */\nmodule.exports = function (polygonRings, precision, debug) {\n precision = precision || 1.0;\n\n // find the bounding box of the outer ring\n let minX, minY, maxX, maxY;\n const outerRing = polygonRings[0];\n for (let i = 0; i < outerRing.length; i++) {\n const p = outerRing[i];\n if (!i || p.x < minX) minX = p.x;\n if (!i || p.y < minY) minY = p.y;\n if (!i || p.x > maxX) maxX = p.x;\n if (!i || p.y > maxY) maxY = p.y;\n }\n\n const width = maxX - minX;\n const height = maxY - minY;\n const cellSize = Math.min(width, height);\n let h = cellSize / 2;\n\n // a priority queue of cells in order of their \"potential\" (max distance to polygon)\n const cellQueue = new Queue(null, compareMax);\n\n if (cellSize === 0) return [minX, minY];\n\n // cover polygon with initial cells\n for (let x = minX; x < maxX; x += cellSize) {\n for (let y = minY; y < maxY; y += cellSize) {\n cellQueue.push(new Cell(x + h, y + h, h, polygonRings));\n }\n }\n\n // take centroid as the first best guess\n let bestCell = getCentroidCell(polygonRings);\n let numProbes = cellQueue.length;\n\n while (cellQueue.length) {\n // pick the most promising cell from the queue\n const cell = cellQueue.pop();\n\n // update the best cell if we found a better one\n if (cell.d > bestCell.d || !bestCell.d) {\n bestCell = cell;\n if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);\n }\n\n // do not drill down further if there's no chance of a better solution\n if (cell.max - bestCell.d <= precision) continue;\n\n // split the cell into four cells\n h = cell.h / 2;\n cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings));\n cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings));\n cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings));\n cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings));\n numProbes += 4;\n }\n\n if (debug) {\n console.log(`num probes: ${numProbes}`);\n console.log(`best distance: ${bestCell.d}`);\n }\n\n return bestCell.p;\n};\n\nfunction compareMax(a, b) {\n return b.max - a.max;\n}\n\nfunction Cell(x, y, h, polygon) {\n this.p = new Point(x, y);\n this.h = h; // half the cell size\n this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon\n this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell\n}\n\n// signed distance from point to polygon outline (negative if point is outside)\nfunction pointToPolygonDist(p, polygon) {\n let inside = false;\n let minDistSq = Infinity;\n\n for (let k = 0; k < polygon.length; k++) {\n const ring = polygon[k];\n\n for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) {\n const a = ring[i];\n const b = ring[j];\n\n if ((a.y > p.y !== b.y > p.y) &&\n (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) inside = !inside;\n\n minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b));\n }\n }\n\n return (inside ? 1 : -1) * Math.sqrt(minDistSq);\n}\n\n// get polygon centroid\nfunction getCentroidCell(polygon) {\n let area = 0;\n let x = 0;\n let y = 0;\n const points = polygon[0];\n for (let i = 0, len = points.length, j = len - 1; i < len; j = i++) {\n const a = points[i];\n const b = points[j];\n const f = a.x * b.y - b.x * a.y;\n x += (a.x + b.x) * f;\n y += (a.y + b.y) * f;\n area += f * 3;\n }\n return new Cell(x / area, y / area, 0, polygon);\n}\n","'use strict';\nconst WorkerPool = require('./worker_pool');\n\nlet globalWorkerPool;\n\n/**\n * Creates (if necessary) and returns the single, global WorkerPool instance\n * to be shared across each Map\n * @private\n */\nmodule.exports = function getGlobalWorkerPool () {\n if (!globalWorkerPool) {\n globalWorkerPool = new WorkerPool();\n }\n return globalWorkerPool;\n};\n","'use strict';\n\nmodule.exports = Glyphs;\n\nfunction Glyphs(pbf, end) {\n this.stacks = pbf.readFields(readFontstacks, [], end);\n}\n\nfunction readFontstacks(tag, stacks, pbf) {\n if (tag === 1) {\n const fontstack = pbf.readMessage(readFontstack, {glyphs: {}});\n stacks.push(fontstack);\n }\n}\n\nfunction readFontstack(tag, fontstack, pbf) {\n if (tag === 1) fontstack.name = pbf.readString();\n else if (tag === 2) fontstack.range = pbf.readString();\n else if (tag === 3) {\n const glyph = pbf.readMessage(readGlyph, {});\n fontstack.glyphs[glyph.id] = glyph;\n }\n}\n\nfunction readGlyph(tag, glyph, pbf) {\n if (tag === 1) glyph.id = pbf.readVarint();\n else if (tag === 2) glyph.bitmap = pbf.readBytes();\n else if (tag === 3) glyph.width = pbf.readVarint();\n else if (tag === 4) glyph.height = pbf.readVarint();\n else if (tag === 5) glyph.left = pbf.readSVarint();\n else if (tag === 6) glyph.top = pbf.readSVarint();\n else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n","'use strict';\n\nmodule.exports = interpolate;\n\nfunction interpolate(a, b, t) {\n return (a * (1 - t)) + (b * t);\n}\n\ninterpolate.number = interpolate;\n\ninterpolate.vec2 = function(from, to, t) {\n return [\n interpolate(from[0], to[0], t),\n interpolate(from[1], to[1], t)\n ];\n};\n\n/*\n * Interpolate between two colors given as 4-element arrays.\n *\n * @param {Color} from\n * @param {Color} to\n * @param {number} t interpolation factor between 0 and 1\n * @returns {Color} interpolated color\n */\ninterpolate.color = function(from, to, t) {\n return [\n interpolate(from[0], to[0], t),\n interpolate(from[1], to[1], t),\n interpolate(from[2], to[2], t),\n interpolate(from[3], to[3], t)\n ];\n};\n\ninterpolate.array = function(from, to, t) {\n return from.map((d, i) => {\n return interpolate(d, to[i], t);\n });\n};\n","'use strict';\n\nconst isCounterClockwise = require('./util').isCounterClockwise;\n\nmodule.exports = {\n multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint,\n multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon,\n multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine,\n polygonIntersectsPolygon: polygonIntersectsPolygon,\n distToSegmentSquared: distToSegmentSquared\n};\n\nfunction polygonIntersectsPolygon(polygonA, polygonB) {\n for (let i = 0; i < polygonA.length; i++) {\n if (polygonContainsPoint(polygonB, polygonA[i])) return true;\n }\n\n for (let i = 0; i < polygonB.length; i++) {\n if (polygonContainsPoint(polygonA, polygonB[i])) return true;\n }\n\n if (lineIntersectsLine(polygonA, polygonB)) return true;\n\n return false;\n}\n\nfunction multiPolygonIntersectsBufferedMultiPoint(multiPolygon, rings, radius) {\n for (let j = 0; j < multiPolygon.length; j++) {\n const polygon = multiPolygon[j];\n for (let i = 0; i < rings.length; i++) {\n const ring = rings[i];\n for (let k = 0; k < ring.length; k++) {\n const point = ring[k];\n if (polygonContainsPoint(polygon, point)) return true;\n if (pointIntersectsBufferedLine(point, polygon, radius)) return true;\n }\n }\n }\n return false;\n}\n\nfunction multiPolygonIntersectsMultiPolygon(multiPolygonA, multiPolygonB) {\n\n if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) {\n return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]);\n }\n\n for (let m = 0; m < multiPolygonB.length; m++) {\n const ring = multiPolygonB[m];\n for (let n = 0; n < ring.length; n++) {\n if (multiPolygonContainsPoint(multiPolygonA, ring[n])) return true;\n }\n }\n\n for (let j = 0; j < multiPolygonA.length; j++) {\n const polygon = multiPolygonA[j];\n for (let i = 0; i < polygon.length; i++) {\n if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) return true;\n }\n\n for (let k = 0; k < multiPolygonB.length; k++) {\n if (lineIntersectsLine(polygon, multiPolygonB[k])) return true;\n }\n }\n\n return false;\n}\n\nfunction multiPolygonIntersectsBufferedMultiLine(multiPolygon, multiLine, radius) {\n for (let i = 0; i < multiLine.length; i++) {\n const line = multiLine[i];\n\n for (let j = 0; j < multiPolygon.length; j++) {\n const polygon = multiPolygon[j];\n\n if (polygon.length >= 3) {\n for (let k = 0; k < line.length; k++) {\n if (polygonContainsPoint(polygon, line[k])) return true;\n }\n }\n\n if (lineIntersectsBufferedLine(polygon, line, radius)) return true;\n }\n }\n return false;\n}\n\nfunction lineIntersectsBufferedLine(lineA, lineB, radius) {\n\n if (lineA.length > 1) {\n if (lineIntersectsLine(lineA, lineB)) return true;\n\n // Check whether any point in either line is within radius of the other line\n for (let j = 0; j < lineB.length; j++) {\n if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true;\n }\n }\n\n for (let k = 0; k < lineA.length; k++) {\n if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true;\n }\n\n return false;\n}\n\nfunction lineIntersectsLine(lineA, lineB) {\n if (lineA.length === 0 || lineB.length === 0) return false;\n for (let i = 0; i < lineA.length - 1; i++) {\n const a0 = lineA[i];\n const a1 = lineA[i + 1];\n for (let j = 0; j < lineB.length - 1; j++) {\n const b0 = lineB[j];\n const b1 = lineB[j + 1];\n if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true;\n }\n }\n return false;\n}\n\nfunction lineSegmentIntersectsLineSegment(a0, a1, b0, b1) {\n return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) &&\n isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1);\n}\n\nfunction pointIntersectsBufferedLine(p, line, radius) {\n const radiusSquared = radius * radius;\n\n if (line.length === 1) return p.distSqr(line[0]) < radiusSquared;\n\n for (let i = 1; i < line.length; i++) {\n // Find line segments that have a distance <= radius^2 to p\n // In that case, we treat the line as \"containing point p\".\n const v = line[i - 1], w = line[i];\n if (distToSegmentSquared(p, v, w) < radiusSquared) return true;\n }\n return false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p, v, w) {\n const l2 = v.distSqr(w);\n if (l2 === 0) return p.distSqr(v);\n const t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n if (t < 0) return p.distSqr(v);\n if (t > 1) return p.distSqr(w);\n return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\n// point in polygon ray casting algorithm\nfunction multiPolygonContainsPoint(rings, p) {\n let c = false,\n ring, p1, p2;\n\n for (let k = 0; k < rings.length; k++) {\n ring = rings[k];\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n c = !c;\n }\n }\n }\n return c;\n}\n\nfunction polygonContainsPoint(ring, p) {\n let c = false;\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const p1 = ring[i];\n const p2 = ring[j];\n if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n c = !c;\n }\n }\n return c;\n}\n","'use strict';\n// \n\n// The following table comes from .\n// Keep it synchronized with .\n\n \n\nconst unicodeBlockLookup = {\n // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F,\n 'Latin-1 Supplement': (char) => char >= 0x0080 && char <= 0x00FF,\n // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F,\n // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F,\n // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF,\n // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF,\n // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F,\n // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF,\n // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF,\n // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F,\n // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F,\n // 'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF,\n // 'Arabic': (char) => char >= 0x0600 && char <= 0x06FF,\n // 'Syriac': (char) => char >= 0x0700 && char <= 0x074F,\n // 'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F,\n // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF,\n // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF,\n // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F,\n // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F,\n // 'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF,\n // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F,\n // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF,\n // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F,\n // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF,\n // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F,\n // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF,\n // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F,\n // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF,\n // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F,\n // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF,\n // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F,\n // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF,\n // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF,\n // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F,\n // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF,\n 'Hangul Jamo': (char) => char >= 0x1100 && char <= 0x11FF,\n // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F,\n // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F,\n // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF,\n 'Unified Canadian Aboriginal Syllabics': (char) => char >= 0x1400 && char <= 0x167F,\n // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F,\n // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF,\n // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F,\n // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F,\n // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F,\n // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F,\n // 'Khmer': (char) => char >= 0x1780 && char <= 0x17FF,\n // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF,\n 'Unified Canadian Aboriginal Syllabics Extended': (char) => char >= 0x18B0 && char <= 0x18FF,\n // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F,\n // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F,\n // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF,\n // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF,\n // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F,\n // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF,\n // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF,\n // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F,\n // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF,\n // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF,\n // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F,\n // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F,\n // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F,\n // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF,\n // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF,\n // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F,\n // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF,\n // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF,\n // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF,\n // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF,\n 'General Punctuation': (char) => char >= 0x2000 && char <= 0x206F,\n // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F,\n // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF,\n // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF,\n 'Letterlike Symbols': (char) => char >= 0x2100 && char <= 0x214F,\n 'Number Forms': (char) => char >= 0x2150 && char <= 0x218F,\n // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF,\n // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF,\n 'Miscellaneous Technical': (char) => char >= 0x2300 && char <= 0x23FF,\n 'Control Pictures': (char) => char >= 0x2400 && char <= 0x243F,\n 'Optical Character Recognition': (char) => char >= 0x2440 && char <= 0x245F,\n 'Enclosed Alphanumerics': (char) => char >= 0x2460 && char <= 0x24FF,\n // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F,\n // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F,\n 'Geometric Shapes': (char) => char >= 0x25A0 && char <= 0x25FF,\n 'Miscellaneous Symbols': (char) => char >= 0x2600 && char <= 0x26FF,\n // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF,\n // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF,\n // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF,\n // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF,\n // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F,\n // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF,\n // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF,\n 'Miscellaneous Symbols and Arrows': (char) => char >= 0x2B00 && char <= 0x2BFF,\n // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F,\n // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F,\n // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF,\n // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F,\n // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F,\n // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF,\n // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF,\n // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F,\n 'CJK Radicals Supplement': (char) => char >= 0x2E80 && char <= 0x2EFF,\n 'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF,\n 'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF,\n 'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F,\n 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F,\n 'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF,\n 'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F,\n 'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F,\n 'Kanbun': (char) => char >= 0x3190 && char <= 0x319F,\n 'Bopomofo Extended': (char) => char >= 0x31A0 && char <= 0x31BF,\n 'CJK Strokes': (char) => char >= 0x31C0 && char <= 0x31EF,\n 'Katakana Phonetic Extensions': (char) => char >= 0x31F0 && char <= 0x31FF,\n 'Enclosed CJK Letters and Months': (char) => char >= 0x3200 && char <= 0x32FF,\n 'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF,\n 'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF,\n 'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF,\n 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF,\n 'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F,\n 'Yi Radicals': (char) => char >= 0xA490 && char <= 0xA4CF,\n // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF,\n // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F,\n // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F,\n // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF,\n // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F,\n // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF,\n // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F,\n // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F,\n // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F,\n // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF,\n // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF,\n // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F,\n // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F,\n 'Hangul Jamo Extended-A': (char) => char >= 0xA960 && char <= 0xA97F,\n // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF,\n // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF,\n // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F,\n // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F,\n // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF,\n // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF,\n // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F,\n // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F,\n // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF,\n // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF,\n 'Hangul Syllables': (char) => char >= 0xAC00 && char <= 0xD7AF,\n 'Hangul Jamo Extended-B': (char) => char >= 0xD7B0 && char <= 0xD7FF,\n // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F,\n // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF,\n // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF,\n 'Private Use Area': (char) => char >= 0xE000 && char <= 0xF8FF,\n 'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF,\n // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F,\n // 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF,\n // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F,\n 'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F,\n // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F,\n 'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F,\n 'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F,\n // 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF,\n 'Halfwidth and Fullwidth Forms': (char) => char >= 0xFF00 && char <= 0xFFEF\n // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF,\n // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F,\n // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF,\n // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F,\n // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F,\n // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF,\n // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF,\n // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F,\n // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF,\n // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF,\n // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F,\n // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F,\n // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F,\n // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F,\n // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF,\n // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F,\n // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F,\n // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF,\n // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF,\n // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F,\n // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F,\n // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F,\n // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F,\n // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F,\n // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F,\n // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF,\n // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF,\n // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F,\n // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F,\n // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F,\n // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF,\n // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F,\n // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F,\n // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F,\n // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF,\n // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F,\n // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F,\n // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F,\n // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF,\n // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F,\n // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF,\n // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F,\n // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F,\n // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF,\n // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF,\n // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F,\n // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F,\n // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF,\n // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF,\n // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F,\n // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF,\n // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF,\n // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F,\n // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F,\n // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF,\n // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF,\n // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F,\n // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F,\n // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF,\n // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F,\n // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF,\n // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF,\n // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F,\n // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF,\n // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF,\n // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F,\n // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F,\n // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F,\n // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F,\n // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F,\n // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F,\n // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF,\n // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F,\n // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F,\n // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF,\n // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF,\n // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF,\n // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF,\n // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F,\n // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF,\n // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF,\n // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF,\n // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F,\n // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F,\n // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F,\n // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF,\n // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF,\n // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F,\n // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF,\n // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F,\n // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF,\n // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F,\n // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F,\n // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF,\n // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF,\n // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF,\n // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF,\n // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F,\n // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F,\n // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF,\n // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F,\n // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF,\n // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF,\n // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF,\n // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF,\n // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F,\n // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F,\n // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF,\n // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F,\n // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F,\n // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF,\n // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF,\n // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF,\n};\n\nmodule.exports = unicodeBlockLookup;\n","'use strict';\n// \n\n/**\n * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @private\n */\nclass LRUCache {\n \n \n \n \n /**\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n */\n constructor(max , onRemove ) {\n this.max = max;\n this.onRemove = onRemove;\n this.reset();\n }\n\n /**\n * Clear the cache\n *\n * @returns {LRUCache} this cache\n * @private\n */\n reset() {\n for (const key in this.data) {\n this.onRemove(this.data[key]);\n }\n\n this.data = {};\n this.order = [];\n\n return this;\n }\n\n /**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {LRUCache} this cache\n * @private\n */\n add(key , data ) {\n\n if (this.has(key)) {\n this.order.splice(this.order.indexOf(key), 1);\n this.data[key] = data;\n this.order.push(key);\n\n } else {\n this.data[key] = data;\n this.order.push(key);\n\n if (this.order.length > this.max) {\n const removedData = this.get(this.order[0]);\n if (removedData) this.onRemove(removedData);\n }\n }\n\n return this;\n }\n\n /**\n * Determine whether the value attached to `key` is present\n *\n * @param {string} key the key to be looked-up\n * @returns {boolean} whether the cache has this value\n * @private\n */\n has(key ) {\n return key in this.data;\n }\n\n /**\n * List all keys in the cache\n *\n * @returns {Array} an array of keys in this cache.\n * @private\n */\n keys() {\n return this.order;\n }\n\n /**\n * Get the value attached to a specific key. If the key is not found,\n * returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\n get(key ) {\n if (!this.has(key)) { return null; }\n\n const data = this.data[key];\n\n delete this.data[key];\n this.order.splice(this.order.indexOf(key), 1);\n\n return data;\n }\n\n /**\n * Get the value attached to a specific key without removing data\n * from the cache. If the key is not found, returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\n getWithoutRemoving(key ) {\n if (!this.has(key)) { return null; }\n\n const data = this.data[key];\n return data;\n }\n\n /**\n * Remove a key/value combination from the cache.\n *\n * @param {string} key the key for the pair to delete\n * @returns {LRUCache} this cache\n * @private\n */\n remove(key ) {\n if (!this.has(key)) { return this; }\n\n const data = this.data[key];\n delete this.data[key];\n this.onRemove(data);\n this.order.splice(this.order.indexOf(key), 1);\n\n return this;\n }\n\n /**\n * Change the max size of the cache.\n *\n * @param {number} max the max size of the cache\n * @returns {LRUCache} this cache\n * @private\n */\n setMaxSize(max ) {\n this.max = max;\n\n while (this.order.length > this.max) {\n const removedData = this.get(this.order[0]);\n if (removedData) this.onRemove(removedData);\n }\n\n return this;\n }\n}\n\nmodule.exports = LRUCache;\n","'use strict';\n// \n\nconst config = require('./config');\nconst browser = require('./browser');\n\nconst help = 'See https://www.mapbox.com/api-documentation/#access-tokens';\n\n \n \n \n \n \n \n\nfunction makeAPIURL(urlObject , accessToken) {\n const apiUrlObject = parseUrl(config.API_URL);\n urlObject.protocol = apiUrlObject.protocol;\n urlObject.authority = apiUrlObject.authority;\n\n if (!config.REQUIRE_ACCESS_TOKEN) return formatUrl(urlObject);\n\n accessToken = accessToken || config.ACCESS_TOKEN;\n if (!accessToken)\n throw new Error(`An API access token is required to use Mapbox GL. ${help}`);\n if (accessToken[0] === 's')\n throw new Error(`Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). ${help}`);\n\n urlObject.params.push(`access_token=${accessToken}`);\n return formatUrl(urlObject);\n}\n\nfunction isMapboxURL(url ) {\n return url.indexOf('mapbox:') === 0;\n}\n\nexports.isMapboxURL = isMapboxURL;\n\nexports.normalizeStyleURL = function(url , accessToken ) {\n if (!isMapboxURL(url)) return url;\n const urlObject = parseUrl(url);\n urlObject.path = `/styles/v1${urlObject.path}`;\n return makeAPIURL(urlObject, accessToken);\n};\n\nexports.normalizeGlyphsURL = function(url , accessToken ) {\n if (!isMapboxURL(url)) return url;\n const urlObject = parseUrl(url);\n urlObject.path = `/fonts/v1${urlObject.path}`;\n return makeAPIURL(urlObject, accessToken);\n};\n\nexports.normalizeSourceURL = function(url , accessToken ) {\n if (!isMapboxURL(url)) return url;\n const urlObject = parseUrl(url);\n urlObject.path = `/v4/${urlObject.authority}.json`;\n // TileJSON requests need a secure flag appended to their URLs so\n // that the server knows to send SSL-ified resource references.\n urlObject.params.push('secure');\n return makeAPIURL(urlObject, accessToken);\n};\n\nexports.normalizeSpriteURL = function(url , format , extension , accessToken ) {\n const urlObject = parseUrl(url);\n if (!isMapboxURL(url)) {\n urlObject.path += `${format}${extension}`;\n return formatUrl(urlObject);\n }\n urlObject.path = `/styles/v1${urlObject.path}/sprite${format}${extension}`;\n return makeAPIURL(urlObject, accessToken);\n};\n\nconst imageExtensionRe = /(\\.(png|jpg)\\d*)(?=$)/;\n\nexports.normalizeTileURL = function(tileURL , sourceURL , tileSize ) {\n if (!sourceURL || !isMapboxURL(sourceURL)) return tileURL;\n\n const urlObject = parseUrl(tileURL);\n\n // The v4 mapbox tile API supports 512x512 image tiles only when @2x\n // is appended to the tile URL. If `tileSize: 512` is specified for\n // a Mapbox raster source force the @2x suffix even if a non hidpi device.\n const suffix = browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : '';\n const extension = browser.supportsWebp ? '.webp' : '$1';\n urlObject.path = urlObject.path.replace(imageExtensionRe, `${suffix}${extension}`);\n\n replaceTempAccessToken(urlObject.params);\n return formatUrl(urlObject);\n};\n\nfunction replaceTempAccessToken(params ) {\n for (let i = 0; i < params.length; i++) {\n if (params[i].indexOf('access_token=tk.') === 0) {\n params[i] = `access_token=${config.ACCESS_TOKEN || ''}`;\n }\n }\n}\n\nconst urlRe = /^(\\w+):\\/\\/([^/?]+)(\\/[^?]+)?\\??(.+)?/;\n\nfunction parseUrl(url ) {\n const parts = url.match(urlRe);\n if (!parts) {\n throw new Error('Unable to parse URL object');\n }\n return {\n protocol: parts[1],\n authority: parts[2],\n path: parts[3] || '/',\n params: parts[4] ? parts[4].split('&') : []\n };\n}\n\nfunction formatUrl(obj ) {\n const params = obj.params.length ? `?${obj.params.join('&')}` : '';\n return `${obj.protocol}://${obj.authority}${obj.path}${params}`;\n}\n","'use strict';\n/* eslint-disable new-cap */\n\nconst isChar = require('./is_char_in_unicode_block');\n\nmodule.exports.allowsIdeographicBreaking = function(chars) {\n for (const char of chars) {\n if (!exports.charAllowsIdeographicBreaking(char.charCodeAt(0))) return false;\n }\n return true;\n};\n\nmodule.exports.allowsVerticalWritingMode = function(chars) {\n for (const char of chars) {\n if (exports.charHasUprightVerticalOrientation(char.charCodeAt(0))) return true;\n }\n return false;\n};\n\nmodule.exports.charAllowsIdeographicBreaking = function(char) {\n // Return early for characters outside all ideographic ranges.\n if (char < 0x2E80) return false;\n\n if (isChar['Bopomofo Extended'](char)) return true;\n if (isChar['Bopomofo'](char)) return true;\n if (isChar['CJK Compatibility Forms'](char)) return true;\n if (isChar['CJK Compatibility Ideographs'](char)) return true;\n if (isChar['CJK Compatibility'](char)) return true;\n if (isChar['CJK Radicals Supplement'](char)) return true;\n if (isChar['CJK Strokes'](char)) return true;\n if (isChar['CJK Symbols and Punctuation'](char)) return true;\n if (isChar['CJK Unified Ideographs Extension A'](char)) return true;\n if (isChar['CJK Unified Ideographs'](char)) return true;\n if (isChar['Enclosed CJK Letters and Months'](char)) return true;\n if (isChar['Halfwidth and Fullwidth Forms'](char)) return true;\n if (isChar['Hiragana'](char)) return true;\n if (isChar['Ideographic Description Characters'](char)) return true;\n if (isChar['Kangxi Radicals'](char)) return true;\n if (isChar['Katakana Phonetic Extensions'](char)) return true;\n if (isChar['Katakana'](char)) return true;\n if (isChar['Vertical Forms'](char)) return true;\n if (isChar['Yi Radicals'](char)) return true;\n if (isChar['Yi Syllables'](char)) return true;\n\n return false;\n};\n\n// The following logic comes from\n// .\n// The data file denotes with “U” or “Tu” any codepoint that may be drawn\n// upright in vertical text but does not distinguish between upright and\n// “neutral” characters.\n\n// Blocks in the Unicode supplementary planes are excluded from this module due\n// to .\n\n/**\n * Returns true if the given Unicode codepoint identifies a character with\n * upright orientation.\n *\n * A character has upright orientation if it is drawn upright (unrotated)\n * whether the line is oriented horizontally or vertically, even if both\n * adjacent characters can be rotated. For example, a Chinese character is\n * always drawn upright. An uprightly oriented character causes an adjacent\n * “neutral” character to be drawn upright as well.\n */\nexports.charHasUprightVerticalOrientation = function(char) {\n if (char === 0x02EA /* modifier letter yin departing tone mark */ ||\n char === 0x02EB /* modifier letter yang departing tone mark */) {\n return true;\n }\n\n // Return early for characters outside all ranges whose characters remain\n // upright in vertical writing mode.\n if (char < 0x1100) return false;\n\n if (isChar['Bopomofo Extended'](char)) return true;\n if (isChar['Bopomofo'](char)) return true;\n if (isChar['CJK Compatibility Forms'](char)) {\n if (!(char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F /* wavy low line */)) {\n return true;\n }\n }\n if (isChar['CJK Compatibility Ideographs'](char)) return true;\n if (isChar['CJK Compatibility'](char)) return true;\n if (isChar['CJK Radicals Supplement'](char)) return true;\n if (isChar['CJK Strokes'](char)) return true;\n if (isChar['CJK Symbols and Punctuation'](char)) {\n if (!(char >= 0x3008 /* left angle bracket */ && char <= 0x3011 /* right black lenticular bracket */) &&\n !(char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F /* low double prime quotation mark */) &&\n char !== 0x3030 /* wavy dash */) {\n return true;\n }\n }\n if (isChar['CJK Unified Ideographs Extension A'](char)) return true;\n if (isChar['CJK Unified Ideographs'](char)) return true;\n if (isChar['Enclosed CJK Letters and Months'](char)) return true;\n if (isChar['Hangul Compatibility Jamo'](char)) return true;\n if (isChar['Hangul Jamo Extended-A'](char)) return true;\n if (isChar['Hangul Jamo Extended-B'](char)) return true;\n if (isChar['Hangul Jamo'](char)) return true;\n if (isChar['Hangul Syllables'](char)) return true;\n if (isChar['Hiragana'](char)) return true;\n if (isChar['Ideographic Description Characters'](char)) return true;\n if (isChar['Kanbun'](char)) return true;\n if (isChar['Kangxi Radicals'](char)) return true;\n if (isChar['Katakana Phonetic Extensions'](char)) return true;\n if (isChar['Katakana'](char)) {\n if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) {\n return true;\n }\n }\n if (isChar['Halfwidth and Fullwidth Forms'](char)) {\n if (char !== 0xFF08 /* fullwidth left parenthesis */ &&\n char !== 0xFF09 /* fullwidth right parenthesis */ &&\n char !== 0xFF0D /* fullwidth hyphen-minus */ &&\n !(char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E /* fullwidth greater-than sign */) &&\n char !== 0xFF3B /* fullwidth left square bracket */ &&\n char !== 0xFF3D /* fullwidth right square bracket */ &&\n char !== 0xFF3F /* fullwidth low line */ &&\n !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) &&\n char !== 0xFFE3 /* fullwidth macron */ &&\n !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) {\n return true;\n }\n }\n if (isChar['Small Form Variants'](char)) {\n if (!(char >= 0xFE58 /* small em dash */ && char <= 0xFE5E /* small right tortoise shell bracket */) &&\n !(char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66 /* small equals sign */)) {\n return true;\n }\n }\n if (isChar['Unified Canadian Aboriginal Syllabics'](char)) return true;\n if (isChar['Unified Canadian Aboriginal Syllabics Extended'](char)) return true;\n if (isChar['Vertical Forms'](char)) return true;\n if (isChar['Yijing Hexagram Symbols'](char)) return true;\n if (isChar['Yi Syllables'](char)) return true;\n if (isChar['Yi Radicals'](char)) return true;\n\n return false;\n};\n\n/**\n * Returns true if the given Unicode codepoint identifies a character with\n * neutral orientation.\n *\n * A character has neutral orientation if it may be drawn rotated or unrotated\n * when the line is oriented vertically, depending on the orientation of the\n * adjacent characters. For example, along a verticlly oriented line, the vulgar\n * fraction ½ is drawn upright among Chinese characters but rotated among Latin\n * letters. A neutrally oriented character does not influence whether an\n * adjacent character is drawn upright or rotated.\n */\nexports.charHasNeutralVerticalOrientation = function(char) {\n if (isChar['Latin-1 Supplement'](char)) {\n if (char === 0x00A7 /* section sign */ ||\n char === 0x00A9 /* copyright sign */ ||\n char === 0x00AE /* registered sign */ ||\n char === 0x00B1 /* plus-minus sign */ ||\n char === 0x00BC /* vulgar fraction one quarter */ ||\n char === 0x00BD /* vulgar fraction one half */ ||\n char === 0x00BE /* vulgar fraction three quarters */ ||\n char === 0x00D7 /* multiplication sign */ ||\n char === 0x00F7 /* division sign */) {\n return true;\n }\n }\n if (isChar['General Punctuation'](char)) {\n if (char === 0x2016 /* double vertical line */ ||\n char === 0x2020 /* dagger */ ||\n char === 0x2021 /* double dagger */ ||\n char === 0x2030 /* per mille sign */ ||\n char === 0x2031 /* per ten thousand sign */ ||\n char === 0x203B /* reference mark */ ||\n char === 0x203C /* double exclamation mark */ ||\n char === 0x2042 /* asterism */ ||\n char === 0x2047 /* double question mark */ ||\n char === 0x2048 /* question exclamation mark */ ||\n char === 0x2049 /* exclamation question mark */ ||\n char === 0x2051 /* two asterisks aligned vertically */) {\n return true;\n }\n }\n if (isChar['Letterlike Symbols'](char)) return true;\n if (isChar['Number Forms'](char)) return true;\n if (isChar['Miscellaneous Technical'](char)) {\n if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) ||\n (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) ||\n (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) ||\n char === 0x232B /* erase to the left */ ||\n (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) ||\n (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) ||\n char === 0x23CF /* eject symbol */ ||\n (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) ||\n (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) {\n return true;\n }\n }\n if (isChar['Control Pictures'](char) && char !== 0x2423 /* open box */) return true;\n if (isChar['Optical Character Recognition'](char)) return true;\n if (isChar['Enclosed Alphanumerics'](char)) return true;\n if (isChar['Geometric Shapes'](char)) return true;\n if (isChar['Miscellaneous Symbols'](char)) {\n if (!(char >= 0x261A /* black left pointing index */ && char <= 0x261F /* white down pointing index */)) {\n return true;\n }\n }\n if (isChar['Miscellaneous Symbols and Arrows'](char)) {\n if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) ||\n (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) ||\n (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) {\n return true;\n }\n }\n if (isChar['CJK Symbols and Punctuation'](char)) return true;\n if (isChar['Katakana'](char)) return true;\n if (isChar['Private Use Area'](char)) return true;\n if (isChar['CJK Compatibility Forms'](char)) return true;\n if (isChar['Small Form Variants'](char)) return true;\n if (isChar['Halfwidth and Fullwidth Forms'](char)) return true;\n\n if (char === 0x221E /* infinity */ ||\n char === 0x2234 /* therefore */ ||\n char === 0x2235 /* because */ ||\n (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) ||\n (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) ||\n char === 0xFFFC /* object replacement character */ ||\n char === 0xFFFD /* replacement character */) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the given Unicode codepoint identifies a character with\n * rotated orientation.\n *\n * A character has rotated orientation if it is drawn rotated when the line is\n * oriented vertically, even if both adjacent characters are upright. For\n * example, a Latin letter is drawn rotated along a vertical line. A rotated\n * character causes an adjacent “neutral” character to be drawn rotated as well.\n */\nexports.charHasRotatedVerticalOrientation = function(char) {\n return !(exports.charHasUprightVerticalOrientation(char) ||\n exports.charHasNeutralVerticalOrientation(char));\n};\n","'use strict';\n// \n\n// Note: all \"sizes\" are measured in bytes\n\nconst assert = require('assert');\n\nmodule.exports = createStructArrayType;\n\nconst viewTypes = {\n 'Int8': Int8Array,\n 'Uint8': Uint8Array,\n 'Uint8Clamped': Uint8ClampedArray,\n 'Int16': Int16Array,\n 'Uint16': Uint16Array,\n 'Int32': Int32Array,\n 'Uint32': Uint32Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n};\n\n/* eslint-disable no-undef */\n \n/* eslint-enable no-undef */\n\n/**\n * @typedef {Object} StructMember\n * @private\n * @property {string} name\n * @property {string} type\n * @property {number} components\n */\n\n/**\n * @private\n */\nclass Struct {\n \n \n \n \n \n // The following properties are defined on the prototype of sub classes.\n \n \n /**\n * @param {StructArray} structArray The StructArray the struct is stored in\n * @param {number} index The index of the struct in the StructArray.\n * @private\n */\n constructor(structArray, index) {\n this._structArray = structArray;\n this._pos1 = index * this.size;\n this._pos2 = this._pos1 / 2;\n this._pos4 = this._pos1 / 4;\n this._pos8 = this._pos1 / 8;\n }\n}\n\nconst DEFAULT_CAPACITY = 128;\nconst RESIZE_MULTIPLIER = 5;\n\n \n \n \n \n \n \n\n/**\n * The StructArray class is inherited by the custom StructArrayType classes created with\n * `createStructArrayType(members, options)`.\n * @private\n */\nclass StructArray {\n \n \n \n \n \n \n \n \n \n \n \n \n \n // The following properties aer defined on the prototype.\n \n \n \n \n \n constructor(serialized ) {\n this.isTransferred = false;\n\n if (serialized !== undefined) {\n // Create from an serialized StructArray\n this.arrayBuffer = serialized.arrayBuffer;\n this.length = serialized.length;\n this.capacity = this.arrayBuffer.byteLength / this.bytesPerElement;\n this._refreshViews();\n\n // Create a new StructArray\n } else {\n this.capacity = -1;\n this.resize(0);\n }\n }\n\n /**\n * Serialize the StructArray type. This serializes the *type* not an instance of the type.\n */\n static serialize() {\n return {\n members: this.prototype.members,\n alignment: this.prototype.StructType.prototype.alignment,\n bytesPerElement: this.prototype.bytesPerElement\n };\n }\n\n /**\n * Serialize this StructArray instance\n */\n serialize(transferables ) {\n assert(!this.isTransferred);\n\n this._trim();\n\n if (transferables) {\n this.isTransferred = true;\n transferables.push(this.arrayBuffer);\n }\n return {\n length: this.length,\n arrayBuffer: this.arrayBuffer\n };\n }\n\n /**\n * Return the Struct at the given location in the array.\n * @param {number} index The index of the element.\n */\n get(index ) {\n assert(!this.isTransferred);\n return new this.StructType(this, index);\n }\n\n /**\n * Resize the array to discard unused capacity.\n */\n _trim() {\n if (this.length !== this.capacity) {\n this.capacity = this.length;\n this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement);\n this._refreshViews();\n }\n }\n\n /**\n * Resize the array.\n * If `n` is greater than the current length then additional elements with undefined values are added.\n * If `n` is less than the current length then the array will be reduced to the first `n` elements.\n * @param {number} n The new size of the array.\n */\n resize(n ) {\n assert(!this.isTransferred);\n\n this.length = n;\n if (n > this.capacity) {\n this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY);\n this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement);\n\n const oldUint8Array = this.uint8;\n this._refreshViews();\n if (oldUint8Array) this.uint8.set(oldUint8Array);\n }\n }\n\n /**\n * Create TypedArray views for the current ArrayBuffer.\n */\n _refreshViews() {\n for (const type of this._usedTypes) {\n // $FlowFixMe\n this[getArrayViewName(type)] = new viewTypes[type](this.arrayBuffer);\n }\n }\n\n /**\n * Output the `StructArray` between indices `startIndex` and `endIndex` as an array of `StructTypes` to enable sorting\n * @param {number} startIndex\n * @param {number} endIndex\n */\n toArray(startIndex , endIndex ) {\n assert(!this.isTransferred);\n\n const array = [];\n\n for (let i = startIndex; i < endIndex; i++) {\n const struct = this.get(i);\n array.push(struct);\n }\n\n return array;\n }\n}\n\nconst structArrayTypeCache = {};\n\n/**\n * `createStructArrayType` is used to create new `StructArray` types.\n *\n * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` making it behave like\n * an array of typed structs. A StructArray is comprised of elements. Each element has a set of\n * members that are defined when the `StructArrayType` is created.\n *\n * StructArrays useful for creating large arrays that:\n * - can be transferred from workers as a Transferable object\n * - can be copied cheaply\n * - use less memory for lower-precision members\n * - can be used as buffers in WebGL.\n *\n * @class\n * @param {Object} options\n * @param {number} options.alignment Use `4` to align members to 4 byte boundaries. Default is 1.\n * @param {Array} options.members\n * @example\n *\n * var PointArrayType = createStructArrayType({\n * members: [\n * { type: 'Int16', name: 'x' },\n * { type: 'Int16', name: 'y' }\n * ]});\n *\n * var pointArray = new PointArrayType();\n * pointArray.emplaceBack(10, 15);\n * pointArray.emplaceBack(20, 35);\n *\n * point = pointArray.get(0);\n * assert(point.x === 10);\n * assert(point.y === 15);\n *\n * @private\n */\n\nfunction createStructArrayType(options \n \n \n ) {\n\n const key = JSON.stringify(options);\n\n if (structArrayTypeCache[key]) {\n return structArrayTypeCache[key];\n }\n\n const alignment = (options.alignment === undefined) ?\n 1 : options.alignment;\n\n let offset = 0;\n let maxSize = 0;\n const usedTypes = ['Uint8'];\n\n const members = options.members.map((member) => {\n assert(member.name.length);\n assert(member.type in viewTypes);\n\n if (usedTypes.indexOf(member.type) < 0) usedTypes.push(member.type);\n\n const typeSize = sizeOf(member.type);\n const memberOffset = offset = align(offset, Math.max(alignment, typeSize));\n const components = member.components || 1;\n\n maxSize = Math.max(maxSize, typeSize);\n offset += typeSize * components;\n\n return {\n name: member.name,\n type: member.type,\n components: components,\n offset: memberOffset\n };\n });\n\n const size = align(offset, Math.max(maxSize, alignment));\n\n class StructType extends Struct {}\n\n StructType.prototype.alignment = alignment;\n StructType.prototype.size = size;\n\n for (const member of members) {\n for (let c = 0; c < member.components; c++) {\n const name = member.name + (member.components === 1 ? '' : c);\n Object.defineProperty(StructType.prototype, name, {\n get: createGetter(member, c),\n set: createSetter(member, c)\n });\n }\n }\n\n class StructArrayType extends StructArray {}\n\n StructArrayType.prototype.members = members;\n StructArrayType.prototype.StructType = StructType;\n StructArrayType.prototype.bytesPerElement = size;\n StructArrayType.prototype.emplaceBack = createEmplaceBack(members, size);\n StructArrayType.prototype._usedTypes = usedTypes;\n\n structArrayTypeCache[key] = StructArrayType;\n\n return StructArrayType;\n}\n\nfunction align(offset , size ) {\n return Math.ceil(offset / size) * size;\n}\n\nfunction sizeOf(type ) {\n return viewTypes[type].BYTES_PER_ELEMENT;\n}\n\nfunction getArrayViewName(type ) {\n return type.toLowerCase();\n}\n\n/*\n * > I saw major perf gains by shortening the source of these generated methods (i.e. renaming\n * > elementIndex to i) (likely due to v8 inlining heuristics).\n * - lucaswoj\n */\nfunction createEmplaceBack(members, bytesPerElement) {\n const usedTypeSizes = [];\n const argNames = [];\n let body =\n 'var i = this.length;\\n' +\n 'this.resize(this.length + 1);\\n';\n\n for (const member of members) {\n const size = sizeOf(member.type);\n\n // array offsets to the end of current data for each type size\n // var o{SIZE} = i * ROUNDED(bytesPerElement / size);\n if (usedTypeSizes.indexOf(size) < 0) {\n usedTypeSizes.push(size);\n body += `var o${size.toFixed(0)} = i * ${(bytesPerElement / size).toFixed(0)};\\n`;\n }\n\n for (let c = 0; c < member.components; c++) {\n // arguments v0, v1, v2, ... are, in order, the components of\n // member 0, then the components of member 1, etc.\n const argName = `v${argNames.length}`;\n // The index for `member` component `c` into the appropriate type array is:\n // this.{TYPE}[o{SIZE} + MEMBER_OFFSET + {c}] = v{X}\n // where MEMBER_OFFSET = ROUND(member.offset / size) is the per-element\n // offset of this member into the array\n const index = `o${size.toFixed(0)} + ${(member.offset / size + c).toFixed(0)}`;\n body += `this.${getArrayViewName(member.type)}[${index}] = ${argName};\\n`;\n argNames.push(argName);\n }\n }\n\n body += 'return i;';\n\n return new Function(argNames.toString(), body);\n}\n\nfunction createMemberComponentString(member, component) {\n const elementOffset = `this._pos${sizeOf(member.type).toFixed(0)}`;\n const componentOffset = (member.offset / sizeOf(member.type) + component).toFixed(0);\n const index = `${elementOffset} + ${componentOffset}`;\n return `this._structArray.${getArrayViewName(member.type)}[${index}]`;\n}\n\nfunction createGetter(member, c) {\n return new Function(`return ${createMemberComponentString(member, c)};`);\n}\n\nfunction createSetter(member, c) {\n return new Function('x', `${createMemberComponentString(member, c)} = x;`);\n}\n","'use strict';\n\n// \n\nmodule.exports = resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param {Object} properties a key/value relationship between tokens and replacements\n * @param {string} text the template string\n * @returns {string} the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties , text ) {\n return text.replace(/{([^{}]+)}/g, (match, key ) => {\n return key in properties ? properties[key] : '';\n });\n}\n","'use strict';\n// \n\nconst UnitBezier = require('@mapbox/unitbezier');\nconst Coordinate = require('../geo/coordinate');\nconst Point = require('point-geometry');\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @private\n */\nexports.easeCubicInOut = function(t ) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n const t2 = t * t,\n t3 = t2 * t;\n return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n};\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param p1x control point 1 x coordinate\n * @param p1y control point 1 y coordinate\n * @param p2x control point 2 x coordinate\n * @param p2y control point 2 y coordinate\n * @private\n */\nexports.bezier = function(p1x , p1y , p2x , p2y ) {\n const bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n return function(t ) {\n return bezier.solve(t);\n };\n};\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @private\n */\nexports.ease = exports.bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * constrain n to the given range via min + max\n *\n * @param n value\n * @param min the minimum value to be returned\n * @param max the maximum value to be returned\n * @returns the clamped value\n * @private\n */\nexports.clamp = function (n , min , max ) {\n return Math.min(max, Math.max(min, n));\n};\n\n/**\n * constrain n to the given range, excluding the minimum, via modular arithmetic\n *\n * @param n value\n * @param min the minimum value to be returned, exclusive\n * @param max the maximum value to be returned, inclusive\n * @returns constrained number\n * @private\n */\nexports.wrap = function (n , min , max ) {\n const d = max - min;\n const w = ((n - min) % d + d) % d + min;\n return (w === min) ? max : w;\n};\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` with the completed results of all calls.\n *\n * @param array input to each call of the async function.\n * @param fn an async function with signature (data, callback)\n * @param callback a callback run after all async work is done.\n * called with an array, containing the results of each async call.\n * @private\n */\nexports.asyncAll = function (array , fn , callback ) {\n if (!array.length) { return callback(null, []); }\n let remaining = array.length;\n const results = new Array(array.length);\n let error = null;\n array.forEach((item, i) => {\n fn(item, (err, result) => {\n if (err) error = err;\n results[i] = result;\n if (--remaining === 0) callback(error, results);\n });\n });\n};\n\n/*\n * Polyfill for Object.values. Not fully spec compliant, but we don't\n * need it to be.\n *\n * @private\n */\nexports.values = function (obj ) {\n const result = [];\n for (const k in obj) {\n result.push(obj[k]);\n }\n return result;\n};\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @returns keys difference\n * @private\n */\nexports.keysDifference = function (obj , other ) {\n const difference = [];\n for (const i in obj) {\n if (!(i in other)) {\n difference.push(i);\n }\n }\n return difference;\n};\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n *\n * @param dest destination object\n * @param {...Object} sources sources from which properties are pulled\n * @private\n */\n// eslint-disable-next-line no-unused-vars\nexports.extend = function (dest , source0 , source1 , source2 ) {\n for (let i = 1; i < arguments.length; i++) {\n const src = arguments[i];\n for (const k in src) {\n dest[k] = src[k];\n }\n }\n return dest;\n};\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param src the object\n * @param properties an array of property names chosen\n * to appear on the resulting object.\n * @returns object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexports.pick = function (src , properties ) {\n const result = {};\n for (let i = 0; i < properties.length; i++) {\n const k = properties[i];\n if (k in src) {\n result[k] = src[k];\n }\n }\n return result;\n};\n\nlet id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns unique numeric id.\n * @private\n */\nexports.uniqueId = function () {\n return id++;\n};\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param fns list of member function names\n * @param context the context value\n * @example\n * function MyClass() {\n * bindAll(['ontimer'], this);\n * this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n * alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexports.bindAll = function(fns , context ) {\n fns.forEach((fn) => {\n if (!context[fn]) { return; }\n context[fn] = context[fn].bind(context);\n });\n};\n\n/**\n * Given a list of coordinates, get their center as a coordinate.\n *\n * @returns centerpoint\n * @private\n */\nexports.getCoordinatesCenter = function(coords ) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (let i = 0; i < coords.length; i++) {\n minX = Math.min(minX, coords[i].column);\n minY = Math.min(minY, coords[i].row);\n maxX = Math.max(maxX, coords[i].column);\n maxY = Math.max(maxY, coords[i].row);\n }\n\n const dx = maxX - minX;\n const dy = maxY - minY;\n const dMax = Math.max(dx, dy);\n return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0)\n .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2));\n};\n\n/**\n * Determine if a string ends with a particular substring\n *\n * @private\n */\nexports.endsWith = function(string , suffix ) {\n return string.indexOf(suffix, string.length - suffix.length) !== -1;\n};\n\n/**\n * Create an object by mapping all the values of an existing object while\n * preserving their keys.\n *\n * @private\n */\nexports.mapObject = function(input , iterator , context ) {\n const output = {};\n for (const key in input) {\n output[key] = iterator.call(context || this, input[key], key, input);\n }\n return output;\n};\n\n/**\n * Create an object by filtering out values of an existing object.\n *\n * @private\n */\nexports.filterObject = function(input , iterator , context ) {\n const output = {};\n for (const key in input) {\n if (iterator.call(context || this, input[key], key, input)) {\n output[key] = input[key];\n }\n }\n return output;\n};\n\n/**\n * Deeply compares two object literals.\n *\n * @private\n */\nexports.deepEqual = function(a , b ) {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!exports.deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false;\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n for (const key in a) {\n if (!exports.deepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n return a === b;\n};\n\n/**\n * Deeply clones two objects.\n *\n * @private\n */\nexports.clone = function (input ) {\n if (Array.isArray(input)) {\n return input.map(exports.clone);\n } else if (typeof input === 'object' && input) {\n return ((exports.mapObject(input, exports.clone) ) );\n } else {\n return input;\n }\n};\n\n/**\n * Check if two arrays have at least one common element.\n *\n * @private\n */\nexports.arraysIntersect = function(a , b ) {\n for (let l = 0; l < a.length; l++) {\n if (b.indexOf(a[l]) >= 0) return true;\n }\n return false;\n};\n\n/**\n * Print a warning message to the console and ensure duplicate warning messages\n * are not printed.\n *\n * @private\n */\nconst warnOnceHistory = {};\nexports.warnOnce = function(message ) {\n if (!warnOnceHistory[message]) {\n // console isn't defined in some WebWorkers, see #2558\n if (typeof console !== \"undefined\") console.warn(message);\n warnOnceHistory[message] = true;\n }\n};\n\n/**\n * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order\n *\n * @returns true for a counter clockwise set of points\n */\n// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/\nexports.isCounterClockwise = function(a , b , c ) {\n return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x);\n};\n\n/**\n * Returns the signed area for the polygon ring. Postive areas are exterior rings and\n * have a clockwise winding. Negative areas are interior rings and have a counter clockwise\n * ordering.\n *\n * @param ring Exterior or interior ring\n */\nexports.calculateSignedArea = function(ring ) {\n let sum = 0;\n for (let i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n sum += (p2.x - p1.x) * (p1.y + p2.y);\n }\n return sum;\n};\n\n/**\n * Detects closed polygons, first + last point are equal\n *\n * @param points array of points\n * @return true if the points are a closed polygon\n */\nexports.isClosedPolygon = function(points ) {\n // If it is 2 points that are the same then it is a point\n // If it is 3 points with start and end the same then it is a line\n if (points.length < 4)\n return false;\n\n const p1 = points[0];\n const p2 = points[points.length - 1];\n\n if (Math.abs(p1.x - p2.x) > 0 ||\n Math.abs(p1.y - p2.y) > 0) {\n return false;\n }\n\n // polygon simplification can produce polygons with zero area and more than 3 points\n return (Math.abs(exports.calculateSignedArea(points)) > 0.01);\n};\n\n/**\n * Converts spherical coordinates to cartesian coordinates.\n *\n * @param spherical Spherical coordinates, in [radial, azimuthal, polar]\n * @return cartesian coordinates in [x, y, z]\n */\n\nexports.sphericalToCartesian = function(spherical ) {\n const r = spherical[0];\n let azimuthal = spherical[1],\n polar = spherical[2];\n // We abstract \"north\"/\"up\" (compass-wise) to be 0° when really this is 90° (π/2):\n // correct for that here\n azimuthal += 90;\n\n // Convert azimuthal and polar angles to radians\n azimuthal *= Math.PI / 180;\n polar *= Math.PI / 180;\n\n // spherical to cartesian (x, y, z)\n return [\n r * Math.cos(azimuthal) * Math.sin(polar),\n r * Math.sin(azimuthal) * Math.sin(polar),\n r * Math.cos(polar)\n ];\n};\n\n/**\n * Parses data from 'Cache-Control' headers.\n *\n * @param cacheControl Value of 'Cache-Control' header\n * @return object containing parsed header info.\n */\n\nexports.parseCacheControl = function(cacheControl ) {\n // Taken from [Wreck](https://github.com/hapijs/wreck)\n const re = /(?:^|(?:\\s*\\,\\s*))([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)(?:\\=(?:([^\\x00-\\x20\\(\\)<>@\\,;\\:\\\\\"\\/\\[\\]\\?\\=\\{\\}\\x7F]+)|(?:\\\"((?:[^\"\\\\]|\\\\.)*)\\\")))?/g;\n\n const header = {};\n cacheControl.replace(re, ($0, $1, $2, $3) => {\n const value = $2 || $3;\n header[$1] = value ? value.toLowerCase() : true;\n return '';\n });\n\n if (header['max-age']) {\n const maxAge = parseInt(header['max-age'], 10);\n if (isNaN(maxAge)) delete header['max-age'];\n else header['max-age'] = maxAge;\n }\n\n return header;\n};\n","'use strict';\n\nclass Feature {\n constructor(vectorTileFeature, z, x, y) {\n this.type = 'Feature';\n\n this._vectorTileFeature = vectorTileFeature;\n vectorTileFeature._z = z;\n vectorTileFeature._x = x;\n vectorTileFeature._y = y;\n\n this.properties = vectorTileFeature.properties;\n\n if (vectorTileFeature.id != null) {\n this.id = vectorTileFeature.id;\n }\n }\n\n get geometry() {\n if (this._geometry === undefined) {\n this._geometry = this._vectorTileFeature.toGeoJSON(\n this._vectorTileFeature._x,\n this._vectorTileFeature._y,\n this._vectorTileFeature._z).geometry;\n }\n return this._geometry;\n }\n\n set geometry(g) {\n this._geometry = g;\n }\n\n toJSON() {\n const json = {\n geometry: this.geometry\n };\n for (const i in this) {\n if (i === '_geometry' || i === '_vectorTileFeature') continue;\n json[i] = this[i];\n }\n return json;\n }\n}\n\nmodule.exports = Feature;\n","'use strict';\n\nconst scriptDetection = require('./script_detection');\n\nmodule.exports = function verticalizePunctuation(input) {\n let output = '';\n\n for (let i = 0; i < input.length; i++) {\n const nextCharCode = input.charCodeAt(i + 1) || null;\n const prevCharCode = input.charCodeAt(i - 1) || null;\n\n const canReplacePunctuation = (\n (!nextCharCode || !scriptDetection.charHasRotatedVerticalOrientation(nextCharCode) || module.exports.lookup[input[i + 1]]) &&\n (!prevCharCode || !scriptDetection.charHasRotatedVerticalOrientation(prevCharCode) || module.exports.lookup[input[i - 1]])\n );\n\n if (canReplacePunctuation && module.exports.lookup[input[i]]) {\n output += module.exports.lookup[input[i]];\n } else {\n output += input[i];\n }\n }\n\n return output;\n};\n\nmodule.exports.lookup = {\n '!': '︕',\n '#': '#',\n '$': '$',\n '%': '%',\n '&': '&',\n '(': '︵',\n ')': '︶',\n '*': '*',\n '+': '+',\n ',': '︐',\n '-': '︲',\n '.': '・',\n '/': '/',\n ':': '︓',\n ';': '︔',\n '<': '︿',\n '=': '=',\n '>': '﹀',\n '?': '︖',\n '@': '@',\n '[': '﹇',\n '\\\\': '\',\n ']': '﹈',\n '^': '^',\n '_': '︳',\n '`': '`',\n '{': '︷',\n '|': '―',\n '}': '︸',\n '~': '~',\n '¢': '¢',\n '£': '£',\n '¥': '¥',\n '¦': '¦',\n '¬': '¬',\n '¯': ' ̄',\n '–': '︲',\n '—': '︱',\n '‘': '﹃',\n '’': '﹄',\n '“': '﹁',\n '”': '﹂',\n '…': '︙',\n '‧': '・',\n '₩': '₩',\n '、': '︑',\n '。': '︒',\n '〈': '︿',\n '〉': '﹀',\n '《': '︽',\n '》': '︾',\n '「': '﹁',\n '」': '﹂',\n '『': '﹃',\n '』': '﹄',\n '【': '︻',\n '】': '︼',\n '〔': '︹',\n '〕': '︺',\n '〖': '︗',\n '〗': '︘',\n '!': '︕',\n '(': '︵',\n ')': '︶',\n ',': '︐',\n '-': '︲',\n '.': '・',\n ':': '︓',\n ';': '︔',\n '<': '︿',\n '>': '﹀',\n '?': '︖',\n '[': '﹇',\n ']': '﹈',\n '_': '︳',\n '{': '︷',\n '|': '―',\n '}': '︸',\n '⦅': '︵',\n '⦆': '︶',\n '。': '︒',\n '「': '﹁',\n '」': '﹂'\n};\n","'use strict';\n\nconst assert = require('assert');\nconst WebWorker = require('./web_worker');\n\n/**\n * Constructs a worker pool.\n * @private\n */\nclass WorkerPool {\n constructor() {\n this.active = {};\n }\n\n acquire(mapId) {\n if (!this.workers) {\n // Lazily look up the value of mapboxgl.workerCount. This allows\n // client code a chance to set it while circumventing cyclic\n // dependency problems\n const workerCount = require('../').workerCount;\n assert(typeof workerCount === 'number' && workerCount < Infinity);\n\n this.workers = [];\n while (this.workers.length < workerCount) {\n this.workers.push(new WebWorker());\n }\n }\n\n this.active[mapId] = true;\n return this.workers.slice();\n }\n\n release(mapId) {\n delete this.active[mapId];\n if (Object.keys(this.active).length === 0) {\n this.workers.forEach((w) => {\n w.terminate();\n });\n this.workers = null;\n }\n }\n}\n\nmodule.exports = WorkerPool;\n"]}