@loaders.gl/i3s 3.1.0-alpha.3 → 4.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/i3s-attribute-loader.js +44 -14
- package/dist/i3s-attribute-loader.js.map +1 -1
- package/dist/i3s-building-scene-layer-loader.js +21 -0
- package/dist/i3s-building-scene-layer-loader.js.map +1 -0
- package/dist/i3s-content-loader.js +1 -1
- package/dist/i3s-content-worker.js +7549 -2
- package/dist/i3s-loader.js +5 -2
- package/dist/i3s-loader.js.map +1 -1
- package/dist/i3s-node-page-loader.js +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/helpers/i3s-nodepages-tiles.js +27 -20
- package/dist/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/lib/parsers/constants.js +8 -0
- package/dist/lib/parsers/constants.js.map +1 -1
- package/dist/lib/parsers/parse-i3s-attribute.js +9 -1
- package/dist/lib/parsers/parse-i3s-attribute.js.map +1 -1
- package/dist/lib/parsers/parse-i3s-building-scene-layer.js +43 -0
- package/dist/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -0
- package/dist/lib/parsers/parse-i3s-tile-content.js +49 -32
- package/dist/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/lib/parsers/parse-i3s.js +4 -4
- package/dist/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/lib/utils/url-utils.js +3 -3
- package/dist/lib/utils/url-utils.js.map +1 -1
- package/package.json +13 -11
- package/src/i3s-attribute-loader.ts +56 -19
- package/src/i3s-building-scene-layer-loader.ts +34 -0
- package/src/i3s-loader.ts +4 -1
- package/src/index.ts +2 -0
- package/src/lib/helpers/i3s-nodepages-tiles.ts +28 -12
- package/src/lib/parsers/constants.ts +22 -0
- package/src/lib/parsers/parse-i3s-attribute.ts +19 -1
- package/src/lib/parsers/parse-i3s-building-scene-layer.ts +57 -0
- package/src/lib/parsers/parse-i3s-tile-content.ts +51 -31
- package/src/types.ts +102 -6
- package/dist/dist.min.js +0 -2
- package/dist/dist.min.js.map +0 -1
- package/dist/i3s-content-worker.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/regenerator/index.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/defineProperty.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/inherits.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/createClass.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/typeof.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack:///../worker-utils/src/lib/env-utils/globals.ts","webpack:///../loader-utils/src/lib/env-utils/globals.ts","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/env/globals.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/slicedToArray.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js","webpack:////home/user/apps/loaders.gl/node_modules/process/browser.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/asyncIterator.js","webpack:///(webpack)/buildin/global.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/AwaitValue.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/env/is-browser.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/env/is-electron.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack:////home/user/apps/loaders.gl/node_modules/regenerator-runtime/runtime.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/iterableToArray.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/AsyncGenerator.js","webpack:////home/user/apps/loaders.gl/node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack:///../worker-utils/src/lib/worker-utils/get-transfer-list.ts","webpack:///../worker-utils/src/lib/worker-farm/worker-body.ts","webpack:///../loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts","webpack:///../core/src/javascript-utils/is-type.ts","webpack:///../loader-utils/src/lib/env-utils/assert.ts","webpack:///../core/src/lib/loader-utils/normalize-loader.ts","webpack:///../loader-utils/src/lib/path-utils/file-aliases.ts","webpack:///../core/src/lib/utils/mime-type-utils.ts","webpack:///../core/src/lib/utils/resource-utils.ts","webpack:///../core/src/lib/utils/response-utils.ts","webpack:///../core/src/lib/fetch/fetch-file.ts","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/globals.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/local-storage.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/formatters.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/color.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/assert.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/hi-res-timestamp.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/lib/log.js","webpack:////home/user/apps/loaders.gl/node_modules/probe.gl/dist/esm/utils/autobind.js","webpack:///../core/src/lib/loader-utils/loggers.ts","webpack:///../core/src/lib/loader-utils/option-defaults.ts","webpack:///../core/src/lib/loader-utils/option-utils.ts","webpack:///../worker-utils/src/lib/env-utils/assert.ts","webpack:///../worker-utils/src/lib/worker-api/validate-worker-version.ts","webpack:///../worker-utils/src/lib/env-utils/version.ts","webpack:///../worker-utils/src/lib/worker-utils/get-loadable-worker-url.ts","webpack:///../worker-utils/src/lib/worker-farm/worker-thread.ts","webpack:///../worker-utils/src/lib/worker-farm/worker-job.ts","webpack:///../worker-utils/src/lib/worker-farm/worker-pool.ts","webpack:///../worker-utils/src/lib/worker-farm/worker-farm.ts","webpack:///../worker-utils/src/lib/worker-api/get-worker-url.ts","webpack:///../loader-utils/src/lib/worker-loader-utils/parse-with-worker.ts","webpack:///../loader-utils/src/lib/binary-utils/buffer-utils.ts","webpack:///../loader-utils/src/lib/binary-utils/array-buffer-utils.ts","webpack:///../loader-utils/src/lib/iterators/async-iteration.ts","webpack:///../core/src/iterators/make-iterator/make-string-iterator.ts","webpack:///../core/src/iterators/make-iterator/make-array-buffer-iterator.ts","webpack:///../core/src/iterators/make-iterator/make-blob-iterator.ts","webpack:///../core/src/iterators/make-iterator/make-stream-iterator.ts","webpack:///../core/src/iterators/make-iterator/make-iterator.ts","webpack:///../core/src/lib/loader-utils/get-data.ts","webpack:///../core/src/lib/loader-utils/loader-context.ts","webpack:///../loader-utils/src/lib/path-utils/path.ts","webpack:///../core/src/lib/api/register-loaders.ts","webpack:///../core/src/lib/api/select-loader.ts","webpack:///../core/src/lib/api/parse.ts","webpack:///../core/src/lib/api/load.ts","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/lib/assert.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/lib/common.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/classes/base/math-array.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/lib/validators.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/classes/base/vector.js","webpack:////home/user/apps/loaders.gl/node_modules/gl-matrix/esm/common.js","webpack:////home/user/apps/loaders.gl/node_modules/gl-matrix/esm/vec3.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/lib/gl-matrix-extras.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/classes/vector3.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/classes/base/matrix.js","webpack:////home/user/apps/loaders.gl/node_modules/gl-matrix/esm/mat4.js","webpack:////home/user/apps/loaders.gl/node_modules/gl-matrix/esm/vec2.js","webpack:////home/user/apps/loaders.gl/node_modules/gl-matrix/esm/vec4.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/classes/matrix4.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/core/dist/esm/lib/math-utils.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/geospatial/dist/esm/constants.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/geospatial/dist/esm/type-utils.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/geospatial/dist/esm/ellipsoid/helpers/scale-to-geodetic-surface.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/geospatial/dist/esm/ellipsoid/helpers/ellipsoid-transform.js","webpack:////home/user/apps/loaders.gl/node_modules/@math.gl/geospatial/dist/esm/ellipsoid/ellipsoid.js","webpack:///../images/src/lib/utils/version.ts","webpack:///../images/src/lib/category-api/image-type.ts","webpack:///../images/src/lib/category-api/parsed-image-api.ts","webpack:///../images/src/lib/parsers/svg-utils.ts","webpack:///../images/src/lib/parsers/parse-to-image.ts","webpack:///../images/src/lib/parsers/parse-to-image-bitmap.ts","webpack:///../images/src/lib/category-api/binary-image-api.ts","webpack:///../images/src/lib/parsers/parse-to-node-image.ts","webpack:///../images/src/lib/parsers/parse-image.ts","webpack:///../images/src/image-loader.ts","webpack:///../draco/src/draco-loader.ts","webpack:///../draco/src/lib/utils/version.ts","webpack:///../schema/src/category/mesh/mesh-utils.ts","webpack:///../schema/src/lib/schema/impl/schema.ts","webpack:///../schema/src/lib/utils/assert.ts","webpack:///../schema/src/lib/schema/impl/enum.ts","webpack:///../schema/src/lib/schema/impl/field.ts","webpack:///../schema/src/lib/schema/impl/type.ts","webpack:///../schema/src/category/mesh/deduce-mesh-schema.ts","webpack:///../schema/src/lib/arrow/arrow-like-type-utils.ts","webpack:///../draco/src/lib/utils/get-draco-schema.ts","webpack:///../draco/src/lib/draco-parser.ts","webpack:///../worker-utils/src/lib/library-utils/library-utils.ts","webpack:///../draco/src/lib/draco-module-loader.ts","webpack:///../draco/src/index.ts","webpack:////home/user/apps/loaders.gl/node_modules/ktx-parse/dist/ktx-parse.modern.js","webpack:///../textures/src/lib/utils/extract-mipmap-images.ts","webpack:///../textures/src/lib/gl-constants.ts","webpack:///../textures/src/lib/utils/ktx-format-helper.ts","webpack:///../textures/src/lib/parsers/parse-ktx.js","webpack:///../textures/src/lib/parsers/parse-dds.ts","webpack:///../textures/src/lib/parsers/parse-pvr.ts","webpack:///../textures/src/lib/parsers/basis-module-loader.ts","webpack:///../textures/src/lib/parsers/parse-compressed-texture.ts","webpack:///../textures/src/lib/utils/texture-formats.ts","webpack:///../textures/src/lib/parsers/parse-basis.js","webpack:///../textures/src/compressed-texture-loader.ts","webpack:///../textures/src/lib/utils/version.ts","webpack:///../textures/src/basis-loader.ts","webpack:///./src/lib/utils/url-utils.ts","webpack:////home/user/apps/loaders.gl/node_modules/@luma.gl/constants/dist/esm/index.js","webpack:///./src/lib/parsers/constants.ts","webpack:///./src/lib/parsers/parse-i3s-tile-content.ts","webpack:///./src/i3s-content-loader.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","obj","configurable","writable","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","error","done","Promise","then","fn","self","this","args","arguments","apply","err","undefined","instance","Constructor","TypeError","setPrototypeOf","subClass","superClass","constructor","_defineProperties","target","props","length","descriptor","protoProps","staticProps","_typeof","iterator","ReferenceError","arrayWithoutHoles","iterableToArray","unsupportedIterableToArray","nonIterableSpread","arr","globals","window","global","document","global_","isBrowser","process","String","browser","isWorker","importScripts","isMobile","orientation","matches","version","exec","parseFloat","Boolean","window_","process_","console","arrayWithHoles","iterableToArrayLimit","nonIterableRest","AwaitValue","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","setTimeout","e","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","noop","nextTick","Array","push","title","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","AsyncGenerator","iterable","method","asyncIterator","g","Function","_getPrototypeOf","getPrototypeOf","__proto__","arr2","arrayLikeToArray","minLen","toString","slice","from","test","wrapped","isElectron","mockUserAgent","type","electron","realUserAgent","navigator","userAgent","indexOf","assertThisInitialized","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","toStringTagSymbol","define","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","invoke","result","__await","unwrapped","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","mark","awrap","async","iter","keys","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","isArray","_i","_s","_e","_arr","_n","_d","front","back","resume","wrappedAwait","settle","request","_setPrototypeOf","getTransferList","recursive","transfers","transfersSet","Set","isTransferable","add","buffer","ArrayBuffer","isView","MessagePort","ImageBitmap","OffscreenCanvas","onMessageWrapperMap","Map","WorkerBody","onMessage","onmessage","message","isKnownMessage","data","payload","onMessageWrapper","addEventListener","removeEventListener","source","transferList","postMessage","startsWith","requestId","parseOnMainThread","arrayBuffer","options","id","input","parseData","a","loader","parseSync","parse","parser","parseTextSync","textDecoder","TextDecoder","decode","worker","isBoolean","x","isFunction","isObject","isPureObject","isIterable","isAsyncIterable","isResponse","Response","text","json","isBlob","Blob","isReadableStream","ReadableStream","tee","cancel","getReader","isReadableDOMStream","read","pipe","readable","isReadableNodeStream","assert","condition","isLoaderObject","extensions","normalizeLoader","parseText","binary","pathPrefix","fileAliases","resolvePath","filename","alias","replacement","replace","DATA_URL_PATTERN","MIME_TYPE_PATTERN","parseMIMETypeFromURL","url","QUERY_STRING_PATTERN","getResourceUrlAndType","resource","stripQueryString","contentTypeHeader","headers","mimeString","getResourceContentLength","size","byteLength","makeResponse","contentLength","getInitialDataUrl","initialDataUrl","TextEncoder","encode","response","checkResponse","ok","getResponseError","status","contentType","statusText","includes","INITIAL_DATA_LENGTH","blobSlice","reader","FileReader","onload","event","readAsDataURL","base64","arrayBufferToBase64","bytes","Uint8Array","fromCharCode","btoa","fetchFile","fetchOptions","fetch","VERSION","__VERSION__","LocalStorage","defaultSettings","storage","setItem","removeItem","getStorage","config","assign","_loadConfiguration","configuration","updateConfiguration","serialized","JSON","stringify","serializedConfiguration","getItem","formatImage","image","scale","maxWidth","imageUrl","src","width","Math","min","height","style","floor","join","COLOR","BLACK","RED","GREEN","YELLOW","BLUE","MAGENTA","CYAN","WHITE","BRIGHT_BLACK","BRIGHT_RED","BRIGHT_GREEN","BRIGHT_YELLOW","BRIGHT_BLUE","BRIGHT_MAGENTA","BRIGHT_CYAN","BRIGHT_WHITE","getColor","color","toUpperCase","getHiResTimestamp","timestamp","performance","now","hrtime","timeParts","Date","originalConsole","debug","log","warn","DEFAULT_SETTINGS","enabled","level","cache","ONCE","getTableHeader","table","_startTs","_deltaTs","LOG_THROTTLE_TIMEOUT","_storage","userData","timeStamp","predefined","proto","propNames","getOwnPropertyNames","find","autobind","seal","newLevel","setLevel","getLevel","Number","toPrecision","newPriority","_getLogFunction","oldUsage","newUsage","logLevel","time","columns","tag","priority","_shouldLog","img","Image","element","nodeName","toLowerCase","toDataURL","logImageInBrowser","asciify","fit","round","logImageInNode","setting","timeEnd","opts","collapsed","normalizeArguments","groupCollapsed","group","groupEnd","func","trace","isEnabled","normalizeLogLevel","total","getTotal","delta","getDelta","string","padLength","max","repeat","leftPad","ms","formatted","toFixed","formatTime","background","decorateMessage","resolvedLevel","isFinite","shift","unshift","messageType","probeLog","Log","NullLog","DEFAULT_LOADER_OPTIONS","mimeType","nothrow","CDN","maxConcurrency","maxMobileConcurrency","reuseWorkers","_workerType","limit","_limitMB","batchSize","batchDebounceMs","metadata","transforms","REMOVED_LOADER_OPTIONS","throws","dataType","uri","body","credentials","redirect","referrer","referrerPolicy","integrity","keepalive","signal","getGlobalLoaderState","globalThis","loaders","_state","getGlobalLoaderOptions","globalOptions","normalizeOptions","validateOptionsObject","idOptions","loaderOptions","deprecatedOptions","validateOptions","normalizeOptionsInternal","getFetchFunction","defaultOptions","loaderName","prefix","isSubOptions","suggestion","findSimilarOption","optionKey","lowerCaseOptionKey","bestSuggestion","lowerCaseKey","mergedOptions","baseUri","addUrlOptions","mergeNestedFields","validateWorkerVersion","coreVersion","workerVersion","workerURLCache","getLoadableWorkerURL","workerURL","getLoadableWorkerURLFromSource","workerUrl","getLoadableWorkerURLFromURL","set","workerSource","blob","URL","createObjectURL","NOOP","WorkerThread","onError","_createBrowserWorker","terminate","terminated","lineno","colno","_loadableURL","Worker","onerror","_getErrorFromErrorEvent","onmessageerror","WorkerJob","jobName","workerThread","isRunning","_resolve","_reject","WorkerPool","setProps","idleQueue","destroy","isDestroyed","onDebug","job","startPromise","onStart","jobQueue","_startQueuedJob","_getAvailableWorker","queuedJob","backlog","returnWorkerToQueue","count","_getMaxConcurrency","DEFAULT_PROPS","WorkerFarm","workerPools","_getWorkerPoolProps","workerPool","isSupported","_workerFarm","getWorkerURL","workerOptions","workerFile","versionTag","canParseWithWorker","parseWithWorker","workerFarm","getWorkerFarm","getWorkerPool","startJob","isBuffer","toArrayBuffer","byteOffset","_toArrayBuffer","concatenateArrayBuffers","sources","sourceArrays","map","source2","reduce","typedArray","offset","sourceArray","concatenateArrayBuffersAsync","arrayBuffers","chunk","makeStringIterator","chunkSize","textEncoder","chunkLength","makeArrayBufferIterator","chunkByteLength","end","makeStreamIterator","stream","makeBrowserStreamIterator","makeNodeStreamIterator","currentBatchPromise","nextBatchPromise","_streamReadAhead","releaseLock","makeIterator","makeBlobIterator","ERR_DATA","getArrayBufferOrStringFromDataSync","getArrayBufferOrStringFromData","isArrayBuffer","getLoaderContext","previousContext","resolvedContext","getLoadersFromContext","candidateLoaders","contextLoaders","slashIndex","lastIndexOf","substr","dirname","parts","separator","part","index","RegExp","getGlobalLoaderRegistry","loaderRegistry","getRegisteredLoaders","EXT_PATTERN","selectLoader","validHTTPResponse","selectLoaderSync","getNoValidLoaderMessage","ignoreRegisteredLoaders","normalizeLoaders","selectLoaderInternal","testUrl","findLoaderByMIMEType","match","extension","findLoaderByExtension","findLoaderByUrl","testDataAgainstText","testDataAgainstBinary","findLoaderByInitialBytes","fallbackMimeType","path","firstCharacters","getMagicString","getFirstCharacters","mimeTypes","testText","tests","some","arrayBuffer1","arrayBuffer2","array1","array2","compareArrayBuffers","magic","testBinary","dataView","DataView","getUint8","parseWithLoader","load","RADIANS_TO_DEGREES","PI","DEGREES_TO_RADIANS","precision","EPSILON","clone","toRadians","degrees","toDegrees","radians","equals","b","epsilon","oldEpsilon","abs","printTypes","printDegrees","printRowMajor","cls","ExtendableBuiltin","Reflect","construct","_extendableBuiltin","copy","arrayOrObject","fromObject","ELEMENTS","check","toArray","toObject","to","Float32Array","formatString","ai","vector","minVector","maxVector","vectors","multiply","subtract","addScalar","scalar","validate","valid","checkNumber","checkVector","v","callerName","validateVector","deprecated","sqrt","lengthSquared","mathArray","distanceSquared","dist","product","magnitude","distance","multiplyScalar","ARRAY_TYPE","random","y","z","hypot","dot","transformMat4","out","w","vec","vec3_transformMat4AsVector","ORIGIN","constants","ZERO","freeze","super","ax","ay","az","bx","by","bz","mag","cosine","acos","origin","rad","cos","sin","matrix4","transformAsPoint","matrix3","matrix2","vec3_transformMat2","quaternion","q","qx","qy","qz","qw","uvx","uvy","uvz","uuvx","uuvy","uuvz","w2","row","RANK","col","columnIndex","fill","firstIndex","columnVector","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","IDENTITY","INDICES","COL0ROW0","COL0ROW1","COL0ROW2","COL0ROW3","COL1ROW0","COL1ROW1","COL1ROW2","COL1ROW3","COL2ROW0","COL2ROW1","COL2ROW2","COL2ROW3","COL3ROW0","COL3ROW1","COL3ROW2","COL3ROW3","identity","m00","m10","m20","m30","m01","m11","m21","m31","m02","m12","m22","m32","m03","m13","m23","m33","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","left","right","bottom","top","near","far","Infinity","_computeInfinitePerspectiveOffCenter","rl","tb","nf","column0Row0","column1Row1","column2Row0","column2Row1","column3Row2","eye","center","up","x0","x1","y0","y1","z0","z1","eyex","eyey","eyez","upx","upy","upz","centerx","centery","centerz","lr","bt","fovy","aspect","focalDistance","halfY","tan","ortho","fov","f","scaleResult","getScale","inverseScale0","inverseScale1","inverseScale2","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","rx","ry","rz","rotateX","rotateY","rotateZ","axis","b12","b20","b21","b22","factor","vec2_transformMat4AsVector","translate","transformAsVector","scratchVector","fromCartographic","cartographic","longitude","latitude","toCartographic","scaleToGeodeticSurfaceIntersection","scaleToGeodeticSurfaceGradient","scratchOrigin","VECTOR_PRODUCT_LOCAL_FRAME","south","north","west","east","down","degeneratePositionLocalFrame","scratchAxisVectors","scratchVector1","scratchVector2","scratchVector3","localFrameToFixedFrame","ellipsoid","firstAxis","secondAxis","thirdAxis","cartesianOrigin","thirdAxisInferred","firstAxisVector","secondAxisVector","thirdAxisVector","sign","fromArray","normalize","geodeticSurfaceNormal","cross","scratchNormal","scratchK","scratchPosition","scratchHeight","scratchCartesian","wgs84","radii","radiiSquared","radiiToTheFourth","oneOverRadii","oneOverRadiiSquared","minimumRadius","maximumRadius","centerToleranceSquared","squaredXOverSquaredZ","normal","k","geodeticSurfaceNormalCartographic","gamma","cartesian","point","scaleToGeodeticSurface","h","atan2","asin","_cartographicRadians","cartographicVectorRadians","fromCartographicToRadians","cosLatitude","positionX","positionY","positionZ","oneOverRadiiX","oneOverRadiiY","oneOverRadiiZ","squaredNorm","ratio","intersection","oneOverRadiiSquaredX","oneOverRadiiSquaredY","oneOverRadiiSquaredZ","gradient","xMultiplier","yMultiplier","zMultiplier","lambda","correction","xMultiplier2","yMultiplier2","zMultiplier2","beta","position","_parseImageNode","IMAGE_SUPPORTED","IMAGE_BITMAP_SUPPORTED","NODE_IMAGE_SUPPORTED","DATA_SUPPORTED","getImageType","format","getImageTypeOrNull","getImageData","canvas","createElement","getContext","drawImage","SVG_DATA_URL_PATTERN","SVG_URL_PATTERN","isSVG","getBlobOrSVGDataUrl","xmlText","unescape","encodeURIComponent","getBlob","parseToImage","blobOrDataUrl","webkitURL","objectUrl","loadToImage","revokeObjectURL","EMPTY_OBJECT","imagebitmapOptionsSupported","parseToImageBitmap","imagebitmapOptions","imagebitmap","safeCreateImageBitmap","isEmptyObject","createImageBitmap","getBinaryImageMetadata","binaryData","toDataView","getUint32","getPngMetadata","getUint16","tableMarkers","sofMarkers","getJpegMarkers","has","getJpegMetadata","getGifMetadata","getBmpMetadata","parseToNodeImage","imageOptions","imageType","loadType","getLoadableImageType","getDefaultImageType","isImageTypeSupported","ImageLoader","DracoLoader","shapes","draco","decoderType","WebAssembly","libraryPath","extraAttributes","attributeNameEntry","getMeshBoundingBox","attributes","minX","minY","minZ","maxX","maxY","maxZ","positions","POSITION","Schema","fields","usedNames","field","checkNames","other","compareTo","nameMap","columnNames","selectedFields","filter","columnIndices","schemaOrFields","otherSchema","mergeMaps","fieldMap","m1","m2","Type","Field","nullable","typeId","DataType","NONE","Null","Int","Float","Binary","Utf8","Bool","Decimal","Time","Timestamp","Interval","List","Struct","Union","FixedSizeBinary","FixedSizeList","Dictionary","isSigned","bitWidth","Int8","Int16","Int32","Uint8","Uint16","Uint32","Precision","Float32","Float64","listSize","child","children","valueType","deduceMeshField","attributeName","attribute","optionalMetadata","Int8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float64Array","getArrowTypeFromTypedArray","byteStride","normalized","makeMeshAttributeMetadata","getDracoSchema","loaderData","indices","metadataMap","makeMetadata","namedLoaderDataAttributes","dracoAttribute","transformAttributesLoaderData","getArrowFieldFromAttribute","indicesField","DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP","NORMAL","TEX_COORD","DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP","1","2","3","4","5","6","9","DracoParser","decoder","Decoder","metadataQuerier","MetadataQuerier","DecoderBuffer","Init","_disableAttributeTransforms","geometry_type","GetEncodedGeometryType","dracoGeometry","TRIANGULAR_MESH","Mesh","PointCloud","dracoStatus","DecodeBufferToMesh","POINT_CLOUD","DecodeBufferToPointCloud","ptr","error_msg","_getDracoLoaderData","geometry","_getMeshData","boundingBox","schema","header","vertexCount","num_points","_getTopLevelMetadata","_getDracoAttributes","num_attributes","num_faces","dracoAttributes","attributeId","GetAttribute","_getAttributeMetadata","unique_id","attribute_type","data_type","num_components","byte_offset","byte_stride","attribute_index","quantization","_getQuantizationTransform","quantization_transform","octahedron","_getOctahedronTransform","octahedron_transform","_getMeshAttributes","topology","_getTriangleStripIndices","_getTriangleListIndices","loaderAttribute","_deduceAttributeName","_getAttributeValues","numIndices","_malloc","GetTrianglesUInt32Array","HEAPF32","_free","dracoArray","DracoInt32Array","GetTriangleStripsFromMesh","numValues","intArray","GetValue","getUint32Array","TypedArrayCtor","numComponents","BYTES_PER_ELEMENT","attributeType","DT_FLOAT32","DT_INT8","DT_INT16","DT_INT32","DT_UINT8","DT_UINT16","DT_UINT32","DT_INVALID","getDracoDataType","GetAttributeDataArrayForAllPoints","uniqueId","entries","thisAttributeType","dracoAttributeConstant","entryName","dracoMetadata","GetMetadata","_getDracoMetadata","GetAttributeMetadata","numEntries","NumEntries","entryIndex","GetEntryName","_getDracoMetadataField","GetIntEntryArray","getInt32Array","int","GetIntEntry","GetStringEntry","double","GetDoubleEntry","quantizedAttributes","octahedronAttributes","dracoAttributeName","SkipAttributeTransform","transform","AttributeQuantizationTransform","InitFromAttribute","quantization_bits","range","min_values","min_value","loadLibraryPromises","loadLibrary","libraryUrl","moduleName","getLibraryUrl","loadLibraryFromFile","library","endsWith","node","scriptSource","loadLibraryFromString","eval","script","appendChild","createTextNode","loadDecoderPromise","DRACO_JS_DECODER_URL","DRACO_WASM_WRAPPER_URL","DRACO_WASM_DECODER_URL","loadDracoDecoderModule","draco3d","createDecoderModule","loadDracoDecoder","DracoDecoderModule","all","wasmBinary","initializeDracoDecoder","onModuleLoaded","DracoWorkerLoader","dracoParser","BASISLZ","ZSTD","ZLIB","BASICFORMAT","UNSPECIFIED","ETC1S","UASTC","SRGB","LINEAR","ITU","NTSC","SLOG","SLOG2","ALPHA_STRAIGHT","ALPHA_PREMULTIPLIED","RGB","RRR","GGG","AAA","RGBA","RRRG","U","vkFormat","typeSize","pixelWidth","pixelHeight","pixelDepth","layerCount","faceCount","supercompressionScheme","levels","dataFormatDescriptor","vendorId","descriptorType","versionNumber","descriptorBlockSize","colorModel","colorPrimaries","transferFunction","flags","texelBlockDimension","bytesPlane","samples","keyValue","globalData","_dataView","_littleEndian","_offset","_","Buffer","extractMipmapImages","images","mipMapLevels","levelWidth","levelHeight","levelSize","getLevelSize","levelData","getLevelData","compressed","internalFormat","sizeFunction","GL","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_R11_EAC","COMPRESSED_SIGNED_R11_EAC","COMPRESSED_RG11_EAC","COMPRESSED_SIGNED_RG11_EAC","COMPRESSED_RGB8_ETC2","COMPRESSED_RGBA8_ETC2_EAC","COMPRESSED_SRGB8_ETC2","COMPRESSED_SRGB8_ALPHA8_ETC2_EAC","COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2","COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","COMPRESSED_RGB_ATC_WEBGL","COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL","COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL","COMPRESSED_RGBA_ASTC_4X4_KHR","COMPRESSED_RGBA_ASTC_5X4_KHR","COMPRESSED_RGBA_ASTC_5X5_KHR","COMPRESSED_RGBA_ASTC_6X5_KHR","COMPRESSED_RGBA_ASTC_6X6_KHR","COMPRESSED_RGBA_ASTC_8X5_KHR","COMPRESSED_RGBA_ASTC_8X6_KHR","COMPRESSED_RGBA_ASTC_8X8_KHR","COMPRESSED_RGBA_ASTC_10X5_KHR","COMPRESSED_RGBA_ASTC_10X6_KHR","COMPRESSED_RGBA_ASTC_10X8_KHR","COMPRESSED_RGBA_ASTC_10X10_KHR","COMPRESSED_RGBA_ASTC_12X10_KHR","COMPRESSED_RGBA_ASTC_12X12_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR","COMPRESSED_RED_RGTC1_EXT","COMPRESSED_SIGNED_RED_RGTC1_EXT","COMPRESSED_RED_GREEN_RGTC2_EXT","COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT","COMPRESSED_SRGB_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT","VULKAN_TO_WEBGL_FORMAT_MAP","131","132","133","134","135","136","137","138","139","140","141","142","147","148","149","150","151","152","153","154","155","156","157","COMPRESSED_RGBA_ASTC_4x4_KHR","158","COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR","159","COMPRESSED_RGBA_ASTC_5x4_KHR","160","161","COMPRESSED_RGBA_ASTC_5x5_KHR","162","COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR","163","COMPRESSED_RGBA_ASTC_6x5_KHR","164","COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR","165","COMPRESSED_RGBA_ASTC_6x6_KHR","166","COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR","167","COMPRESSED_RGBA_ASTC_8x5_KHR","168","COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR","169","COMPRESSED_RGBA_ASTC_8x6_KHR","170","COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR","171","COMPRESSED_RGBA_ASTC_8x8_KHR","172","COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR","173","COMPRESSED_RGBA_ASTC_10x5_KHR","174","COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR","175","COMPRESSED_RGBA_ASTC_10x6_KHR","176","COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR","177","COMPRESSED_RGBA_ASTC_10x8_KHR","178","COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR","179","COMPRESSED_RGBA_ASTC_10x10_KHR","180","COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR","181","COMPRESSED_RGBA_ASTC_12x10_KHR","182","COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR","183","COMPRESSED_RGBA_ASTC_12x12_KHR","184","COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR","1000054000","1000054001","1000066000","1000066001","1000066002","1000066003","1000066004","1000066005","1000066006","1000066007","1000066008","1000066009","1000066010","1000066011","1000066012","1000066013","KTX2_ID","parseKTX","ktx","_nextUint32","_nextUint64","uncompressedByteLength","u","_skip","_nextUint16","_nextUint8","D","bitOffset","bitLength","channelID","samplePosition","sampleLower","sampleUpper","_scan","B","A","S","L","I","imageFlags","rgbSliceByteOffset","rgbSliceByteLength","alphaSliceByteOffset","alphaSliceByteLength","R","E","T","O","P","C","F","G","endpointCount","selectorCount","imageDescs","endpointsData","selectorsData","tablesData","extendedData","DDS_CONSTANTS","MAGIC_NUMBER","HEADER_LENGTH","MAGIC_NUMBER_INDEX","HEADER_SIZE_INDEX","HEADER_FLAGS_INDEX","HEADER_HEIGHT_INDEX","HEADER_WIDTH_INDEX","MIPMAPCOUNT_INDEX","HEADER_PF_FLAGS_INDEX","HEADER_PF_FOURCC_INDEX","DDSD_MIPMAPCOUNT","DDPF_FOURCC","PIXEL_FORMATS","DXT1","DXT3","DXT5","ATCA","ATCI","SIZE_FUNCTIONS","getDxt1LevelSize","getDxtXLevelSize","parseDDS","pixelFormatNumber","fourCC","dataOffset","loadBasisTranscoderPromise","loadBasisEncoderPromise","PVR_CONSTANTS","PVR_PIXEL_FORMATS","0","7","11","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","PVR_SIZE_FUNCTIONS","pvrtc2bppSize","pvrtc4bppSize","dxtEtcSmallSize","dxtEtcAstcBigSize","parseCompressedTexture","isKTX","isDDS","isPVR","pvrFormat","colourSpace","pixelFormats","parsePVR","loadBasisTrascoderModule","basis","loadBasisTrascoder","BASIS","initializeBasisTrascoderModule","BasisModule","BasisFile","initializeBasis","loadBasisEncoderModule","basisEncoder","loadBasisEncoder","BASIS_ENCODER","initializeBasisEncoderModule","BasisEncoderModule","KTX2File","BROWSER_PREFIXES","WEBGL_EXTENSIONS","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_pvrtc","WEBGL_compressed_texture_atc","WEBGL_compressed_texture_astc","EXT_texture_compression_rgtc","formats","getSupportedGPUTextureFormats","gl","getWebGLContext","getExtension","gpuTextureFormat","OutputFormat","etc1","basisFormat","etc2","bc1","bc3","bc4","bc5","rgba32","rgb565","bgr565","rgba4444","parseBasis","fileConstructors","decoderFormat","parseKTX2File","parseBasisFile","basisFile","startTranscoding","imageCount","getNumImages","imageIndex","levelsCount","getNumLevels","levelIndex","transcodeImage","close","getImageWidth","getImageHeight","hasAlpha","getHasAlpha","getBasisOptions","decodedSize","getImageTranscodedSizeInBytes","decodedData","ktx2File","getLevels","transcodeKTX2Image","getImageLevelInfo","alphaFlag","supportedFormats","alpha","noAlpha","selectSupportedFormat","CompressedTextureWorkerLoader","useBasis","CompressedTextureLoader","BasisWorkerLoader","BasisLoader","getUrlWithToken","token","TYPE_ARRAY_MAP","UInt8","UInt16","UInt32","UInt64","GL_TYPE_MAP","I3S_NAMED_VERTEX_ATTRIBUTES","uv0","region","I3S_NAMED_GEOMETRY_ATTRIBUTES","vertexAttributes","featureAttributeOrder","featureAttributes","I3S_NAMED_HEADER_ATTRIBUTES","SIZEOF","Vector3","FORMAT_LOADER_MAP","jpeg","png","dds","ktx2","parseI3STileContent","tile","tileset","content","featureIds","featureData","constructFeatureDataStruct","textureUrl","i3s","textureFormat","textureLoaderOptions","texture","mipmaps","material","makePbrMaterial","materialDefinition","parseI3SNodeGeometry","featureCount","isDracoGeometry","decompressedGeometry","COLOR_0","TEXCOORD_0","featureIndex","uvRegion","updateAttributesMetadata","getFeatureIdsFromFeatureIndexMetadata","flattenFeatureIdsByFeatureIndices","attributesOrder","parseHeaders","normalizeAttributes","normalizedVertexAttributes","flattenFeatureIdsByFaceRanges","normalizedFeatureAttributes","concatAttributes","attributeIndex","parsePositions","enuMatrix","cartographicOrigin","matrix","Matrix4","multiplyRight","normals","colors","normalizeAttribute","texCoords","uvRegions","cartographicCenter","modelMatrix","invert","defaultGeometrySchema","store","geometryAttribute","namedAttribute","valuesPerElement","ordering","TypedArrayTypeHeader","parseUint64Values","TypedArrayType","elementsCount","attributeSize","mbs","Ellipsoid","WGS84","cartographicToCartesian","eastNorthUpToFixedFrame","vertices","scaleX","scaleY","subarray","offsetsToCartesians","fixedFrameToENUMatrix","pbrMaterial","pbrMetallicRoughness","baseColorFactor","baseColorTexture","texCoord","alphaCutoff","alphaMode","emissiveFactor","convertColorFormat","emissiveTexture","metallicRoughnessTexture","normalTexture","occlusionTexture","setMaterialTexture","colorFactor","normalizedColor","faceRange","featureIdsLength","orderedFeatureIndices","startIndex","fillId","endIndex","featureIndices"],"mappings":"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","file":"i3s-content-worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 54);\n","module.exports = require(\"regenerator-runtime\");\n","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var arrayWithoutHoles = require(\"./arrayWithoutHoles.js\");\n\nvar iterableToArray = require(\"./iterableToArray.js\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\n\nvar nonIterableSpread = require(\"./nonIterableSpread.js\");\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","// Purpose: include this in your module to avoids adding dependencies on\n// micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n self: typeof self !== 'undefined' && self,\n window: typeof window !== 'undefined' && window,\n global: typeof global !== 'undefined' && global,\n document: typeof document !== 'undefined' && document\n};\n\nconst self_: {[key: string]: any} = globals.self || globals.window || globals.global || {};\nconst window_: {[key: string]: any} = globals.window || globals.self || globals.global || {};\nconst global_: {[key: string]: any} = globals.global || globals.self || globals.window || {};\nconst document_: {[key: string]: any} = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\n/** true if running in the browser, false if running in Node.js */\nexport const isBrowser: boolean =\n // @ts-ignore process.browser\n typeof process !== 'object' || String(process) !== '[object process]' || process.browser;\n\n/** true if running on a worker thread */\nexport const isWorker: boolean = typeof importScripts === 'function';\n\n/** true if running on a mobile device */\nexport const isMobile: boolean =\n typeof window !== 'undefined' && typeof window.orientation !== 'undefined';\n\n// Extract node major version\nconst matches =\n typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\n\n/** Version of Node.js if running under Node, otherwise 0 */\nexport const nodeVersion: number = (matches && parseFloat(matches[1])) || 0;\n","// Purpose: include this in your module to avoid\n// dependencies on micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n self: typeof self !== 'undefined' && self,\n window: typeof window !== 'undefined' && window,\n global: typeof global !== 'undefined' && global,\n document: typeof document !== 'undefined' && document\n};\n\ntype obj = {[key: string]: any};\nconst self_: obj = globals.self || globals.window || globals.global || {};\nconst window_: obj = globals.window || globals.self || globals.global || {};\nconst global_: obj = globals.global || globals.self || globals.window || {};\nconst document_: obj = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\n/** true if running in a browser */\nexport const isBrowser: boolean =\n // @ts-ignore process does not exist on browser\n Boolean(typeof process !== 'object' || String(process) !== '[object process]' || process.browser);\n\n/** true if running in a worker thread */\nexport const isWorker: boolean = typeof importScripts === 'function';\n\n// Extract node major version\nconst matches =\n typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\n/** Major Node version (as a number) */\nexport const nodeVersion: number = (matches && parseFloat(matches[1])) || 0;\n","const globals = {\n self: typeof self !== 'undefined' && self,\n window: typeof window !== 'undefined' && window,\n global: typeof global !== 'undefined' && global,\n document: typeof document !== 'undefined' && document,\n process: typeof process === 'object' && process\n};\nconst self_ = globals.self || globals.window || globals.global;\nconst window_ = globals.window || globals.self || globals.global;\nconst global_ = globals.global || globals.self || globals.window;\nconst document_ = globals.document || {};\nconst process_ = globals.process || {};\nconst console_ = console;\nexport { self_ as self, window_ as window, global_ as global, document_ as document, process_ as process, console_ as console };\n//# sourceMappingURL=globals.js.map","var arrayWithHoles = require(\"./arrayWithHoles.js\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\n\nvar nonIterableRest = require(\"./nonIterableRest.js\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var AwaitValue = require(\"./AwaitValue.js\");\n\nfunction _awaitAsyncGenerator(value) {\n return new AwaitValue(value);\n}\n\nmodule.exports = _awaitAsyncGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","// 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;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\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","var AsyncGenerator = require(\"./AsyncGenerator.js\");\n\nfunction _wrapAsyncGenerator(fn) {\n return function () {\n return new AsyncGenerator(fn.apply(this, arguments));\n };\n}\n\nmodule.exports = _wrapAsyncGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _asyncIterator(iterable) {\n var method;\n\n if (typeof Symbol !== \"undefined\") {\n if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];\n if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];\n }\n\n if (method == null) method = iterable[\"@@asyncIterator\"];\n if (method == null) method = iterable[\"@@iterator\"];\n if (method == null) throw new TypeError(\"Object is not async iterable\");\n return method.call(iterable);\n}\n\nmodule.exports = _asyncIterator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _AwaitValue(value) {\n this.wrapped = value;\n}\n\nmodule.exports = _AwaitValue;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","import isElectron from './is-electron';\nexport default function isBrowser() {\n const isNode = typeof process === 'object' && String(process) === '[object process]' && !process.browser;\n return !isNode || isElectron();\n}\nexport function isBrowserMainThread() {\n return isBrowser() && typeof document !== 'undefined';\n}\n//# sourceMappingURL=is-browser.js.map","export default function isElectron(mockUserAgent) {\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\n return true;\n }\n\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && Boolean(process.versions.electron)) {\n return true;\n }\n\n const realUserAgent = typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent;\n const userAgent = mockUserAgent || realUserAgent;\n\n if (userAgent && userAgent.indexOf('Electron') >= 0) {\n return true;\n }\n\n return false;\n}\n//# sourceMappingURL=is-electron.js.map","var _typeof = require(\"@babel/runtime/helpers/typeof\")[\"default\"];\n\nvar assertThisInitialized = require(\"./assertThisInitialized.js\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableSpread;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _iterableToArrayLimit(arr, i) {\n var _i = arr && (typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]);\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableRest;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","var AwaitValue = require(\"./AwaitValue.js\");\n\nfunction AsyncGenerator(gen) {\n var front, back;\n\n function send(key, arg) {\n return new Promise(function (resolve, reject) {\n var request = {\n key: key,\n arg: arg,\n resolve: resolve,\n reject: reject,\n next: null\n };\n\n if (back) {\n back = back.next = request;\n } else {\n front = back = request;\n resume(key, arg);\n }\n });\n }\n\n function resume(key, arg) {\n try {\n var result = gen[key](arg);\n var value = result.value;\n var wrappedAwait = value instanceof AwaitValue;\n Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {\n if (wrappedAwait) {\n resume(key === \"return\" ? \"return\" : \"next\", arg);\n return;\n }\n\n settle(result.done ? \"return\" : \"normal\", arg);\n }, function (err) {\n resume(\"throw\", err);\n });\n } catch (err) {\n settle(\"throw\", err);\n }\n }\n\n function settle(type, value) {\n switch (type) {\n case \"return\":\n front.resolve({\n value: value,\n done: true\n });\n break;\n\n case \"throw\":\n front.reject(value);\n break;\n\n default:\n front.resolve({\n value: value,\n done: false\n });\n break;\n }\n\n front = front.next;\n\n if (front) {\n resume(front.key, front.arg);\n } else {\n back = null;\n }\n }\n\n this._invoke = send;\n\n if (typeof gen[\"return\"] !== \"function\") {\n this[\"return\"] = undefined;\n }\n}\n\nAsyncGenerator.prototype[typeof Symbol === \"function\" && Symbol.asyncIterator || \"@@asyncIterator\"] = function () {\n return this;\n};\n\nAsyncGenerator.prototype.next = function (arg) {\n return this._invoke(\"next\", arg);\n};\n\nAsyncGenerator.prototype[\"throw\"] = function (arg) {\n return this._invoke(\"throw\", arg);\n};\n\nAsyncGenerator.prototype[\"return\"] = function (arg) {\n return this._invoke(\"return\", arg);\n};\n\nmodule.exports = AsyncGenerator;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports[\"default\"] = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;","// NOTE - there is a copy of this function is both in core and loader-utils\n// core does not need all the utils in loader-utils, just this one.\n\n/**\n * Returns an array of Transferrable objects that can be used with postMessage\n * https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage\n * @param object data to be sent via postMessage\n * @param recursive - not for application use\n * @param transfers - not for application use\n * @returns a transfer list that can be passed to postMessage\n */\nexport function getTransferList(\n object: any,\n recursive: boolean = true,\n transfers?: Set<any>\n): Transferable[] {\n // Make sure that items in the transfer list is unique\n const transfersSet = transfers || new Set();\n\n if (!object) {\n // ignore\n } else if (isTransferable(object)) {\n transfersSet.add(object);\n } else if (isTransferable(object.buffer)) {\n // Typed array\n transfersSet.add(object.buffer);\n } else if (ArrayBuffer.isView(object)) {\n // object is a TypeArray viewing into a SharedArrayBuffer (not transferable)\n // Do not iterate through the content in this case\n } else if (recursive && typeof object === 'object') {\n for (const key in object) {\n // Avoid perf hit - only go one level deep\n getTransferList(object[key], recursive, transfersSet);\n }\n }\n\n // If transfers is defined, is internal recursive call\n // Otherwise it's called by the user\n return transfers === undefined ? Array.from(transfersSet) : [];\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Transferable\nfunction isTransferable(object) {\n if (!object) {\n return false;\n }\n if (object instanceof ArrayBuffer) {\n return true;\n }\n if (typeof MessagePort !== 'undefined' && object instanceof MessagePort) {\n return true;\n }\n if (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap) {\n return true;\n }\n // @ts-ignore\n if (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) {\n return true;\n }\n return false;\n}\n","import type {WorkerMessageData, WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport {getTransferList} from '../worker-utils/get-transfer-list';\n\nconst onMessageWrapperMap = new Map();\n\n/**\n * Type safe wrapper for worker code\n */\nexport default class WorkerBody {\n /*\n * (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n */\n static set onmessage(onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any) {\n // eslint-disable-next-line no-restricted-globals\n self.onmessage = (message) => {\n if (!isKnownMessage(message)) {\n return;\n }\n\n // Confusingly the message itself also has a 'type' field which is always set to 'message'\n const {type, payload} = message.data;\n onMessage(type, payload);\n };\n }\n\n static addEventListener(\n onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n ) {\n let onMessageWrapper = onMessageWrapperMap.get(onMessage);\n\n if (!onMessageWrapper) {\n onMessageWrapper = (message) => {\n if (!isKnownMessage(message)) {\n return;\n }\n\n // Confusingly the message itself also has a 'type' field which is always set to 'message'\n const {type, payload} = message.data;\n onMessage(type, payload);\n };\n }\n\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('message', onMessageWrapper);\n }\n\n static removeEventListener(\n onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n ) {\n const onMessageWrapper = onMessageWrapperMap.get(onMessage);\n onMessageWrapperMap.delete(onMessage);\n // eslint-disable-next-line no-restricted-globals\n self.removeEventListener('message', onMessageWrapper);\n }\n\n /**\n * Send a message from a worker to creating thread (main thread)\n * @param type\n * @param payload\n */\n static postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): void {\n if (self) {\n const data: WorkerMessageData = {source: 'loaders.gl', type, payload};\n const transferList = getTransferList(payload);\n // eslint-disable-next-line no-restricted-globals\n // @ts-ignore\n self.postMessage(data, transferList);\n }\n }\n}\n\n// Filter out noise messages sent to workers\nfunction isKnownMessage(message) {\n const {type, data} = message;\n return (\n type === 'message' &&\n data &&\n typeof data.source === 'string' &&\n data.source.startsWith('loaders.gl')\n );\n}\n","/* eslint-disable no-restricted-globals */\nimport type {LoaderWithParser} from '../../types';\nimport {WorkerBody} from '@loaders.gl/worker-utils';\n// import {validateLoaderVersion} from './validate-loader-version';\n\nlet requestId = 0;\n\n/**\n * Set up a WebWorkerGlobalScope to talk with the main thread\n * @param loader\n */\nexport function createLoaderWorker(loader: LoaderWithParser) {\n // Check that we are actually in a worker thread\n if (typeof self === 'undefined') {\n return;\n }\n\n WorkerBody.onmessage = async (type, payload) => {\n switch (type) {\n case 'process':\n try {\n // validateLoaderVersion(loader, data.source.split('@')[1]);\n\n const {input, options = {}} = payload;\n\n const result = await parseData({\n loader,\n arrayBuffer: input,\n options,\n context: {\n parse: parseOnMainThread\n }\n });\n WorkerBody.postMessage('done', {result});\n } catch (error) {\n const message = error instanceof Error ? error.message : '';\n WorkerBody.postMessage('error', {error: message});\n }\n break;\n default:\n }\n };\n}\n\nfunction parseOnMainThread(arrayBuffer: ArrayBuffer, options: {[key: string]: any}): Promise<void> {\n return new Promise((resolve, reject) => {\n const id = requestId++;\n\n /**\n */\n const onMessage = (type, payload) => {\n if (payload.id !== id) {\n // not ours\n return;\n }\n\n switch (type) {\n case 'done':\n WorkerBody.removeEventListener(onMessage);\n resolve(payload.result);\n break;\n\n case 'error':\n WorkerBody.removeEventListener(onMessage);\n reject(payload.error);\n break;\n\n default:\n // ignore\n }\n };\n\n WorkerBody.addEventListener(onMessage);\n\n // Ask the main thread to decode data\n const payload = {id, input: arrayBuffer, options};\n WorkerBody.postMessage('process', payload);\n });\n}\n\n// TODO - Support byteOffset and byteLength (enabling parsing of embedded binaries without copies)\n// TODO - Why not support async loader.parse* funcs here?\n// TODO - Why not reuse a common function instead of reimplementing loader.parse* selection logic? Keeping loader small?\n// TODO - Lack of appropriate parser functions can be detected when we create worker, no need to wait until parse\nasync function parseData({loader, arrayBuffer, options, context}) {\n let data;\n let parser;\n if (loader.parseSync || loader.parse) {\n data = arrayBuffer;\n parser = loader.parseSync || loader.parse;\n } else if (loader.parseTextSync) {\n const textDecoder = new TextDecoder();\n data = textDecoder.decode(arrayBuffer);\n parser = loader.parseTextSync;\n } else {\n throw new Error(`Could not load data with ${loader.name} loader`);\n }\n\n // TODO - proper merge in of loader options...\n options = {\n ...options,\n modules: (loader && loader.options && loader.options.modules) || {},\n worker: false\n };\n\n return await parser(data, {...options}, context, loader);\n}\n","import type {Readable} from 'stream';\n\n/** A DOM or Node readable stream */\nexport type ReadableStreamType = ReadableStream | Readable;\n\nconst isBoolean: (x: any) => boolean = (x) => typeof x === 'boolean';\nconst isFunction: (x: any) => boolean = (x) => typeof x === 'function';\n\nexport const isObject: (x: any) => boolean = (x) => x !== null && typeof x === 'object';\nexport const isPureObject: (x: any) => boolean = (x) =>\n isObject(x) && x.constructor === {}.constructor;\nexport const isPromise: (x: any) => boolean = (x) => isObject(x) && isFunction(x.then);\n\nexport const isIterable: (x: any) => boolean = (x) => x && typeof x[Symbol.iterator] === 'function';\nexport const isAsyncIterable: (x: any) => boolean = (x) =>\n x && typeof x[Symbol.asyncIterator] === 'function';\nexport const isIterator: (x: any) => boolean = (x) => x && isFunction(x.next);\n\nexport const isResponse: (x: any) => boolean = (x) =>\n (typeof Response !== 'undefined' && x instanceof Response) ||\n (x && x.arrayBuffer && x.text && x.json);\n\nexport const isFile: (x: any) => boolean = (x) => typeof File !== 'undefined' && x instanceof File;\nexport const isBlob: (x: any) => boolean = (x) => typeof Blob !== 'undefined' && x instanceof Blob;\n\n/** Check for Node.js `Buffer` without triggering bundler to include buffer polyfill */\nexport const isBuffer: (x: any) => boolean = (x) => x && typeof x === 'object' && x.isBuffer;\n\nexport const isWritableDOMStream: (x: any) => boolean = (x) =>\n isObject(x) && isFunction(x.abort) && isFunction(x.getWriter);\n\nexport const isReadableDOMStream: (x: any) => boolean = (x) =>\n (typeof ReadableStream !== 'undefined' && x instanceof ReadableStream) ||\n (isObject(x) && isFunction(x.tee) && isFunction(x.cancel) && isFunction(x.getReader));\n// Not implemented in Firefox: && isFunction(x.pipeTo)\n\nexport const isWritableNodeStream: (x: any) => boolean = (x) =>\n isObject(x) && isFunction(x.end) && isFunction(x.write) && isBoolean(x.writable);\nexport const isReadableNodeStream: (x: any) => boolean = (x) =>\n isObject(x) && isFunction(x.read) && isFunction(x.pipe) && isBoolean(x.readable);\nexport const isReadableStream: (x: any) => boolean = (x) =>\n isReadableDOMStream(x) || isReadableNodeStream(x);\nexport const isWritableStream: (x: any) => boolean = (x) =>\n isWritableDOMStream(x) || isWritableNodeStream(x);\n","/**\n * Throws an `Error` with the optional `message` if `condition` is falsy\n * @note Replacement for the external assert method to reduce bundle size\n */\nexport function assert(condition: any, message?: string): void {\n if (!condition) {\n throw new Error(message || 'loader assertion failed.');\n }\n}\n","import type {Loader} from '@loaders.gl/loader-utils';\nimport {assert} from '@loaders.gl/loader-utils';\n\nexport function isLoaderObject(loader?: any): boolean {\n if (!loader) {\n return false;\n }\n\n if (Array.isArray(loader)) {\n loader = loader[0];\n }\n\n const hasExtensions = Array.isArray(loader?.extensions);\n\n /* Now handled by types and worker loaders do not have these\n let hasParser =\n loader.parseTextSync ||\n loader.parseSync ||\n loader.parse ||\n loader.parseStream || // TODO Remove, Replace with parseInBatches\n loader.parseInBatches;\n */\n\n return hasExtensions;\n}\n\nexport function normalizeLoader(loader: Loader): Loader {\n // This error is fairly easy to trigger by mixing up import statements etc\n // So we make an exception and add a developer error message for this case\n // To help new users from getting stuck here\n assert(loader, 'null loader');\n assert(isLoaderObject(loader), 'invalid loader');\n\n // NORMALIZE [LOADER, OPTIONS] => LOADER\n\n // If [loader, options], create a new loaders object with options merged in\n let options;\n if (Array.isArray(loader)) {\n options = loader[1];\n loader = loader[0];\n loader = {\n ...loader,\n options: {...loader.options, ...options}\n };\n }\n\n // NORMALIZE text and binary flags\n // Ensure at least one of text/binary flags are properly set\n\n // @ts-expect-error\n if (loader?.parseTextSync || loader?.parseText) {\n loader.text = true;\n }\n\n if (!loader.text) {\n loader.binary = true;\n }\n\n return loader;\n}\n","// Simple file alias mechanisms for tests.\n\nlet pathPrefix = '';\nconst fileAliases: {[aliasPath: string]: string} = {};\n\n/*\n * Set a relative path prefix\n */\nexport function setPathPrefix(prefix: string): void {\n pathPrefix = prefix;\n}\n\n/*\n * Get the relative path prefix\n */\nexport function getPathPrefix(): string {\n return pathPrefix;\n}\n\n/**\n *\n * @param aliases\n *\n * Note: addAliases are an experimental export, they are only for testing of loaders.gl loaders\n * not intended as a generic aliasing mechanism\n */\nexport function addAliases(aliases: {[aliasPath: string]: string}): void {\n Object.assign(fileAliases, aliases);\n}\n\n/**\n * Resolves aliases and adds path-prefix to paths\n */\nexport function resolvePath(filename: string): string {\n for (const alias in fileAliases) {\n if (filename.startsWith(alias)) {\n const replacement = fileAliases[alias];\n filename = filename.replace(alias, replacement);\n }\n }\n if (!filename.startsWith('http://') && !filename.startsWith('https://')) {\n filename = `${pathPrefix}${filename}`;\n }\n return filename;\n}\n","// TODO - build/integrate proper MIME type parsing\n// https://mimesniff.spec.whatwg.org/\n\nconst DATA_URL_PATTERN = /^data:([-\\w.]+\\/[-\\w.+]+)(;|,)/;\nconst MIME_TYPE_PATTERN = /^([-\\w.]+\\/[-\\w.+]+)/;\n\n/**\n * Remove extra data like `charset` from MIME types\n * @param mimeString\n * @returns A clean MIME type, or an empty string\n *\n * @todo - handle more advanced MIMETYpes, multiple types\n * @todo - extract charset etc\n */\nexport function parseMIMEType(mimeString: string): string {\n // If resource is a data url, extract any embedded mime type\n const matches = MIME_TYPE_PATTERN.exec(mimeString);\n if (matches) {\n return matches[1];\n }\n return mimeString;\n}\n\n/**\n * Extract MIME type from data URL\n *\n * @param mimeString\n * @returns A clean MIME type, or an empty string\n *\n * @todo - handle more advanced MIMETYpes, multiple types\n * @todo - extract charset etc\n */\nexport function parseMIMETypeFromURL(url: string): string {\n // If resource is a data URL, extract any embedded mime type\n const matches = DATA_URL_PATTERN.exec(url);\n if (matches) {\n return matches[1];\n }\n return '';\n}\n","import {isResponse, isBlob} from '../../javascript-utils/is-type';\nimport {parseMIMEType, parseMIMETypeFromURL} from './mime-type-utils';\n\nconst QUERY_STRING_PATTERN = /\\?.*/;\n\n/**\n * Returns an object with `url` and (MIME) `type` fields\n * If it cannot determine url or type, the corresponding value will be an empty string\n *\n * @param resource Any type, but only Responses, string URLs and data URLs are processed\n *\n * @todo string parameters are assumed to be URLs\n */\nexport function getResourceUrlAndType(resource: any): {url: string; type: string} {\n // If resource is a response, it contains the information directly\n if (isResponse(resource)) {\n const url = stripQueryString(resource.url || '');\n const contentTypeHeader = resource.headers.get('content-type') || '';\n return {\n url,\n type: parseMIMEType(contentTypeHeader) || parseMIMETypeFromURL(url)\n };\n }\n\n // If the resource is a Blob or a File (subclass of Blob)\n if (isBlob(resource)) {\n return {\n // File objects have a \"name\" property. Blob objects don't have any\n // url (name) information\n url: stripQueryString(resource.name || ''),\n type: resource.type || ''\n };\n }\n\n if (typeof resource === 'string') {\n return {\n // TODO this could mess up data URL but it doesn't matter as it is just used for inference\n url: stripQueryString(resource),\n // If a data url\n type: parseMIMETypeFromURL(resource)\n };\n }\n\n // Unknown\n return {\n url: '',\n type: ''\n };\n}\n\n/**\n * Returns (approximate) content length for a resource if it can be determined.\n * Returns -1 if content length cannot be determined.\n * @param resource\n\n * @note string parameters are NOT assumed to be URLs\n */\nexport function getResourceContentLength(resource: any): number {\n if (isResponse(resource)) {\n return resource.headers['content-length'] || -1;\n }\n if (isBlob(resource)) {\n return resource.size;\n }\n if (typeof resource === 'string') {\n // TODO - handle data URL?\n return resource.length;\n }\n if (resource instanceof ArrayBuffer) {\n return resource.byteLength;\n }\n if (ArrayBuffer.isView(resource)) {\n return resource.byteLength;\n }\n return -1;\n}\n\nfunction stripQueryString(url) {\n return url.replace(QUERY_STRING_PATTERN, '');\n}\n","import {isResponse} from '../../javascript-utils/is-type';\nimport {getResourceContentLength, getResourceUrlAndType} from './resource-utils';\n\n/**\n * Returns a Response object\n * Adds content-length header when possible\n *\n * @param resource\n */\nexport async function makeResponse(resource: any): Promise<Response> {\n if (isResponse(resource)) {\n return resource;\n }\n\n // Add content-length header if possible\n const headers: {[header: string]: string} = {};\n\n const contentLength = getResourceContentLength(resource);\n if (contentLength >= 0) {\n headers['content-length'] = String(contentLength);\n }\n\n // `new Response(File)` does not preserve content-type and URL\n // so we add them here\n const {url, type} = getResourceUrlAndType(resource);\n if (type) {\n headers['content-type'] = type;\n }\n\n // Add a custom header with initial bytes if available\n const initialDataUrl = await getInitialDataUrl(resource);\n if (initialDataUrl) {\n headers['x-first-bytes'] = initialDataUrl;\n }\n\n // TODO - is this the best way of handling strings?\n // Maybe package as data URL instead?\n if (typeof resource === 'string') {\n // Convert to ArrayBuffer to avoid Response treating it as a URL\n resource = new TextEncoder().encode(resource);\n }\n\n // Attempt to create a Response from the resource, adding headers and setting url\n const response = new Response(resource, {headers});\n // We can't control `Response.url` via constructor, use a property override to record URL.\n Object.defineProperty(response, 'url', {value: url});\n return response;\n}\n\n/**\n * Checks response status (async) and throws a helpful error message if status is not OK.\n * @param response\n */\nexport async function checkResponse(response: Response): Promise<void> {\n if (!response.ok) {\n const message = await getResponseError(response);\n throw new Error(message);\n }\n}\n\n/**\n * Checks response status (sync) and throws a helpful error message if status is not OK.\n * @param response\n */\nexport function checkResponseSync(response: Response): void {\n if (!response.ok) {\n let message = `${response.status} ${response.statusText}`;\n message = message.length > 60 ? `${message.slice(60)}...` : message;\n throw new Error(message);\n }\n}\n\n// HELPERS\n\nasync function getResponseError(response): Promise<string> {\n let message = `Failed to fetch resource ${response.url} (${response.status}): `;\n try {\n const contentType = response.headers.get('Content-Type');\n let text = response.statusText;\n if (contentType.includes('application/json')) {\n text += ` ${await response.text()}`;\n }\n message += text;\n message = message.length > 60 ? `${message.slice(60)}...` : message;\n } catch (error) {\n // eslint forbids return in a finally statement, so we just catch here\n }\n return message;\n}\n\nasync function getInitialDataUrl(resource): Promise<string | null> {\n const INITIAL_DATA_LENGTH = 5;\n if (typeof resource === 'string') {\n return `data:,${resource.slice(0, INITIAL_DATA_LENGTH)}`;\n }\n if (resource instanceof Blob) {\n const blobSlice = resource.slice(0, 5);\n return await new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (event) => resolve(event?.target?.result as string);\n reader.readAsDataURL(blobSlice);\n });\n }\n if (resource instanceof ArrayBuffer) {\n const slice = resource.slice(0, INITIAL_DATA_LENGTH);\n const base64 = arrayBufferToBase64(slice);\n return `data:base64,${base64}`;\n }\n return null;\n}\n\n// https://stackoverflow.com/questions/9267899/arraybuffer-to-base64-encoded-string\nfunction arrayBufferToBase64(buffer) {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n","import {resolvePath} from '@loaders.gl/loader-utils';\nimport {makeResponse} from '../utils/response-utils';\n// import {getErrorMessageFromResponse} from './fetch-error-message';\n\n/**\n * fetch compatible function\n * Reads file data from:\n * - http/http urls\n * - data urls\n * - File/Blob objects\n * Leverages `@loaders.gl/polyfills` for Node.js support\n * Respects pathPrefix and file aliases\n */\nexport async function fetchFile(\n url: string | Blob,\n options?: RequestInit & {fetch?: RequestInit | Function}\n): Promise<Response> {\n if (typeof url === 'string') {\n url = resolvePath(url);\n\n let fetchOptions: RequestInit = options as RequestInit;\n if (options?.fetch && typeof options?.fetch !== 'function') {\n fetchOptions = options.fetch;\n }\n\n return await fetch(url, fetchOptions);\n }\n\n return await makeResponse(url);\n}\n","import checkIfBrowser from '../env/is-browser';\nexport { self, window, global, document, process, console } from '../env/globals';\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'untranspiled source';\nexport const isBrowser = checkIfBrowser();\n//# sourceMappingURL=globals.js.map","function getStorage(type) {\n try {\n const storage = window[type];\n const x = '__storage_test__';\n storage.setItem(x, x);\n storage.removeItem(x);\n return storage;\n } catch (e) {\n return null;\n }\n}\n\nexport default class LocalStorage {\n constructor(id, defaultSettings, type = 'sessionStorage') {\n this.storage = getStorage(type);\n this.id = id;\n this.config = {};\n Object.assign(this.config, defaultSettings);\n\n this._loadConfiguration();\n }\n\n getConfiguration() {\n return this.config;\n }\n\n setConfiguration(configuration) {\n this.config = {};\n return this.updateConfiguration(configuration);\n }\n\n updateConfiguration(configuration) {\n Object.assign(this.config, configuration);\n\n if (this.storage) {\n const serialized = JSON.stringify(this.config);\n this.storage.setItem(this.id, serialized);\n }\n\n return this;\n }\n\n _loadConfiguration() {\n let configuration = {};\n\n if (this.storage) {\n const serializedConfiguration = this.storage.getItem(this.id);\n configuration = serializedConfiguration ? JSON.parse(serializedConfiguration) : {};\n }\n\n Object.assign(this.config, configuration);\n return this;\n }\n\n}\n//# sourceMappingURL=local-storage.js.map","export function formatTime(ms) {\n let formatted;\n\n if (ms < 10) {\n formatted = \"\".concat(ms.toFixed(2), \"ms\");\n } else if (ms < 100) {\n formatted = \"\".concat(ms.toFixed(1), \"ms\");\n } else if (ms < 1000) {\n formatted = \"\".concat(ms.toFixed(0), \"ms\");\n } else {\n formatted = \"\".concat((ms / 1000).toFixed(2), \"s\");\n }\n\n return formatted;\n}\nexport function leftPad(string, length = 8) {\n const padLength = Math.max(length - string.length, 0);\n return \"\".concat(' '.repeat(padLength)).concat(string);\n}\nexport function rightPad(string, length = 8) {\n const padLength = Math.max(length - string.length, 0);\n return \"\".concat(string).concat(' '.repeat(padLength));\n}\nexport function formatValue(v, opts = {}) {\n const EPSILON = 1e-16;\n const {\n isInteger = false\n } = opts;\n\n if (Array.isArray(v) || ArrayBuffer.isView(v)) {\n return formatArrayValue(v, opts);\n }\n\n if (!Number.isFinite(v)) {\n return String(v);\n }\n\n if (Math.abs(v) < EPSILON) {\n return isInteger ? '0' : '0.';\n }\n\n if (isInteger) {\n return v.toFixed(0);\n }\n\n if (Math.abs(v) > 100 && Math.abs(v) < 10000) {\n return v.toFixed(0);\n }\n\n const string = v.toPrecision(2);\n const decimal = string.indexOf('.0');\n return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\n\nfunction formatArrayValue(v, opts) {\n const {\n maxElts = 16,\n size = 1\n } = opts;\n let string = '[';\n\n for (let i = 0; i < v.length && i < maxElts; ++i) {\n if (i > 0) {\n string += \",\".concat(i % size === 0 ? ' ' : '');\n }\n\n string += formatValue(v[i], opts);\n }\n\n const terminator = v.length > maxElts ? '...' : ']';\n return \"\".concat(string).concat(terminator);\n}\n\nexport function formatImage(image, message, scale, maxWidth = 600) {\n const imageUrl = image.src.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n\n if (image.width > maxWidth) {\n scale = Math.min(scale, maxWidth / image.width);\n }\n\n const width = image.width * scale;\n const height = image.height * scale;\n const style = ['font-size:1px;', \"padding:\".concat(Math.floor(height / 2), \"px \").concat(Math.floor(width / 2), \"px;\"), \"line-height:\".concat(height, \"px;\"), \"background:url(\".concat(imageUrl, \");\"), \"background-size:\".concat(width, \"px \").concat(height, \"px;\"), 'color:transparent;'].join('');\n return [\"\".concat(message, \" %c+\"), style];\n}\n//# sourceMappingURL=formatters.js.map","import { isBrowser } from './globals';\nexport const COLOR = {\n BLACK: 30,\n RED: 31,\n GREEN: 32,\n YELLOW: 33,\n BLUE: 34,\n MAGENTA: 35,\n CYAN: 36,\n WHITE: 37,\n BRIGHT_BLACK: 90,\n BRIGHT_RED: 91,\n BRIGHT_GREEN: 92,\n BRIGHT_YELLOW: 93,\n BRIGHT_BLUE: 94,\n BRIGHT_MAGENTA: 95,\n BRIGHT_CYAN: 96,\n BRIGHT_WHITE: 97\n};\n\nfunction getColor(color) {\n return typeof color === 'string' ? COLOR[color.toUpperCase()] || COLOR.WHITE : color;\n}\n\nexport function addColor(string, color, background) {\n if (!isBrowser && typeof string === 'string') {\n if (color) {\n color = getColor(color);\n string = \"\\x1B[\".concat(color, \"m\").concat(string, \"\\x1B[39m\");\n }\n\n if (background) {\n color = getColor(background);\n string = \"\\x1B[\".concat(background + 10, \"m\").concat(string, \"\\x1B[49m\");\n }\n }\n\n return string;\n}\n//# sourceMappingURL=color.js.map","export default function assert(condition, message) {\n if (!condition) {\n throw new Error(message || 'Assertion failed');\n }\n}\n//# sourceMappingURL=assert.js.map","import { window, process, isBrowser } from './globals';\nexport default function getHiResTimestamp() {\n let timestamp;\n\n if (isBrowser && window.performance) {\n timestamp = window.performance.now();\n } else if (process.hrtime) {\n const timeParts = process.hrtime();\n timestamp = timeParts[0] * 1000 + timeParts[1] / 1e6;\n } else {\n timestamp = Date.now();\n }\n\n return timestamp;\n}\n//# sourceMappingURL=hi-res-timestamp.js.map","import { VERSION, isBrowser } from '../utils/globals';\nimport LocalStorage from '../utils/local-storage';\nimport { formatImage, formatTime, leftPad } from '../utils/formatters';\nimport { addColor } from '../utils/color';\nimport { autobind } from '../utils/autobind';\nimport assert from '../utils/assert';\nimport getHiResTimestamp from '../utils/hi-res-timestamp';\nconst originalConsole = {\n debug: isBrowser ? console.debug || console.log : console.log,\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error\n};\nconst DEFAULT_SETTINGS = {\n enabled: true,\n level: 0\n};\n\nfunction noop() {}\n\nconst cache = {};\nconst ONCE = {\n once: true\n};\n\nfunction getTableHeader(table) {\n for (const key in table) {\n for (const title in table[key]) {\n return title || 'untitled';\n }\n }\n\n return 'empty';\n}\n\nexport default class Log {\n constructor({\n id\n } = {\n id: ''\n }) {\n this.id = id;\n this.VERSION = VERSION;\n this._startTs = getHiResTimestamp();\n this._deltaTs = getHiResTimestamp();\n this.LOG_THROTTLE_TIMEOUT = 0;\n this._storage = new LocalStorage(\"__probe-\".concat(this.id, \"__\"), DEFAULT_SETTINGS);\n this.userData = {};\n this.timeStamp(\"\".concat(this.id, \" started\"));\n autobind(this);\n Object.seal(this);\n }\n\n set level(newLevel) {\n this.setLevel(newLevel);\n }\n\n get level() {\n return this.getLevel();\n }\n\n isEnabled() {\n return this._storage.config.enabled;\n }\n\n getLevel() {\n return this._storage.config.level;\n }\n\n getTotal() {\n return Number((getHiResTimestamp() - this._startTs).toPrecision(10));\n }\n\n getDelta() {\n return Number((getHiResTimestamp() - this._deltaTs).toPrecision(10));\n }\n\n set priority(newPriority) {\n this.level = newPriority;\n }\n\n get priority() {\n return this.level;\n }\n\n getPriority() {\n return this.level;\n }\n\n enable(enabled = true) {\n this._storage.updateConfiguration({\n enabled\n });\n\n return this;\n }\n\n setLevel(level) {\n this._storage.updateConfiguration({\n level\n });\n\n return this;\n }\n\n assert(condition, message) {\n assert(condition, message);\n }\n\n warn(message) {\n return this._getLogFunction(0, message, originalConsole.warn, arguments, ONCE);\n }\n\n error(message) {\n return this._getLogFunction(0, message, originalConsole.error, arguments);\n }\n\n deprecated(oldUsage, newUsage) {\n return this.warn(\"`\".concat(oldUsage, \"` is deprecated and will be removed in a later version. Use `\").concat(newUsage, \"` instead\"));\n }\n\n removed(oldUsage, newUsage) {\n return this.error(\"`\".concat(oldUsage, \"` has been removed. Use `\").concat(newUsage, \"` instead\"));\n }\n\n probe(logLevel, message) {\n return this._getLogFunction(logLevel, message, originalConsole.log, arguments, {\n time: true,\n once: true\n });\n }\n\n log(logLevel, message) {\n return this._getLogFunction(logLevel, message, originalConsole.debug, arguments);\n }\n\n info(logLevel, message) {\n return this._getLogFunction(logLevel, message, console.info, arguments);\n }\n\n once(logLevel, message) {\n return this._getLogFunction(logLevel, message, originalConsole.debug || originalConsole.info, arguments, ONCE);\n }\n\n table(logLevel, table, columns) {\n if (table) {\n return this._getLogFunction(logLevel, table, console.table || noop, columns && [columns], {\n tag: getTableHeader(table)\n });\n }\n\n return noop;\n }\n\n image({\n logLevel,\n priority,\n image,\n message = '',\n scale = 1\n }) {\n if (!this._shouldLog(logLevel || priority)) {\n return noop;\n }\n\n return isBrowser ? logImageInBrowser({\n image,\n message,\n scale\n }) : logImageInNode({\n image,\n message,\n scale\n });\n }\n\n settings() {\n if (console.table) {\n console.table(this._storage.config);\n } else {\n console.log(this._storage.config);\n }\n }\n\n get(setting) {\n return this._storage.config[setting];\n }\n\n set(setting, value) {\n this._storage.updateConfiguration({\n [setting]: value\n });\n }\n\n time(logLevel, message) {\n return this._getLogFunction(logLevel, message, console.time ? console.time : console.info);\n }\n\n timeEnd(logLevel, message) {\n return this._getLogFunction(logLevel, message, console.timeEnd ? console.timeEnd : console.info);\n }\n\n timeStamp(logLevel, message) {\n return this._getLogFunction(logLevel, message, console.timeStamp || noop);\n }\n\n group(logLevel, message, opts = {\n collapsed: false\n }) {\n opts = normalizeArguments({\n logLevel,\n message,\n opts\n });\n const {\n collapsed\n } = opts;\n opts.method = (collapsed ? console.groupCollapsed : console.group) || console.info;\n return this._getLogFunction(opts);\n }\n\n groupCollapsed(logLevel, message, opts = {}) {\n return this.group(logLevel, message, Object.assign({}, opts, {\n collapsed: true\n }));\n }\n\n groupEnd(logLevel) {\n return this._getLogFunction(logLevel, '', console.groupEnd || noop);\n }\n\n withGroup(logLevel, message, func) {\n this.group(logLevel, message)();\n\n try {\n func();\n } finally {\n this.groupEnd(logLevel)();\n }\n }\n\n trace() {\n if (console.trace) {\n console.trace();\n }\n }\n\n _shouldLog(logLevel) {\n return this.isEnabled() && this.getLevel() >= normalizeLogLevel(logLevel);\n }\n\n _getLogFunction(logLevel, message, method, args = [], opts) {\n if (this._shouldLog(logLevel)) {\n opts = normalizeArguments({\n logLevel,\n message,\n args,\n opts\n });\n method = method || opts.method;\n assert(method);\n opts.total = this.getTotal();\n opts.delta = this.getDelta();\n this._deltaTs = getHiResTimestamp();\n const tag = opts.tag || opts.message;\n\n if (opts.once) {\n if (!cache[tag]) {\n cache[tag] = getHiResTimestamp();\n } else {\n return noop;\n }\n }\n\n message = decorateMessage(this.id, opts.message, opts);\n return method.bind(console, message, ...opts.args);\n }\n\n return noop;\n }\n\n}\nLog.VERSION = VERSION;\n\nfunction normalizeLogLevel(logLevel) {\n if (!logLevel) {\n return 0;\n }\n\n let resolvedLevel;\n\n switch (typeof logLevel) {\n case 'number':\n resolvedLevel = logLevel;\n break;\n\n case 'object':\n resolvedLevel = logLevel.logLevel || logLevel.priority || 0;\n break;\n\n default:\n return 0;\n }\n\n assert(Number.isFinite(resolvedLevel) && resolvedLevel >= 0);\n return resolvedLevel;\n}\n\nexport function normalizeArguments(opts) {\n const {\n logLevel,\n message\n } = opts;\n opts.logLevel = normalizeLogLevel(logLevel);\n const args = opts.args ? Array.from(opts.args) : [];\n\n while (args.length && args.shift() !== message) {}\n\n opts.args = args;\n\n switch (typeof logLevel) {\n case 'string':\n case 'function':\n if (message !== undefined) {\n args.unshift(message);\n }\n\n opts.message = logLevel;\n break;\n\n case 'object':\n Object.assign(opts, logLevel);\n break;\n\n default:\n }\n\n if (typeof opts.message === 'function') {\n opts.message = opts.message();\n }\n\n const messageType = typeof opts.message;\n assert(messageType === 'string' || messageType === 'object');\n return Object.assign(opts, opts.opts);\n}\n\nfunction decorateMessage(id, message, opts) {\n if (typeof message === 'string') {\n const time = opts.time ? leftPad(formatTime(opts.total)) : '';\n message = opts.time ? \"\".concat(id, \": \").concat(time, \" \").concat(message) : \"\".concat(id, \": \").concat(message);\n message = addColor(message, opts.color, opts.background);\n }\n\n return message;\n}\n\nfunction logImageInNode({\n image,\n message = '',\n scale = 1\n}) {\n let asciify = null;\n\n try {\n asciify = module.require('asciify-image');\n } catch (error) {}\n\n if (asciify) {\n return () => asciify(image, {\n fit: 'box',\n width: \"\".concat(Math.round(80 * scale), \"%\")\n }).then(data => console.log(data));\n }\n\n return noop;\n}\n\nfunction logImageInBrowser({\n image,\n message = '',\n scale = 1\n}) {\n if (typeof image === 'string') {\n const img = new Image();\n\n img.onload = () => {\n const args = formatImage(img, message, scale);\n console.log(...args);\n };\n\n img.src = image;\n return noop;\n }\n\n const element = image.nodeName || '';\n\n if (element.toLowerCase() === 'img') {\n console.log(...formatImage(image, message, scale));\n return noop;\n }\n\n if (element.toLowerCase() === 'canvas') {\n const img = new Image();\n\n img.onload = () => console.log(...formatImage(img, message, scale));\n\n img.src = image.toDataURL();\n return noop;\n }\n\n return noop;\n}\n//# sourceMappingURL=log.js.map","export function autobind(obj, predefined = ['constructor']) {\n const proto = Object.getPrototypeOf(obj);\n const propNames = Object.getOwnPropertyNames(proto);\n\n for (const key of propNames) {\n if (typeof obj[key] === 'function') {\n if (!predefined.find(name => key === name)) {\n obj[key] = obj[key].bind(obj);\n }\n }\n }\n}\n//# sourceMappingURL=autobind.js.map","// probe.gl Log compatible loggers\nimport {Log} from 'probe.gl';\n\nexport const probeLog = new Log({id: 'loaders.gl'});\n\n// Logs nothing\nexport class NullLog {\n log() {\n return () => {};\n }\n info() {\n return () => {};\n }\n warn() {\n return () => {};\n }\n error() {\n return () => {};\n }\n}\n\n// Logs to console\nexport class ConsoleLog {\n console;\n\n constructor() {\n this.console = console; // eslint-disable-line\n }\n log(...args) {\n return this.console.log.bind(this.console, ...args);\n }\n info(...args) {\n return this.console.info.bind(this.console, ...args);\n }\n warn(...args) {\n return this.console.warn.bind(this.console, ...args);\n }\n error(...args) {\n return this.console.error.bind(this.console, ...args);\n }\n}\n","import type {LoaderOptions} from '@loaders.gl/loader-utils';\nimport {ConsoleLog} from './loggers';\n\nexport const DEFAULT_LOADER_OPTIONS: LoaderOptions = {\n // baseUri\n fetch: null,\n mimeType: undefined,\n nothrow: false,\n log: new ConsoleLog(), // A probe.gl compatible (`log.log()()` syntax) that just logs to console\n\n CDN: 'https://unpkg.com/@loaders.gl',\n worker: true, // By default, use worker if provided by loader.\n maxConcurrency: 3, // How many worker instances should be created for each loader.\n maxMobileConcurrency: 1, // How many worker instances should be created for each loader on mobile devices.\n reuseWorkers: true, // By default reuse workers,\n _workerType: '', // 'test' to use locally generated workers\n\n limit: 0,\n _limitMB: 0,\n batchSize: 'auto',\n batchDebounceMs: 0,\n metadata: false, // TODO - currently only implemented for parseInBatches, adds initial metadata batch,\n transforms: []\n};\n\nexport const REMOVED_LOADER_OPTIONS = {\n throws: 'nothrow',\n dataType: '(no longer used)',\n uri: 'baseUri',\n // Warn if fetch options are used on top-level\n method: 'fetch.method',\n headers: 'fetch.headers',\n body: 'fetch.body',\n mode: 'fetch.mode',\n credentials: 'fetch.credentials',\n cache: 'fetch.cache',\n redirect: 'fetch.redirect',\n referrer: 'fetch.referrer',\n referrerPolicy: 'fetch.referrerPolicy',\n integrity: 'fetch.integrity',\n keepalive: 'fetch.keepalive',\n signal: 'fetch.signal'\n};\n","import type {Loader, LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {isPureObject, isObject} from '../../javascript-utils/is-type';\nimport {fetchFile} from '../fetch/fetch-file';\nimport {probeLog, NullLog} from './loggers';\nimport {DEFAULT_LOADER_OPTIONS, REMOVED_LOADER_OPTIONS} from './option-defaults';\n/**\n * Global state for loaders.gl. Stored on `global.loaders._state`\n */\ntype GlobalLoaderState = {\n loaderRegistry: Loader[];\n globalOptions: {[key: string]: any};\n};\n\n/**\n * Helper for safely accessing global loaders.gl variables\n * Wraps initialization of global variable in function to defeat overly aggressive tree-shakers\n */\nexport function getGlobalLoaderState(): GlobalLoaderState {\n // @ts-ignore\n globalThis.loaders = globalThis.loaders || {};\n // @ts-ignore\n const {loaders} = globalThis;\n\n // Add _state object to keep separate from modules added to globalThis.loaders\n loaders._state = loaders._state || {};\n return loaders._state;\n}\n\n// Store global loader options on the global object to increase chances of cross loaders-version interoperability\n// NOTE: This use case is not reliable but can help when testing new versions of loaders.gl with existing frameworks\nconst getGlobalLoaderOptions = () => {\n const state = getGlobalLoaderState();\n // Ensure all default loader options from this library are mentioned\n state.globalOptions = state.globalOptions || {...DEFAULT_LOADER_OPTIONS};\n return state.globalOptions;\n};\n\n/**\n * Set global loader options\n * @param options\n */\nexport function setGlobalOptions(options: object): void {\n const state = getGlobalLoaderState();\n const globalOptions = getGlobalLoaderOptions();\n state.globalOptions = normalizeOptionsInternal(globalOptions, options);\n}\n\n/**\n * Merges options with global opts and loader defaults, also injects baseUri\n * @param options\n * @param loader\n * @param loaders\n * @param url\n */\nexport function normalizeOptions(\n options: object,\n loader: Loader,\n loaders?: Loader[],\n url?: string\n): object {\n loaders = loaders || [];\n loaders = Array.isArray(loaders) ? loaders : [loaders];\n\n validateOptions(options, loaders);\n return normalizeOptionsInternal(loader, options, url);\n}\n\n/**\n * Gets the current fetch function from options and context\n * @param options\n * @param context\n */\nexport function getFetchFunction(\n options?: LoaderOptions,\n context?: Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>\n) {\n const globalOptions = getGlobalLoaderOptions();\n\n const fetchOptions = options || globalOptions;\n\n // options.fetch can be a function\n if (typeof fetchOptions.fetch === 'function') {\n return fetchOptions.fetch;\n }\n\n // options.fetch can be an options object\n if (isObject(fetchOptions.fetch)) {\n return (url) => fetchFile(url, fetchOptions);\n }\n\n // else refer to context (from parent loader) if available\n if (context?.fetch) {\n return context?.fetch;\n }\n\n // else return the default fetch function\n return fetchFile;\n}\n\n// VALIDATE OPTIONS\n\n/**\n * Warn for unsupported options\n * @param options\n * @param loaders\n */\nfunction validateOptions(options: LoaderOptions, loaders: Loader[]) {\n // Check top level options\n validateOptionsObject(options, null, DEFAULT_LOADER_OPTIONS, REMOVED_LOADER_OPTIONS, loaders);\n for (const loader of loaders) {\n // Get the scoped, loader specific options from the user supplied options\n const idOptions = (options && options[loader.id]) || {};\n\n // Get scoped, loader specific default and deprecated options from the selected loader\n const loaderOptions = (loader.options && loader.options[loader.id]) || {};\n const deprecatedOptions =\n (loader.deprecatedOptions && loader.deprecatedOptions[loader.id]) || {};\n\n // Validate loader specific options\n validateOptionsObject(idOptions, loader.id, loaderOptions, deprecatedOptions, loaders);\n }\n}\n\n// eslint-disable-next-line max-params, complexity\nfunction validateOptionsObject(\n options,\n id: string | null,\n defaultOptions,\n deprecatedOptions,\n loaders: Loader[]\n) {\n const loaderName = id || 'Top level';\n const prefix = id ? `${id}.` : '';\n\n for (const key in options) {\n // If top level option value is an object it could options for a loader, so ignore\n const isSubOptions = !id && isObject(options[key]);\n const isBaseUriOption = key === 'baseUri' && !id;\n const isWorkerUrlOption = key === 'workerUrl' && id;\n // <loader>.workerUrl requires special handling as it is now auto-generated and no longer specified as a default option.\n if (!(key in defaultOptions) && !isBaseUriOption && !isWorkerUrlOption) {\n // Issue deprecation warnings\n if (key in deprecatedOptions) {\n probeLog.warn(\n `${loaderName} loader option \\'${prefix}${key}\\' no longer supported, use \\'${deprecatedOptions[key]}\\'`\n )();\n } else if (!isSubOptions) {\n const suggestion = findSimilarOption(key, loaders);\n probeLog.warn(\n `${loaderName} loader option \\'${prefix}${key}\\' not recognized. ${suggestion}`\n )();\n }\n }\n }\n}\n\nfunction findSimilarOption(optionKey, loaders) {\n const lowerCaseOptionKey = optionKey.toLowerCase();\n let bestSuggestion = '';\n for (const loader of loaders) {\n for (const key in loader.options) {\n if (optionKey === key) {\n return `Did you mean \\'${loader.id}.${key}\\'?`;\n }\n const lowerCaseKey = key.toLowerCase();\n const isPartialMatch =\n lowerCaseOptionKey.startsWith(lowerCaseKey) || lowerCaseKey.startsWith(lowerCaseOptionKey);\n if (isPartialMatch) {\n bestSuggestion = bestSuggestion || `Did you mean \\'${loader.id}.${key}\\'?`;\n }\n }\n }\n return bestSuggestion;\n}\n\nfunction normalizeOptionsInternal(loader, options, url?: string) {\n const loaderDefaultOptions = loader.options || {};\n\n const mergedOptions = {...loaderDefaultOptions};\n\n addUrlOptions(mergedOptions, url);\n\n // LOGGING: options.log can be set to `null` to defeat logging\n if (mergedOptions.log === null) {\n mergedOptions.log = new NullLog();\n }\n\n mergeNestedFields(mergedOptions, getGlobalLoaderOptions());\n mergeNestedFields(mergedOptions, options);\n\n return mergedOptions;\n}\n\n// Merge nested options objects\nfunction mergeNestedFields(mergedOptions, options) {\n for (const key in options) {\n // Check for nested options\n // object in options => either no key in defaultOptions or object in defaultOptions\n if (key in options) {\n const value = options[key];\n if (isPureObject(value) && isPureObject(mergedOptions[key])) {\n mergedOptions[key] = {\n ...mergedOptions[key],\n ...options[key]\n };\n } else {\n mergedOptions[key] = options[key];\n }\n }\n // else: No need to merge nested opts, and the initial merge already copied over the nested options\n }\n}\n\n// Harvest information from the url\n// TODO - baseUri should be a directory, i.e. remove file component from baseUri\n// TODO - extract extension?\n// TODO - extract query parameters?\n// TODO - should these be injected on context instead of options?\nfunction addUrlOptions(options, url?: string) {\n if (url && !('baseUri' in options)) {\n options.baseUri = url;\n }\n}\n","// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\n\n/** Throws an `Error` with the optional `message` if `condition` is falsy */\nexport function assert(condition: any, message?: string): void {\n if (!condition) {\n throw new Error(message || 'loaders.gl assertion failed.');\n }\n}\n","import type {WorkerObject} from '../../types';\nimport {assert} from '../env-utils/assert';\nimport {VERSION} from '../env-utils/version';\n\n/**\n * Check if worker is compatible with this library version\n * @param worker\n * @param libVersion\n * @returns `true` if the two versions are compatible\n */\nexport function validateWorkerVersion(\n worker: WorkerObject,\n coreVersion: string = VERSION\n): boolean {\n assert(worker, 'no worker provided');\n\n const workerVersion = worker.version;\n if (!coreVersion || !workerVersion) {\n return false;\n }\n\n // TODO enable when fix the __version__ injection\n // const coreVersions = parseVersion(coreVersion);\n // const workerVersions = parseVersion(workerVersion);\n // assert(\n // coreVersion.major === workerVersion.major && coreVersion.minor <= workerVersion.minor,\n // `worker: ${worker.name} is not compatible. ${coreVersion.major}.${\n // coreVersion.minor\n // }+ is required.`\n // );\n\n return true;\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction parseVersion(version) {\n const parts = version.split('.').map(Number);\n return {major: parts[0], minor: parts[1]};\n}\n","// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n\n// Change to `latest` on production branches\nconst DEFAULT_VERSION = 'beta';\ndeclare let __VERSION__;\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : DEFAULT_VERSION;\nif (typeof __VERSION__ === 'undefined') {\n // eslint-disable-next-line\n console.error(\n 'loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.'\n );\n}\n","import {assert} from '../env-utils/assert';\n\nconst workerURLCache = new Map();\n\n/**\n * Creates a loadable URL from worker source or URL\n * that can be used to create `Worker` instances.\n * Due to CORS issues it may be necessary to wrap a URL in a small importScripts\n * @param props\n * @param props.source Worker source\n * @param props.url Worker URL\n * @returns loadable url\n */\nexport function getLoadableWorkerURL(props: {source?: string; url?: string}) {\n assert((props.source && !props.url) || (!props.source && props.url)); // Either source or url must be defined\n\n let workerURL = workerURLCache.get(props.source || props.url);\n if (!workerURL) {\n // Differentiate worker urls from worker source code\n if (props.url) {\n workerURL = getLoadableWorkerURLFromURL(props.url);\n workerURLCache.set(props.url, workerURL);\n }\n\n if (props.source) {\n workerURL = getLoadableWorkerURLFromSource(props.source);\n workerURLCache.set(props.source, workerURL);\n }\n }\n\n assert(workerURL);\n return workerURL;\n}\n\n/**\n * Build a loadable worker URL from worker URL\n * @param url\n * @returns loadable URL\n */\nfunction getLoadableWorkerURLFromURL(url: string): string {\n // A local script url, we can use it to initialize a Worker directly\n if (!url.startsWith('http')) {\n return url;\n }\n\n // A remote script, we need to use `importScripts` to load from different origin\n const workerSource = buildScriptSource(url);\n return getLoadableWorkerURLFromSource(workerSource);\n}\n\n/**\n * Build a loadable worker URL from worker source\n * @param workerSource\n * @returns loadable url\n */\nfunction getLoadableWorkerURLFromSource(workerSource: string): string {\n // NOTE: webworkify was previously used\n // const blob = webworkify(workerSource, {bare: true});\n const blob = new Blob([workerSource], {type: 'application/javascript'});\n return URL.createObjectURL(blob);\n}\n\n/**\n * Per spec, worker cannot be initialized with a script from a different origin\n * However a local worker script can still import scripts from other origins,\n * so we simply build a wrapper script.\n *\n * @param workerUrl\n * @returns source\n */\nfunction buildScriptSource(workerUrl: string): string {\n return `\\\ntry {\n importScripts('${workerUrl}');\n} catch (error) {\n console.error(error);\n throw error;\n}`;\n}\n","import {assert} from '../env-utils/assert';\nimport {getLoadableWorkerURL} from '../worker-utils/get-loadable-worker-url';\nimport {getTransferList} from '../worker-utils/get-transfer-list';\n\nconst NOOP = () => {};\n\nexport type WorkerThreadProps = {\n name: string;\n source?: string;\n url?: string;\n};\n\n/**\n * Represents one worker thread\n */\nexport default class WorkerThread {\n readonly name: string;\n readonly source: string | undefined;\n readonly url: string | undefined;\n terminated: boolean = false;\n worker: Worker;\n onMessage: (message: any) => void;\n onError: (error: Error) => void;\n\n private _loadableURL: string = '';\n\n static isSupported(): boolean {\n return typeof Worker !== 'undefined';\n }\n\n constructor(props: WorkerThreadProps) {\n const {name, source, url} = props;\n assert(source || url); // Either source or url must be defined\n this.name = name;\n this.source = source;\n this.url = url;\n this.onMessage = NOOP;\n this.onError = (error) => console.log(error); // eslint-disable-line\n\n this.worker = this._createBrowserWorker();\n }\n\n /**\n * Terminate this worker thread\n * @note Can free up significant memory\n */\n destroy(): void {\n this.onMessage = NOOP;\n this.onError = NOOP;\n // @ts-ignore\n this.worker.terminate();\n this.terminated = true;\n }\n\n get isRunning() {\n return Boolean(this.onMessage);\n }\n\n /**\n * Send a message to this worker thread\n * @param data any data structure, ideally consisting mostly of transferrable objects\n * @param transferList If not supplied, calculated automatically by traversing data\n */\n postMessage(data: any, transferList?: any[]): void {\n transferList = transferList || getTransferList(data);\n // @ts-ignore\n this.worker.postMessage(data, transferList);\n }\n\n // PRIVATE\n\n /**\n * Generate a standard Error from an ErrorEvent\n * @param {ErrorEvent} event\n */\n _getErrorFromErrorEvent(event) {\n // Note Error object does not have the expected fields if loading failed completely\n // https://developer.mozilla.org/en-US/docs/Web/API/Worker#Event_handlers\n // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n let message = 'Failed to load ';\n message += `worker ${this.name} from ${this.url}. `;\n if (event.message) {\n message += `${event.message} in `;\n }\n // const hasFilename = event.filename && !event.filename.startsWith('blob:');\n // message += hasFilename ? event.filename : this.source.slice(0, 100);\n if (event.lineno) {\n message += `:${event.lineno}:${event.colno}`;\n }\n return new Error(message);\n }\n\n /**\n * Creates a worker thread on the browser\n */\n _createBrowserWorker() {\n this._loadableURL = getLoadableWorkerURL({source: this.source, url: this.url});\n const worker = new Worker(this._loadableURL, {name: this.name});\n\n worker.onmessage = (event) => {\n if (!event.data) {\n this.onError(new Error('No data received'));\n } else {\n this.onMessage(event.data);\n }\n };\n // This callback represents an uncaught exception in the worker thread\n worker.onerror = (error) => {\n this.onError(this._getErrorFromErrorEvent(error));\n this.terminated = true;\n };\n // TODO - not clear when this would be called, for now just log in case it happens\n worker.onmessageerror = (event) => console.error(event); // eslint-disable-line\n\n return worker;\n }\n}\n","import type {WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport WorkerThread from './worker-thread';\nimport {assert} from '../env-utils/assert';\n\n/**\n * Represents one Job handled by a WorkerPool or WorkerFarm\n */\nexport default class WorkerJob {\n readonly name: string;\n readonly workerThread: WorkerThread;\n isRunning: boolean;\n /** Promise that resolves when Job is done */\n readonly result: Promise<any>;\n\n private _resolve: (value: any) => void;\n private _reject: (reason?: any) => void;\n\n constructor(jobName: string, workerThread: WorkerThread) {\n this.name = jobName;\n this.workerThread = workerThread;\n this.isRunning = true;\n this._resolve = () => {};\n this._reject = () => {};\n this.result = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n\n /**\n * Send a message to the job's worker thread\n * @param data any data structure, ideally consisting mostly of transferrable objects\n */\n postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): void {\n this.workerThread.postMessage({\n source: 'loaders.gl', // Lets worker ignore unrelated messages\n type,\n payload\n });\n }\n\n /**\n * Call to resolve the `result` Promise with the supplied value\n */\n done(value): void {\n assert(this.isRunning);\n this.isRunning = false;\n this._resolve(value);\n }\n\n /**\n * Call to reject the `result` Promise with the supplied error\n */\n error(error): void {\n assert(this.isRunning);\n this.isRunning = false;\n this._reject(error);\n }\n}\n","import type {WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport {isMobile} from '../env-utils/globals';\nimport WorkerThread from './worker-thread';\nimport WorkerJob from './worker-job';\n\n/** WorkerPool onDebug Callback Parameters */\ntype OnDebugParameters = {\n message: string;\n worker: string;\n name: string;\n job: string;\n backlog: number;\n workerThread: WorkerThread;\n};\n\n/** WorkerPool Properties */\nexport type WorkerPoolProps = {\n name?: string;\n source?: string; // | Function;\n url?: string;\n maxConcurrency?: number;\n maxMobileConcurrency?: number;\n onDebug?: (options: OnDebugParameters) => any;\n reuseWorkers?: boolean;\n};\n\n/** Private helper types */\ntype OnMessage = (job: WorkerJob, type: WorkerMessageType, payload: WorkerMessagePayload) => void;\ntype OnError = (job: WorkerJob, error: Error) => void;\n\ntype QueuedJob = {\n name: string;\n onMessage: OnMessage;\n onError: OnError;\n onStart: (value: any) => void; // Resolve job start promise\n};\n\n/**\n * Process multiple data messages with small pool of identical workers\n */\nexport default class WorkerPool {\n name: string = 'unnamed';\n source?: string; // | Function;\n url?: string;\n maxConcurrency: number = 1;\n maxMobileConcurrency: number = 1;\n onDebug: (options: OnDebugParameters) => any = () => {};\n reuseWorkers: boolean = true;\n\n private props: WorkerPoolProps = {};\n private jobQueue: QueuedJob[] = [];\n private idleQueue: WorkerThread[] = [];\n private count = 0;\n private isDestroyed = false;\n\n /**\n * @param processor - worker function\n * @param maxConcurrency - max count of workers\n */\n constructor(props: WorkerPoolProps) {\n this.source = props.source;\n this.url = props.url;\n this.setProps(props);\n }\n\n /**\n * Terminates all workers in the pool\n * @note Can free up significant memory\n */\n destroy(): void {\n // Destroy idle workers, active Workers will be destroyed on completion\n this.idleQueue.forEach((worker) => worker.destroy());\n this.isDestroyed = true;\n }\n\n setProps(props: WorkerPoolProps) {\n this.props = {...this.props, ...props};\n\n if (props.name !== undefined) {\n this.name = props.name;\n }\n if (props.maxConcurrency !== undefined) {\n this.maxConcurrency = props.maxConcurrency;\n }\n if (props.maxMobileConcurrency !== undefined) {\n this.maxMobileConcurrency = props.maxMobileConcurrency;\n }\n if (props.reuseWorkers !== undefined) {\n this.reuseWorkers = props.reuseWorkers;\n }\n if (props.onDebug !== undefined) {\n this.onDebug = props.onDebug;\n }\n }\n\n async startJob(\n name: string,\n onMessage: OnMessage = (job, type, data) => job.done(data),\n onError: OnError = (job, error) => job.error(error)\n ): Promise<WorkerJob> {\n // Promise resolves when thread starts working on this job\n const startPromise = new Promise<WorkerJob>((onStart) => {\n // Promise resolves when thread completes or fails working on this job\n this.jobQueue.push({name, onMessage, onError, onStart});\n return this;\n });\n this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises\n return await startPromise;\n }\n\n // PRIVATE\n\n /**\n * Starts first queued job if worker is available or can be created\n * Called when job is started and whenever a worker returns to the idleQueue\n */\n async _startQueuedJob(): Promise<void> {\n if (!this.jobQueue.length) {\n return;\n }\n\n const workerThread = this._getAvailableWorker();\n if (!workerThread) {\n return;\n }\n\n // We have a worker, dequeue and start the job\n const queuedJob = this.jobQueue.shift();\n if (queuedJob) {\n // Emit a debug event\n // @ts-ignore\n this.onDebug({\n message: 'Starting job',\n name: queuedJob.name,\n workerThread,\n backlog: this.jobQueue.length\n });\n\n // Create a worker job to let the app access thread and manage job completion\n const job = new WorkerJob(queuedJob.name, workerThread);\n\n // Set the worker thread's message handlers\n workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);\n workerThread.onError = (error) => queuedJob.onError(job, error);\n\n // Resolve the start promise so that the app can start sending messages to worker\n queuedJob.onStart(job);\n\n // Wait for the app to signal that the job is complete, then return worker to queue\n try {\n await job.result;\n } finally {\n this.returnWorkerToQueue(workerThread);\n }\n }\n }\n\n /**\n * Returns a worker to the idle queue\n * Destroys the worker if\n * - pool is destroyed\n * - if this pool doesn't reuse workers\n * - if maxConcurrency has been lowered\n * @param worker\n */\n returnWorkerToQueue(worker: WorkerThread) {\n const shouldDestroyWorker =\n this.isDestroyed || !this.reuseWorkers || this.count > this._getMaxConcurrency();\n\n if (shouldDestroyWorker) {\n worker.destroy();\n this.count--;\n } else {\n this.idleQueue.push(worker);\n }\n\n if (!this.isDestroyed) {\n this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises\n }\n }\n\n /**\n * Returns idle worker or creates new worker if maxConcurrency has not been reached\n */\n _getAvailableWorker(): WorkerThread | null {\n // If a worker has completed and returned to the queue, it can be used\n if (this.idleQueue.length > 0) {\n return this.idleQueue.shift() || null;\n }\n\n // Create fresh worker if we haven't yet created the max amount of worker threads for this worker source\n if (this.count < this._getMaxConcurrency()) {\n this.count++;\n const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;\n return new WorkerThread({name, source: this.source, url: this.url});\n }\n\n // No worker available, have to wait\n return null;\n }\n\n _getMaxConcurrency() {\n return isMobile ? this.maxMobileConcurrency : this.maxConcurrency;\n }\n}\n","import WorkerPool from './worker-pool';\nimport WorkerThread from './worker-thread';\n\n/**\n * @param maxConcurrency {number} - max count of workers\n */\nexport type WorkerFarmProps = {\n maxConcurrency?: number;\n maxMobileConcurrency?: number;\n reuseWorkers?: boolean;\n onDebug?: () => void;\n};\n\nconst DEFAULT_PROPS: WorkerFarmProps = {\n maxConcurrency: 3,\n maxMobileConcurrency: 1,\n onDebug: () => {},\n reuseWorkers: true\n};\n\n/**\n * Process multiple jobs with a \"farm\" of different workers in worker pools.\n */\nexport default class WorkerFarm {\n private props: WorkerFarmProps;\n private workerPools = new Map<string, WorkerPool>();\n // singleton\n private static _workerFarm?: WorkerFarm;\n\n /** Check if Workers are supported */\n static isSupported(): boolean {\n return WorkerThread.isSupported();\n }\n\n /** Get the singleton instance of the global worker farm */\n static getWorkerFarm(props: WorkerFarmProps = {}): WorkerFarm {\n WorkerFarm._workerFarm = WorkerFarm._workerFarm || new WorkerFarm({});\n WorkerFarm._workerFarm.setProps(props);\n return WorkerFarm._workerFarm;\n }\n\n /** get global instance with WorkerFarm.getWorkerFarm() */\n private constructor(props: WorkerFarmProps) {\n this.props = {...DEFAULT_PROPS};\n this.setProps(props);\n /** @type Map<string, WorkerPool>} */\n this.workerPools = new Map();\n }\n\n /**\n * Terminate all workers in the farm\n * @note Can free up significant memory\n */\n destroy(): void {\n for (const workerPool of this.workerPools.values()) {\n workerPool.destroy();\n }\n }\n\n /**\n * Set props used when initializing worker pools\n * @param props\n */\n setProps(props: WorkerFarmProps): void {\n this.props = {...this.props, ...props};\n // Update worker pool props\n for (const workerPool of this.workerPools.values()) {\n workerPool.setProps(this._getWorkerPoolProps());\n }\n }\n\n /**\n * Returns a worker pool for the specified worker\n * @param options - only used first time for a specific worker name\n * @param options.name - the name of the worker - used to identify worker pool\n * @param options.url -\n * @param options.source -\n * @example\n * const job = WorkerFarm.getWorkerFarm().getWorkerPool({name, url}).startJob(...);\n */\n getWorkerPool(options: {name: string; source?: string; url?: string}): WorkerPool {\n const {name, source, url} = options;\n let workerPool = this.workerPools.get(name);\n if (!workerPool) {\n workerPool = new WorkerPool({\n name,\n source,\n url\n });\n workerPool.setProps(this._getWorkerPoolProps());\n this.workerPools.set(name, workerPool);\n }\n return workerPool;\n }\n\n _getWorkerPoolProps() {\n return {\n maxConcurrency: this.props.maxConcurrency,\n maxMobileConcurrency: this.props.maxMobileConcurrency,\n reuseWorkers: this.props.reuseWorkers,\n onDebug: this.props.onDebug\n };\n }\n}\n","import type {WorkerObject, WorkerOptions} from '../../types';\nimport {assert} from '../env-utils/assert';\nimport {VERSION as __VERSION__} from '../env-utils/version';\n\nconst NPM_TAG = 'beta'; // Change to 'latest' on release-branch\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : NPM_TAG;\n\n/**\n * Gets worker object's name (for debugging in Chrome thread inspector window)\n */\nexport function getWorkerName(worker: WorkerObject): string {\n const warning = worker.version !== VERSION ? ` (worker-utils@${VERSION})` : '';\n return `${worker.name}@${worker.version}${warning}`;\n}\n\n/**\n * Generate a worker URL based on worker object and options\n * @returns A URL to one of the following:\n * - a published worker on unpkg CDN\n * - a local test worker\n * - a URL provided by the user in options\n */\nexport function getWorkerURL(worker: WorkerObject, options: WorkerOptions = {}): string {\n const workerOptions = options[worker.id] || {};\n\n const workerFile = `${worker.id}-worker.js`;\n\n let url = workerOptions.workerUrl;\n\n // If URL is test, generate local loaders.gl url\n // @ts-ignore _workerType\n if (options._workerType === 'test') {\n url = `modules/${worker.module}/dist/${workerFile}`;\n }\n\n // If url override is not provided, generate a URL to published version on npm CDN unpkg.com\n if (!url) {\n // GENERATE\n let version = worker.version;\n // On master we need to load npm alpha releases published with the `beta` tag\n if (version === 'latest') {\n // throw new Error('latest worker version specified');\n version = NPM_TAG;\n }\n const versionTag = version ? `@${version}` : '';\n url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;\n }\n\n assert(url);\n\n // Allow user to override location\n return url;\n}\n","import type {WorkerJob, WorkerMessageType, WorkerMessagePayload} from '@loaders.gl/worker-utils';\nimport type {Loader, LoaderOptions, LoaderContext} from '../../types';\nimport {WorkerFarm, getWorkerURL} from '@loaders.gl/worker-utils';\n\n/**\n * Determines if a loader can parse with worker\n * @param loader\n * @param options\n */\nexport function canParseWithWorker(loader: Loader, options?: LoaderOptions) {\n if (!WorkerFarm.isSupported()) {\n return false;\n }\n\n return loader.worker && options?.worker;\n}\n\n/**\n * this function expects that the worker function sends certain messages,\n * this can be automated if the worker is wrapper by a call to createLoaderWorker in @loaders.gl/loader-utils.\n */\nexport async function parseWithWorker(\n loader: Loader,\n data,\n options?: LoaderOptions,\n context?: LoaderContext,\n parseOnMainThread?: (arrayBuffer: ArrayBuffer, options: {[key: string]: any}) => Promise<void>\n) {\n const name = loader.id; // TODO\n const url = getWorkerURL(loader, options);\n\n const workerFarm = WorkerFarm.getWorkerFarm(options);\n const workerPool = workerFarm.getWorkerPool({name, url});\n\n // options.log object contains functions which cannot be transferred\n // TODO - decide how to handle logging on workers\n options = JSON.parse(JSON.stringify(options));\n\n const job = await workerPool.startJob(\n 'process-on-worker',\n // eslint-disable-next-line\n onMessage.bind(null, parseOnMainThread)\n );\n\n job.postMessage('process', {\n // @ts-ignore\n input: data,\n options\n });\n\n const result = await job.result;\n return await result.result;\n}\n\n/**\n * Handle worker's responses to the main thread\n * @param job\n * @param type\n * @param payload\n */\nasync function onMessage(\n parseOnMainThread,\n job: WorkerJob,\n type: WorkerMessageType,\n payload: WorkerMessagePayload\n) {\n switch (type) {\n case 'done':\n job.done(payload);\n break;\n\n case 'error':\n job.error(payload.error);\n break;\n\n case 'process':\n // Worker is asking for main thread to parseO\n const {id, input, options} = payload;\n try {\n const result = await parseOnMainThread(input, options);\n job.postMessage('done', {id, result});\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n job.postMessage('error', {id, error: message});\n }\n break;\n\n default:\n // eslint-disable-next-line\n console.warn(`parse-with-worker unknown message ${type}`);\n }\n}\n","import * as node from '../node/buffer';\n\n/**\n * Check for Node.js `Buffer` (without triggering bundler to include Buffer polyfill on browser)\n */\nexport function isBuffer(value: any): boolean {\n return value && typeof value === 'object' && value.isBuffer;\n}\n\n/**\n * Converts to Node.js `Buffer` (without triggering bundler to include Buffer polyfill on browser)\n * @todo better data type\n */\nexport function toBuffer(data: any): Buffer {\n return node.toBuffer ? node.toBuffer(data) : data;\n}\n\n/**\n * Converts Node.js `Buffer` to `ArrayBuffer` (without triggering bundler to include Buffer polyfill on browser)\n * @todo better data type\n */\nexport function bufferToArrayBuffer(buffer: any): ArrayBuffer {\n if (isBuffer(buffer)) {\n const typedArray = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.length);\n return typedArray.slice().buffer;\n }\n return buffer;\n}\n","import {TypedArray} from '../../types';\nimport {isBuffer, bufferToArrayBuffer} from './buffer-utils';\n\n/**\n * Convert an object to an array buffer\n */\nexport function toArrayBuffer(data: any): ArrayBuffer {\n // Note: Should be called first, Buffers can trigger other detections below\n if (isBuffer(data)) {\n return bufferToArrayBuffer(data);\n }\n\n if (data instanceof ArrayBuffer) {\n return data;\n }\n\n // Careful - Node Buffers look like Uint8Arrays (keep after isBuffer)\n if (ArrayBuffer.isView(data)) {\n if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) {\n return data.buffer;\n }\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);\n }\n\n if (typeof data === 'string') {\n const text = data;\n const uint8Array = new TextEncoder().encode(text);\n return uint8Array.buffer;\n }\n\n // HACK to support Blob polyfill\n if (data && typeof data === 'object' && data._toArrayBuffer) {\n return data._toArrayBuffer();\n }\n\n throw new Error('toArrayBuffer');\n}\n\n/**\n * compare two binary arrays for equality\n * @param {ArrayBuffer} a\n * @param {ArrayBuffer} b\n * @param {number} byteLength\n */\nexport function compareArrayBuffers(\n arrayBuffer1: ArrayBuffer,\n arrayBuffer2: ArrayBuffer,\n byteLength?: number\n): boolean {\n byteLength = byteLength || arrayBuffer1.byteLength;\n if (arrayBuffer1.byteLength < byteLength || arrayBuffer2.byteLength < byteLength) {\n return false;\n }\n const array1 = new Uint8Array(arrayBuffer1);\n const array2 = new Uint8Array(arrayBuffer2);\n for (let i = 0; i < array1.length; ++i) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Concatenate a sequence of ArrayBuffers\n * @return A concatenated ArrayBuffer\n */\nexport function concatenateArrayBuffers(...sources: (ArrayBuffer | Uint8Array)[]): ArrayBuffer {\n // Make sure all inputs are wrapped in typed arrays\n const sourceArrays = sources.map((source2) =>\n source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2\n );\n\n // Get length of all inputs\n const byteLength = sourceArrays.reduce((length, typedArray) => length + typedArray.byteLength, 0);\n\n // Allocate array with space for all inputs\n const result = new Uint8Array(byteLength);\n\n // Copy the subarrays\n let offset = 0;\n for (const sourceArray of sourceArrays) {\n result.set(sourceArray, offset);\n offset += sourceArray.byteLength;\n }\n\n // We work with ArrayBuffers, discard the typed array wrapper\n return result.buffer;\n}\n\n/**\n * Concatenate arbitrary count of typed arrays\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays\n * @param {...*} arrays - list of arrays. All arrays should be the same type\n * @return A concatenated TypedArray\n */\nexport function concatenateTypedArrays<T>(...typedArrays: T[]): T {\n // @ts-ignore\n const arrays = typedArrays as TypedArray[];\n // @ts-ignore\n const TypedArrayConstructor = (arrays && arrays.length > 1 && arrays[0].constructor) || null;\n if (!TypedArrayConstructor) {\n throw new Error(\n '\"concatenateTypedArrays\" - incorrect quantity of arguments or arguments have incompatible data types'\n );\n }\n\n const sumLength = arrays.reduce((acc, value) => acc + value.length, 0);\n // @ts-ignore typescript does not like dynamic constructors\n const result = new TypedArrayConstructor(sumLength);\n let offset = 0;\n for (const array of arrays) {\n result.set(array, offset);\n offset += array.length;\n }\n return result;\n}\n\n/**\n * Copy a view of an ArrayBuffer into new ArrayBuffer with byteOffset = 0\n * @param arrayBuffer\n * @param byteOffset\n * @param byteLength\n */\nexport function sliceArrayBuffer(\n arrayBuffer: ArrayBuffer,\n byteOffset: number,\n byteLength?: number\n): ArrayBuffer {\n const subArray =\n byteLength !== undefined\n ? new Uint8Array(arrayBuffer).subarray(byteOffset, byteOffset + byteLength)\n : new Uint8Array(arrayBuffer).subarray(byteOffset);\n const arrayCopy = new Uint8Array(subArray);\n return arrayCopy.buffer;\n}\n","import {concatenateArrayBuffers} from '../binary-utils/array-buffer-utils';\n\n// GENERAL UTILITIES\n\n/**\n * Iterate over async iterator, without resetting iterator if end is not reached\n * - forEach intentionally does not reset iterator if exiting loop prematurely\n * so that iteration can continue in a second loop\n * - It is recommended to use a standard for-await as last loop to ensure\n * iterator gets properly reset\n *\n * TODO - optimize using sync iteration if argument is an Iterable?\n *\n * @param iterator\n * @param visitor\n */\nexport async function forEach(iterator, visitor) {\n // eslint-disable-next-line\n while (true) {\n const {done, value} = await iterator.next();\n if (done) {\n iterator.return();\n return;\n }\n const cancel = visitor(value);\n if (cancel) {\n return;\n }\n }\n}\n\n// Breaking big data into iterable chunks, concatenating iterable chunks into big data objects\n\n/**\n * Concatenates all data chunks yielded by an (async) iterator\n * This function can e.g. be used to enable atomic parsers to work on (async) iterator inputs\n */\n\nexport async function concatenateArrayBuffersAsync(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>\n): Promise<ArrayBuffer> {\n const arrayBuffers: ArrayBuffer[] = [];\n for await (const chunk of asyncIterator) {\n arrayBuffers.push(chunk);\n }\n return concatenateArrayBuffers(...arrayBuffers);\n}\n\nexport async function concatenateStringsAsync(\n asyncIterator: AsyncIterable<string> | Iterable<string>\n): Promise<string> {\n const strings: string[] = [];\n for await (const chunk of asyncIterator) {\n strings.push(chunk);\n }\n return strings.join('');\n}\n","import type {IteratorOptions} from './make-iterator';\n\nconst DEFAULT_CHUNK_SIZE = 256 * 1024;\n\n/**\n * Returns an iterator that breaks a big string into chunks and yields them one-by-one as ArrayBuffers\n * @param blob string to iterate over\n * @param options\n * @param options.chunkSize\n */\nexport function* makeStringIterator(\n string: string,\n options?: IteratorOptions\n): Iterable<ArrayBuffer> {\n const chunkSize = options?.chunkSize || DEFAULT_CHUNK_SIZE;\n\n let offset = 0;\n const textEncoder = new TextEncoder();\n while (offset < string.length) {\n // Create a chunk of the right size\n const chunkLength = Math.min(string.length - offset, chunkSize);\n const chunk = string.slice(offset, offset + chunkLength);\n offset += chunkLength;\n\n // yield an ArrayBuffer chunk\n yield textEncoder.encode(chunk);\n }\n}\n","import type {IteratorOptions} from './make-iterator';\n\nconst DEFAULT_CHUNK_SIZE = 256 * 1024;\n\n/**\n * Returns an iterator that breaks a big ArrayBuffer into chunks and yields them one-by-one\n * @param blob ArrayBuffer to iterate over\n * @param options\n * @param options.chunkSize\n */\nexport function* makeArrayBufferIterator(\n arrayBuffer: ArrayBuffer,\n options: IteratorOptions = {}\n): Iterable<ArrayBuffer> {\n const {chunkSize = DEFAULT_CHUNK_SIZE} = options;\n\n let byteOffset = 0;\n\n while (byteOffset < arrayBuffer.byteLength) {\n // Create a chunk of the right size\n const chunkByteLength = Math.min(arrayBuffer.byteLength - byteOffset, chunkSize);\n const chunk = new ArrayBuffer(chunkByteLength);\n\n // Copy data from the big chunk\n const sourceArray = new Uint8Array(arrayBuffer, byteOffset, chunkByteLength);\n const chunkArray = new Uint8Array(chunk);\n chunkArray.set(sourceArray);\n\n // yield the chunk\n byteOffset += chunkByteLength;\n yield chunk;\n }\n}\n","import type {IteratorOptions} from './make-iterator';\n\nconst DEFAULT_CHUNK_SIZE = 1024 * 1024; // 1MB — biggest value that keeps UI responsive\n\n/**\n * Returns an iterator that breaks a big Blob into chunks and yields them one-by-one\n * @param blob Blob or File object\n * @param options\n * @param options.chunkSize\n */\nexport async function* makeBlobIterator(\n blob: Blob,\n options?: IteratorOptions\n): AsyncIterable<ArrayBuffer> {\n const chunkSize = options?.chunkSize || DEFAULT_CHUNK_SIZE;\n\n let offset = 0;\n while (offset < blob.size) {\n const end = offset + chunkSize;\n\n const chunk = await blob.slice(offset, end).arrayBuffer();\n\n offset = end;\n yield chunk;\n }\n}\n","import type {Readable} from 'stream';\nimport {isBrowser, toArrayBuffer} from '@loaders.gl/loader-utils';\n\nexport type StreamIteratorOptions = {\n _streamReadAhead?: boolean;\n};\n\n/**\n * Returns an async iterable that reads from a stream (works in both Node.js and browsers)\n * @param stream stream to iterator over\n */\nexport function makeStreamIterator(\n stream: ReadableStream | Readable,\n options?: StreamIteratorOptions\n): AsyncIterable<ArrayBuffer> {\n return isBrowser\n ? makeBrowserStreamIterator(stream as ReadableStream, options)\n : makeNodeStreamIterator(stream as Readable, options);\n}\n\n/**\n * Returns an async iterable that reads from a DOM (browser) stream\n * @param stream stream to iterate from\n * @see https://jakearchibald.com/2017/async-iterators-and-generators/#making-streams-iterate\n */\nasync function* makeBrowserStreamIterator(\n stream: ReadableStream,\n options?: StreamIteratorOptions\n): AsyncIterable<ArrayBuffer> {\n // WhatWG: stream is supposed to have a `getIterator` method\n // if (typeof stream.getIterator === 'function') {\n // return stream.getIterator();\n // }\n // if (typeof stream[Symbol.asyncIterator] === 'function') {\n // return makeToArrayBufferIterator(stream);\n // }\n\n // In the browser, we first need to get a lock on the stream\n const reader = stream.getReader();\n\n let nextBatchPromise: Promise<{done?: boolean; value?: Uint8Array}> | undefined;\n\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const currentBatchPromise = nextBatchPromise || reader.read();\n // Issue a read for an additional batch, while we await the next batch\n // Idea is to make fetching happen in parallel with processing / parsing\n if (options?._streamReadAhead) {\n nextBatchPromise = reader.read();\n }\n // Read from the stream\n // value is a Uint8Array\n const {done, value} = await currentBatchPromise;\n // Exit if we're done\n if (done) {\n return;\n }\n // Else yield the chunk\n yield toArrayBuffer(value);\n }\n } catch (error) {\n // TODO - examples makes it look like this should always be called,\n // but that generates exceptions so only call it if we do not reach the end\n reader.releaseLock();\n }\n}\n\n/**\n * Returns an async iterable that reads from a DOM (browser) stream\n * @param stream stream to iterate from\n * @note Requires Node.js >= 10\n */\nasync function* makeNodeStreamIterator(\n stream: Readable,\n options?: StreamIteratorOptions\n): AsyncIterable<ArrayBuffer> {\n // Hacky test for node version to ensure we don't call bad polyfills\n // NODE 10+: stream is an asyncIterator\n for await (const chunk of stream) {\n yield toArrayBuffer(chunk); // Coerce each chunk to ArrayBuffer\n }\n}\n/* TODO - remove NODE < 10\n * @see https://github.com/bustle/streaming-iterables, MIT license\n *\n if (typeof stream[Symbol.asyncIterator] === 'function') {\n return;\n }\n\n // TODO - check if is this ever used in Node 10+?\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const data = stream.read();\n if (data !== null) {\n yield toArrayBuffer(data);\n // eslint-disable-next-line no-continue\n continue;\n }\n if (stream._readableState?.ended) {\n return;\n }\n await onceReadable(stream);\n }\n\nasync function onceReadable(stream: Readable): Promise<any> {\n return new Promise((resolve) => {\n stream.once('readable', resolve);\n });\n}\n */\n","import type {ReadStream} from 'fs';\n\nimport {makeStringIterator} from './make-string-iterator';\nimport {makeArrayBufferIterator} from './make-array-buffer-iterator';\nimport {makeBlobIterator} from './make-blob-iterator';\nimport type {StreamIteratorOptions} from './make-stream-iterator';\nimport {makeStreamIterator} from './make-stream-iterator';\nimport {isBlob, isReadableStream, isResponse} from '../../javascript-utils/is-type';\n\n/**\n * @param [options.chunkSize]\n */\nexport type IteratorOptions = StreamIteratorOptions & {\n chunkSize?: number;\n};\n\n/**\n * Returns an iterator that breaks its input into chunks and yields them one-by-one.\n * @param data\n * @param options\n * @returns\n * This function can e.g. be used to enable data sources that can only be read atomically\n * (such as `Blob` and `File` via `FileReader`) to still be parsed in batches.\n */\nexport function makeIterator(\n data: ArrayBuffer | string | Blob | Response | ReadableStream | ReadStream,\n options?: IteratorOptions\n): AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer> {\n if (typeof data === 'string') {\n // Note: Converts string chunks to binary\n return makeStringIterator(data, options);\n }\n if (data instanceof ArrayBuffer) {\n return makeArrayBufferIterator(data, options);\n }\n if (isBlob(data)) {\n return makeBlobIterator(data as Blob, options);\n }\n if (isReadableStream(data)) {\n return makeStreamIterator(data as ReadableStream, options);\n }\n if (isResponse(data)) {\n const response = data as Response;\n return makeStreamIterator(response.body as ReadableStream, options);\n }\n throw new Error('makeIterator');\n}\n","import type {\n DataType,\n SyncDataType,\n BatchableDataType,\n Loader,\n LoaderOptions\n} from '@loaders.gl/loader-utils';\nimport {concatenateArrayBuffersAsync} from '@loaders.gl/loader-utils';\nimport {\n isResponse,\n isReadableStream,\n isAsyncIterable,\n isIterable,\n isIterator,\n isBlob,\n isBuffer\n} from '../../javascript-utils/is-type';\nimport {makeIterator} from '../../iterators/make-iterator/make-iterator';\nimport {checkResponse, makeResponse} from '../utils/response-utils';\n\nconst ERR_DATA = 'Cannot convert supplied data type';\n\n// eslint-disable-next-line complexity\nexport function getArrayBufferOrStringFromDataSync(\n data: SyncDataType,\n loader: Loader,\n options: LoaderOptions\n): ArrayBuffer | string {\n if (loader.text && typeof data === 'string') {\n return data;\n }\n\n if (isBuffer(data)) {\n // @ts-ignore\n data = data.buffer;\n }\n\n if (data instanceof ArrayBuffer) {\n const arrayBuffer = data;\n if (loader.text && !loader.binary) {\n const textDecoder = new TextDecoder('utf8');\n return textDecoder.decode(arrayBuffer);\n }\n return arrayBuffer;\n }\n\n // We may need to handle offsets\n if (ArrayBuffer.isView(data)) {\n // TextDecoder is invoked on typed arrays and will handle offsets\n if (loader.text && !loader.binary) {\n const textDecoder = new TextDecoder('utf8');\n return textDecoder.decode(data);\n }\n\n let arrayBuffer = data.buffer;\n\n // Since we are returning the underlying arrayBuffer, we must create a new copy\n // if this typed array / Buffer is a partial view into the ArryayBuffer\n // TODO - this is a potentially unnecessary copy\n const byteLength = data.byteLength || data.length;\n if (data.byteOffset !== 0 || byteLength !== arrayBuffer.byteLength) {\n // console.warn(`loaders.gl copying arraybuffer of length ${byteLength}`);\n arrayBuffer = arrayBuffer.slice(data.byteOffset, data.byteOffset + byteLength);\n }\n return arrayBuffer;\n }\n\n throw new Error(ERR_DATA);\n}\n\n// Convert async iterator to a promise\nexport async function getArrayBufferOrStringFromData(\n data: DataType,\n loader: Loader,\n options: LoaderOptions\n): Promise<ArrayBuffer | string> {\n const isArrayBuffer = data instanceof ArrayBuffer || ArrayBuffer.isView(data);\n if (typeof data === 'string' || isArrayBuffer) {\n return getArrayBufferOrStringFromDataSync(data as string | ArrayBuffer, loader, options);\n }\n\n // Blobs and files are FileReader compatible\n if (isBlob(data)) {\n data = await makeResponse(data);\n }\n\n if (isResponse(data)) {\n const response = data as Response;\n await checkResponse(response);\n return loader.binary ? await response.arrayBuffer() : await response.text();\n }\n\n if (isReadableStream(data)) {\n // @ts-expect-error TS2559 options type\n data = makeIterator(data as ReadableStream, options);\n }\n\n if (isIterable(data) || isAsyncIterable(data)) {\n // Assume arrayBuffer iterator - attempt to concatenate\n return concatenateArrayBuffersAsync(data as AsyncIterable<ArrayBuffer>);\n }\n\n throw new Error(ERR_DATA);\n}\n\nexport async function getAsyncIterableFromData(\n data: BatchableDataType,\n options: LoaderOptions\n): Promise<AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>> {\n if (isIterator(data)) {\n return data as AsyncIterable<ArrayBuffer>;\n }\n\n if (isResponse(data)) {\n const response = data as Response;\n // Note Since this function is not async, we currently can't load error message, just status\n await checkResponse(response);\n // TODO - bug in polyfill, body can be a Promise under Node.js\n // eslint-disable-next-line @typescript-eslint/await-thenable\n const body = await response.body;\n // TODO - body can be null?\n return makeIterator(body as ReadableStream<Uint8Array>, options as any);\n }\n\n if (isBlob(data) || isReadableStream(data)) {\n return makeIterator(data as Blob | ReadableStream, options as any);\n }\n\n if (isAsyncIterable(data)) {\n return data[Symbol.asyncIterator]();\n }\n\n return getIterableFromData(data);\n}\n\nexport async function getReadableStream(data: BatchableDataType): Promise<ReadableStream> {\n if (isReadableStream(data)) {\n return data as ReadableStream;\n }\n if (isResponse(data)) {\n // @ts-ignore\n return data.body;\n }\n const response = await makeResponse(data);\n // @ts-ignore\n return response.body;\n}\n\n// HELPERS\n\nfunction getIterableFromData(data) {\n // generate an iterator that emits a single chunk\n if (ArrayBuffer.isView(data)) {\n return (function* oneChunk() {\n yield data.buffer;\n })();\n }\n\n if (data instanceof ArrayBuffer) {\n return (function* oneChunk() {\n yield data;\n })();\n }\n\n if (isIterator(data)) {\n return data;\n }\n\n if (isIterable(data)) {\n return data[Symbol.iterator]();\n }\n\n throw new Error(ERR_DATA);\n}\n","import type {Loader, LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';\nimport {getFetchFunction} from './option-utils';\n\n/**\n * \"sub\" loaders invoked by other loaders get a \"context\" injected on `this`\n * The context will inject core methods like `parse` and contain information\n * about loaders and options passed in to the top-level `parse` call.\n *\n * @param context\n * @param options\n * @param previousContext\n */\nexport function getLoaderContext(\n context: Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>,\n options?: LoaderOptions,\n previousContext: LoaderContext | null = null\n): LoaderContext {\n // For recursive calls, we already have a context\n // TODO - add any additional loaders to context?\n if (previousContext) {\n return previousContext;\n }\n\n const resolvedContext: LoaderContext = {\n fetch: getFetchFunction(options, context),\n ...context\n };\n\n // Recursive loading does not use single loader\n if (!Array.isArray(resolvedContext.loaders)) {\n resolvedContext.loaders = null;\n }\n\n return resolvedContext;\n}\n\n// eslint-disable-next-line complexity\nexport function getLoadersFromContext(\n loaders: Loader[] | Loader | undefined,\n context?: LoaderContext\n) {\n // A single non-array loader is force selected, but only on top-level (context === null)\n if (!context && loaders && !Array.isArray(loaders)) {\n return loaders;\n }\n\n // Create a merged list\n let candidateLoaders;\n if (loaders) {\n candidateLoaders = Array.isArray(loaders) ? loaders : [loaders];\n }\n if (context && context.loaders) {\n const contextLoaders = Array.isArray(context.loaders) ? context.loaders : [context.loaders];\n candidateLoaders = candidateLoaders ? [...candidateLoaders, ...contextLoaders] : contextLoaders;\n }\n // If no loaders, return null to look in globally registered loaders\n return candidateLoaders && candidateLoaders.length ? candidateLoaders : null;\n}\n","// Beginning of a minimal implementation of the Node.js path API, that doesn't pull in big polyfills.\n\n/**\n * Replacement for Node.js path.filename\n * @param url\n */\nexport function filename(url: string): string {\n const slashIndex = url && url.lastIndexOf('/');\n return slashIndex >= 0 ? url.substr((slashIndex as number) + 1) : '';\n}\n\n/**\n * Replacement for Node.js path.dirname\n * @param url\n */\nexport function dirname(url: string): string {\n const slashIndex = url && url.lastIndexOf('/');\n return slashIndex >= 0 ? url.substr(0, slashIndex as number) : '';\n}\n\n/**\n * Replacement for Node.js path.join\n * @param parts\n */\nexport function join(...parts: string[]): string {\n const separator = '/';\n parts = parts.map((part, index) => {\n if (index) {\n part = part.replace(new RegExp(`^${separator}`), '');\n }\n if (index !== parts.length - 1) {\n part = part.replace(new RegExp(`${separator}$`), '');\n }\n return part;\n });\n return parts.join(separator);\n}\n","import {Loader} from '@loaders.gl/loader-utils';\nimport {normalizeLoader} from '../loader-utils/normalize-loader';\nimport {getGlobalLoaderState} from '../loader-utils/option-utils';\n\n// Store global registered loaders on the global object to increase chances of cross loaders-version interoperability\n// This use case is not reliable but can help when testing new versions of loaders.gl with existing frameworks\nconst getGlobalLoaderRegistry = () => {\n const state = getGlobalLoaderState();\n state.loaderRegistry = state.loaderRegistry || [];\n return state.loaderRegistry;\n};\n\nexport function registerLoaders(loaders: Loader[]) {\n const loaderRegistry = getGlobalLoaderRegistry();\n\n loaders = Array.isArray(loaders) ? loaders : [loaders];\n\n for (const loader of loaders) {\n const normalizedLoader = normalizeLoader(loader);\n if (!loaderRegistry.find((registeredLoader) => normalizedLoader === registeredLoader)) {\n // add to the beginning of the loaderRegistry, so the last registeredLoader get picked\n loaderRegistry.unshift(normalizedLoader);\n }\n }\n}\n\nexport function getRegisteredLoaders(): Loader[] {\n return getGlobalLoaderRegistry();\n}\n\n// For testing\nexport function _unregisterLoaders() {\n const state = getGlobalLoaderState();\n state.loaderRegistry = [];\n}\n","import type {LoaderContext, LoaderOptions, Loader} from '@loaders.gl/loader-utils';\nimport {compareArrayBuffers, path} from '@loaders.gl/loader-utils';\nimport {normalizeLoader} from '../loader-utils/normalize-loader';\nimport {getResourceUrlAndType} from '../utils/resource-utils';\nimport {getRegisteredLoaders} from './register-loaders';\nimport {isBlob} from '../../javascript-utils/is-type';\n\nconst EXT_PATTERN = /\\.([^.]+)$/;\n\n// TODO - Need a variant that peeks at streams for parseInBatches\n// TODO - Detect multiple matching loaders? Use heuristics to grade matches?\n// TODO - Allow apps to pass context to disambiguate between multiple matches (e.g. multiple .json formats)?\n\n/**\n * Find a loader that matches file extension and/or initial file content\n * Search the loaders array argument for a loader that matches url extension or initial data\n * Returns: a normalized loader\n * @param data data to assist\n * @param loaders\n * @param options\n * @param context used internally, applications should not provide this parameter\n */\nexport async function selectLoader(\n data: Response | Blob | ArrayBuffer | string,\n loaders: Loader[] | Loader = [],\n options?: LoaderOptions,\n context?: LoaderContext\n): Promise<Loader | null> {\n if (!validHTTPResponse(data)) {\n return null;\n }\n\n // First make a sync attempt, disabling exceptions\n let loader = selectLoaderSync(data, loaders, {...options, nothrow: true}, context);\n if (loader) {\n return loader;\n }\n\n // For Blobs and Files, try to asynchronously read a small initial slice and test again with that\n // to see if we can detect by initial content\n if (isBlob(data)) {\n data = await (data as Blob).slice(0, 10).arrayBuffer();\n loader = selectLoaderSync(data, loaders, options, context);\n }\n\n // no loader available\n if (!loader && !options?.nothrow) {\n throw new Error(getNoValidLoaderMessage(data));\n }\n\n return loader;\n}\n\n/**\n * Find a loader that matches file extension and/or initial file content\n * Search the loaders array argument for a loader that matches url extension or initial data\n * Returns: a normalized loader\n * @param data data to assist\n * @param loaders\n * @param options\n * @param context used internally, applications should not provide this parameter\n */\nexport function selectLoaderSync(\n data: Response | Blob | ArrayBuffer | string,\n loaders: Loader[] | Loader = [],\n options?: LoaderOptions,\n context?: LoaderContext\n): Loader | null {\n if (!validHTTPResponse(data)) {\n return null;\n }\n\n // eslint-disable-next-line complexity\n // if only a single loader was provided (not as array), force its use\n // TODO - Should this behavior be kept and documented?\n if (loaders && !Array.isArray(loaders)) {\n // TODO - remove support for legacy loaders\n return normalizeLoader(loaders);\n }\n\n // Build list of candidate loaders that will be searched in order for a match\n let candidateLoaders: Loader[] = [];\n // First search supplied loaders\n if (loaders) {\n candidateLoaders = candidateLoaders.concat(loaders);\n }\n // Then fall back to registered loaders\n if (!options?.ignoreRegisteredLoaders) {\n candidateLoaders.push(...getRegisteredLoaders());\n }\n\n // TODO - remove support for legacy loaders\n normalizeLoaders(candidateLoaders);\n\n const loader = selectLoaderInternal(data, candidateLoaders, options, context);\n\n // no loader available\n if (!loader && !options?.nothrow) {\n throw new Error(getNoValidLoaderMessage(data));\n }\n\n return loader;\n}\n\n/** Implements loaders selection logic */\nfunction selectLoaderInternal(\n data: Response | Blob | ArrayBuffer | string,\n loaders: Loader[],\n options?: LoaderOptions,\n context?: LoaderContext\n) {\n const {url, type} = getResourceUrlAndType(data);\n\n const testUrl = url || context?.url;\n\n let loader: Loader | null = null;\n\n // if options.mimeType is supplied, it takes precedence\n if (options?.mimeType) {\n loader = findLoaderByMIMEType(loaders, options?.mimeType);\n }\n // Look up loader by url\n loader = loader || findLoaderByUrl(loaders, testUrl);\n // Look up loader by mime type\n loader = loader || findLoaderByMIMEType(loaders, type);\n // Look for loader via initial bytes (Note: not always accessible (e.g. Response, stream, async iterator)\n loader = loader || findLoaderByInitialBytes(loaders, data);\n // Look up loader by fallback mime type\n loader = loader || findLoaderByMIMEType(loaders, options?.fallbackMimeType);\n\n return loader;\n}\n\n/** Check HTTP Response */\nfunction validHTTPResponse(data: any): boolean {\n // HANDLE HTTP status\n if (data instanceof Response) {\n // 204 - NO CONTENT. This handles cases where e.g. a tile server responds with 204 for a missing tile\n if (data.status === 204) {\n return false;\n }\n }\n return true;\n}\n\n/** Generate a helpful message to help explain why loader selection failed. */\nfunction getNoValidLoaderMessage(data): string {\n const {url, type} = getResourceUrlAndType(data);\n\n let message = 'No valid loader found (';\n message += url ? `${path.filename(url)}, ` : 'no url provided, ';\n message += `MIME type: ${type ? `\"${type}\"` : 'not provided'}, `;\n // First characters are only accessible when called on data (string or arrayBuffer).\n const firstCharacters: string = data ? getFirstCharacters(data) : '';\n message += firstCharacters ? ` first bytes: \"${firstCharacters}\"` : 'first bytes: not available';\n message += ')';\n return message;\n}\n\nfunction normalizeLoaders(loaders: Loader[]): void {\n for (const loader of loaders) {\n normalizeLoader(loader);\n }\n}\n\n// TODO - Would be nice to support http://example.com/file.glb?parameter=1\n// E.g: x = new URL('http://example.com/file.glb?load=1'; x.pathname\nfunction findLoaderByUrl(loaders: Loader[], url?: string): Loader | null {\n // Get extension\n const match = url && EXT_PATTERN.exec(url);\n const extension = match && match[1];\n return extension ? findLoaderByExtension(loaders, extension) : null;\n}\n\nfunction findLoaderByExtension(loaders: Loader[], extension: string): Loader | null {\n extension = extension.toLowerCase();\n\n for (const loader of loaders) {\n for (const loaderExtension of loader.extensions) {\n if (loaderExtension.toLowerCase() === extension) {\n return loader;\n }\n }\n }\n return null;\n}\n\nfunction findLoaderByMIMEType(loaders, mimeType) {\n for (const loader of loaders) {\n if (loader.mimeTypes && loader.mimeTypes.includes(mimeType)) {\n return loader;\n }\n\n // Support referring to loaders using the \"unregistered tree\"\n // https://en.wikipedia.org/wiki/Media_type#Unregistered_tree\n if (mimeType === `application/x.${loader.id}`) {\n return loader;\n }\n }\n return null;\n}\n\nfunction findLoaderByInitialBytes(loaders, data) {\n if (!data) {\n return null;\n }\n\n for (const loader of loaders) {\n if (typeof data === 'string') {\n if (testDataAgainstText(data, loader)) {\n return loader;\n }\n } else if (ArrayBuffer.isView(data)) {\n // Typed Arrays can have offsets into underlying buffer\n if (testDataAgainstBinary(data.buffer, data.byteOffset, loader)) {\n return loader;\n }\n } else if (data instanceof ArrayBuffer) {\n const byteOffset = 0;\n if (testDataAgainstBinary(data, byteOffset, loader)) {\n return loader;\n }\n }\n // TODO Handle streaming case (requires creating a new AsyncIterator)\n }\n return null;\n}\n\nfunction testDataAgainstText(data, loader) {\n if (loader.testText) {\n return loader.testText(data);\n }\n\n const tests = Array.isArray(loader.tests) ? loader.tests : [loader.tests];\n return tests.some((test) => data.startsWith(test));\n}\n\nfunction testDataAgainstBinary(data, byteOffset, loader) {\n const tests = Array.isArray(loader.tests) ? loader.tests : [loader.tests];\n return tests.some((test) => testBinary(data, byteOffset, loader, test));\n}\n\nfunction testBinary(data, byteOffset, loader, test) {\n if (test instanceof ArrayBuffer) {\n return compareArrayBuffers(test, data, test.byteLength);\n }\n switch (typeof test) {\n case 'function':\n return test(data, loader);\n\n case 'string':\n // Magic bytes check: If `test` is a string, check if binary data starts with that strings\n const magic = getMagicString(data, byteOffset, test.length);\n return test === magic;\n\n default:\n return false;\n }\n}\n\nfunction getFirstCharacters(data, length: number = 5) {\n if (typeof data === 'string') {\n return data.slice(0, length);\n } else if (ArrayBuffer.isView(data)) {\n // Typed Arrays can have offsets into underlying buffer\n return getMagicString(data.buffer, data.byteOffset, length);\n } else if (data instanceof ArrayBuffer) {\n const byteOffset = 0;\n return getMagicString(data, byteOffset, length);\n }\n return '';\n}\n\nfunction getMagicString(arrayBuffer, byteOffset, length) {\n if (arrayBuffer.byteLength < byteOffset + length) {\n return '';\n }\n const dataView = new DataView(arrayBuffer);\n let magic = '';\n for (let i = 0; i < length; i++) {\n magic += String.fromCharCode(dataView.getUint8(byteOffset + i));\n }\n return magic;\n}\n","import type {DataType, Loader, LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {assert, validateWorkerVersion} from '@loaders.gl/worker-utils';\nimport {parseWithWorker, canParseWithWorker} from '@loaders.gl/loader-utils';\nimport {isLoaderObject} from '../loader-utils/normalize-loader';\nimport {normalizeOptions} from '../loader-utils/option-utils';\nimport {getArrayBufferOrStringFromData} from '../loader-utils/get-data';\nimport {getLoaderContext, getLoadersFromContext} from '../loader-utils/loader-context';\nimport {getResourceUrlAndType} from '../utils/resource-utils';\nimport {selectLoader} from './select-loader';\n\n/**\n * Parses `data` using a specified loader\n * @param data\n * @param loaders\n * @param options\n * @param context\n */\nexport async function parse(\n data: DataType | Promise<DataType>,\n loaders?: Loader | Loader[] | LoaderOptions,\n options?: LoaderOptions,\n context?: LoaderContext\n): Promise<any> {\n assert(!context || typeof context === 'object'); // parse no longer accepts final url\n\n // Signature: parse(data, options, context | url)\n // Uses registered loaders\n if (loaders && !Array.isArray(loaders) && !isLoaderObject(loaders)) {\n context = undefined; // context not supported in short signature\n options = loaders as LoaderOptions;\n loaders = undefined;\n }\n\n data = await data; // Resolve any promise\n options = options || {};\n\n // Extract a url for auto detection\n const {url} = getResourceUrlAndType(data);\n\n // Chooses a loader (and normalizes it)\n // Also use any loaders in the context, new loaders take priority\n const typedLoaders = loaders as Loader | Loader[] | undefined;\n const candidateLoaders = getLoadersFromContext(typedLoaders, context);\n // todo hacky type cast\n const loader = await selectLoader(data as ArrayBuffer, candidateLoaders, options);\n // Note: if no loader was found, if so just return null\n if (!loader) {\n return null;\n }\n\n // Normalize options\n options = normalizeOptions(options, loader, candidateLoaders, url);\n\n // Get a context (if already present, will be unchanged)\n context = getLoaderContext({url, parse, loaders: candidateLoaders}, options, context);\n\n return await parseWithLoader(loader, data, options, context);\n}\n\n// TODO: support progress and abort\n// TODO - should accept loader.parseAsyncIterator and concatenate.\nasync function parseWithLoader(loader, data, options, context) {\n validateWorkerVersion(loader);\n\n data = await getArrayBufferOrStringFromData(data, loader, options);\n\n // First check for synchronous text parser, wrap results in promises\n if (loader.parseTextSync && typeof data === 'string') {\n options.dataType = 'text';\n return loader.parseTextSync(data, options, context, loader);\n }\n\n // If we have a workerUrl and the loader can parse the given options efficiently in a worker\n if (canParseWithWorker(loader, options)) {\n return await parseWithWorker(loader, data, options, context, parse);\n }\n\n // Check for asynchronous parser\n if (loader.parseText && typeof data === 'string') {\n return await loader.parseText(data, options, context, loader);\n }\n\n if (loader.parse) {\n return await loader.parse(data, options, context, loader);\n }\n\n // This should not happen, all sync loaders should also offer `parse` function\n assert(!loader.parseSync);\n\n // TBD - If asynchronous parser not available, return null\n throw new Error(`${loader.id} loader - no parser found and worker is disabled`);\n}\n","import type {DataType, Loader, LoaderContext, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {isBlob} from '../../javascript-utils/is-type';\nimport {isLoaderObject} from '../loader-utils/normalize-loader';\nimport {getFetchFunction} from '../loader-utils/option-utils';\n\nimport {parse} from './parse';\n\n/**\n * Parses `data` using a specified loader\n * Note: Load does duplicate a lot of parse.\n * it can also call fetchFile on string urls, which `parse` won't do.\n * @param data\n * @param loaders\n * @param options\n * @param context\n */\n// implementation signature\nexport async function load(\n url: string | DataType,\n loaders?: Loader | Loader[] | LoaderOptions,\n options?: LoaderOptions,\n context?: LoaderContext\n): Promise<any> {\n // Signature: load(url, options)\n if (!Array.isArray(loaders) && !isLoaderObject(loaders)) {\n context = undefined; // context not supported in short signature\n options = loaders as LoaderOptions;\n loaders = undefined;\n }\n\n // Select fetch function\n const fetch = getFetchFunction(options);\n\n // at this point, `url` could be already loaded binary data\n let data = url;\n // url is a string, fetch the url\n if (typeof url === 'string') {\n data = await fetch(url);\n // URL is Blob or File, fetchFile handles it (alt: we could generate ObjectURL here)\n }\n\n if (isBlob(url)) {\n // The fetch response object will contain blob.name\n data = await fetch(url);\n }\n\n // Data is loaded (at least we have a `Response` object) so time to hand over to `parse`\n return await parse(data, loaders, options);\n}\n","export default function assert(condition, message) {\n if (!condition) {\n throw new Error(\"math.gl assertion \".concat(message));\n }\n}\n//# sourceMappingURL=assert.js.map","import assert from './assert';\nconst RADIANS_TO_DEGREES = 1 / Math.PI * 180;\nconst DEGREES_TO_RADIANS = 1 / 180 * Math.PI;\nconst config = {};\nconfig.EPSILON = 1e-12;\nconfig.debug = false;\nconfig.precision = 4;\nconfig.printTypes = false;\nconfig.printDegrees = false;\nconfig.printRowMajor = true;\nexport { config };\nexport function configure(options = {}) {\n for (const key in options) {\n assert(key in config);\n config[key] = options[key];\n }\n\n return config;\n}\n\nfunction round(value) {\n return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\nexport function formatValue(value, {\n precision = config.precision || 4\n} = {}) {\n value = round(value);\n return \"\".concat(parseFloat(value.toPrecision(precision)));\n}\nexport function isArray(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value) && !(value instanceof DataView);\n}\n\nfunction duplicateArray(array) {\n return array.clone ? array.clone() : new Array(array.length);\n}\n\nexport function clone(array) {\n return array.clone ? array.clone() : new Array(...array);\n}\n\nfunction map(value, func, result) {\n if (isArray(value)) {\n result = result || duplicateArray(value);\n\n for (let i = 0; i < result.length && i < value.length; ++i) {\n result[i] = func(value[i], i, result);\n }\n\n return result;\n }\n\n return func(value);\n}\n\nexport function toRadians(degrees) {\n return radians(degrees);\n}\nexport function toDegrees(radians) {\n return degrees(radians);\n}\nexport function radians(degrees, result) {\n return map(degrees, degrees => degrees * DEGREES_TO_RADIANS, result);\n}\nexport function degrees(radians, result) {\n return map(radians, radians => radians * RADIANS_TO_DEGREES, result);\n}\nexport function sin(radians) {\n return map(radians, angle => Math.sin(angle));\n}\nexport function cos(radians) {\n return map(radians, angle => Math.cos(angle));\n}\nexport function tan(radians) {\n return map(radians, angle => Math.tan(angle));\n}\nexport function asin(radians) {\n return map(radians, angle => Math.asin(angle));\n}\nexport function acos(radians) {\n return map(radians, angle => Math.acos(angle));\n}\nexport function atan(radians) {\n return map(radians, angle => Math.atan(angle));\n}\nexport function clamp(value, min, max) {\n return map(value, value => Math.max(min, Math.min(max, value)));\n}\nexport function lerp(a, b, t) {\n if (isArray(a)) {\n return a.map((ai, i) => lerp(ai, b[i], t));\n }\n\n return t * b + (1 - t) * a;\n}\nexport function equals(a, b, epsilon) {\n const oldEpsilon = config.EPSILON;\n\n if (epsilon) {\n config.EPSILON = epsilon;\n }\n\n try {\n if (a === b) {\n return true;\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; ++i) {\n if (!equals(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (a && a.equals) {\n return a.equals(b);\n }\n\n if (b && b.equals) {\n return b.equals(a);\n }\n\n if (Number.isFinite(a) && Number.isFinite(b)) {\n return Math.abs(a - b) <= config.EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n }\n\n return false;\n } finally {\n config.EPSILON = oldEpsilon;\n }\n}\nexport function exactEquals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a && typeof a === 'object' && b && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (a.exactEquals) {\n return a.exactEquals(b);\n }\n }\n\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; ++i) {\n if (!exactEquals(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\nexport function withEpsilon(EPSILON, func) {\n const oldPrecision = config.EPSILON;\n config.EPSILON = EPSILON;\n let value;\n\n try {\n value = func();\n } finally {\n config.EPSILON = oldPrecision;\n }\n\n return value;\n}\n//# sourceMappingURL=common.js.map","function _extendableBuiltin(cls) {\n function ExtendableBuiltin() {\n var instance = Reflect.construct(cls, Array.from(arguments));\n Object.setPrototypeOf(instance, Object.getPrototypeOf(this));\n return instance;\n }\n\n ExtendableBuiltin.prototype = Object.create(cls.prototype, {\n constructor: {\n value: cls,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(ExtendableBuiltin, cls);\n } else {\n ExtendableBuiltin.__proto__ = cls;\n }\n\n return ExtendableBuiltin;\n}\n\nimport { config, formatValue, equals, isArray } from '../../lib/common';\nimport assert from '../../lib/assert';\nexport default class MathArray extends _extendableBuiltin(Array) {\n get ELEMENTS() {\n assert(false);\n return 0;\n }\n\n clone() {\n return new this.constructor().copy(this);\n }\n\n from(arrayOrObject) {\n return Array.isArray(arrayOrObject) ? this.copy(arrayOrObject) : this.fromObject(arrayOrObject);\n }\n\n fromArray(array, offset = 0) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = array[i + offset];\n }\n\n return this.check();\n }\n\n to(arrayOrObject) {\n if (arrayOrObject === this) {\n return this;\n }\n\n return isArray(arrayOrObject) ? this.toArray(arrayOrObject) : this.toObject(arrayOrObject);\n }\n\n toTarget(target) {\n return target ? this.to(target) : this;\n }\n\n toArray(array = [], offset = 0) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n array[offset + i] = this[i];\n }\n\n return array;\n }\n\n toFloat32Array() {\n return new Float32Array(this);\n }\n\n toString() {\n return this.formatString(config);\n }\n\n formatString(opts) {\n let string = '';\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n string += (i > 0 ? ', ' : '') + formatValue(this[i], opts);\n }\n\n return \"\".concat(opts.printTypes ? this.constructor.name : '', \"[\").concat(string, \"]\");\n }\n\n equals(array) {\n if (!array || this.length !== array.length) {\n return false;\n }\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n if (!equals(this[i], array[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n exactEquals(array) {\n if (!array || this.length !== array.length) {\n return false;\n }\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n if (this[i] !== array[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n negate() {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = -this[i];\n }\n\n return this.check();\n }\n\n lerp(a, b, t) {\n if (t === undefined) {\n t = b;\n b = a;\n a = this;\n }\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n const ai = a[i];\n this[i] = ai + t * (b[i] - ai);\n }\n\n return this.check();\n }\n\n min(vector) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = Math.min(vector[i], this[i]);\n }\n\n return this.check();\n }\n\n max(vector) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = Math.max(vector[i], this[i]);\n }\n\n return this.check();\n }\n\n clamp(minVector, maxVector) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = Math.min(Math.max(this[i], minVector[i]), maxVector[i]);\n }\n\n return this.check();\n }\n\n add(...vectors) {\n for (const vector of vectors) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] += vector[i];\n }\n }\n\n return this.check();\n }\n\n subtract(...vectors) {\n for (const vector of vectors) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] -= vector[i];\n }\n }\n\n return this.check();\n }\n\n scale(scale) {\n if (Array.isArray(scale)) {\n return this.multiply(scale);\n }\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] *= scale;\n }\n\n return this.check();\n }\n\n sub(a) {\n return this.subtract(a);\n }\n\n setScalar(a) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = a;\n }\n\n return this.check();\n }\n\n addScalar(a) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] += a;\n }\n\n return this.check();\n }\n\n subScalar(a) {\n return this.addScalar(-a);\n }\n\n multiplyScalar(scalar) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] *= scalar;\n }\n\n return this.check();\n }\n\n divideScalar(a) {\n return this.scale(1 / a);\n }\n\n clampScalar(min, max) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] = Math.min(Math.max(this[i], min), max);\n }\n\n return this.check();\n }\n\n multiplyByScalar(scalar) {\n return this.scale(scalar);\n }\n\n get elements() {\n return this;\n }\n\n check() {\n if (config.debug && !this.validate()) {\n throw new Error(\"math.gl: \".concat(this.constructor.name, \" some fields set to invalid numbers'\"));\n }\n\n return this;\n }\n\n validate() {\n let valid = this.length === this.ELEMENTS;\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n valid = valid && Number.isFinite(this[i]);\n }\n\n return valid;\n }\n\n}\n//# sourceMappingURL=math-array.js.map","import { config } from './common';\nexport function validateVector(v, length) {\n if (v.length !== length) {\n return false;\n }\n\n for (let i = 0; i < v.length; ++i) {\n if (!Number.isFinite(v[i])) {\n return false;\n }\n }\n\n return true;\n}\nexport function checkNumber(value) {\n if (!Number.isFinite(value)) {\n throw new Error(\"Invalid number \".concat(value));\n }\n\n return value;\n}\nexport function checkVector(v, length, callerName = '') {\n if (config.debug && !validateVector(v, length)) {\n throw new Error(\"math.gl: \".concat(callerName, \" some fields set to invalid numbers'\"));\n }\n\n return v;\n}\nconst map = {};\nexport function deprecated(method, version) {\n if (!map[method]) {\n map[method] = true;\n console.warn(\"\".concat(method, \" has been removed in version \").concat(version, \", see upgrade guide for more information\"));\n }\n}\n//# sourceMappingURL=validators.js.map","import MathArray from './math-array';\nimport { checkNumber } from '../../lib/validators';\nimport assert from '../../lib/assert';\nexport default class Vector extends MathArray {\n get ELEMENTS() {\n assert(false);\n return 0;\n }\n\n copy(vector) {\n assert(false);\n return this;\n }\n\n get x() {\n return this[0];\n }\n\n set x(value) {\n this[0] = checkNumber(value);\n }\n\n get y() {\n return this[1];\n }\n\n set y(value) {\n this[1] = checkNumber(value);\n }\n\n len() {\n return Math.sqrt(this.lengthSquared());\n }\n\n magnitude() {\n return this.len();\n }\n\n lengthSquared() {\n let length = 0;\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n length += this[i] * this[i];\n }\n\n return length;\n }\n\n magnitudeSquared() {\n return this.lengthSquared();\n }\n\n distance(mathArray) {\n return Math.sqrt(this.distanceSquared(mathArray));\n }\n\n distanceSquared(mathArray) {\n let length = 0;\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n const dist = this[i] - mathArray[i];\n length += dist * dist;\n }\n\n return checkNumber(length);\n }\n\n dot(mathArray) {\n let product = 0;\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n product += this[i] * mathArray[i];\n }\n\n return checkNumber(product);\n }\n\n normalize() {\n const length = this.magnitude();\n\n if (length !== 0) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] /= length;\n }\n }\n\n return this.check();\n }\n\n multiply(...vectors) {\n for (const vector of vectors) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] *= vector[i];\n }\n }\n\n return this.check();\n }\n\n divide(...vectors) {\n for (const vector of vectors) {\n for (let i = 0; i < this.ELEMENTS; ++i) {\n this[i] /= vector[i];\n }\n }\n\n return this.check();\n }\n\n lengthSq() {\n return this.lengthSquared();\n }\n\n distanceTo(vector) {\n return this.distance(vector);\n }\n\n distanceToSquared(vector) {\n return this.distanceSquared(vector);\n }\n\n getComponent(i) {\n assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');\n return checkNumber(this[i]);\n }\n\n setComponent(i, value) {\n assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');\n this[i] = value;\n return this.check();\n }\n\n addVectors(a, b) {\n return this.copy(a).add(b);\n }\n\n subVectors(a, b) {\n return this.copy(a).subtract(b);\n }\n\n multiplyVectors(a, b) {\n return this.copy(a).multiply(b);\n }\n\n addScaledVector(a, b) {\n return this.add(new this.constructor(a).multiplyScalar(b));\n }\n\n}\n//# sourceMappingURL=vector.js.map","/**\r\n * Common utilities\r\n * @module glMatrix\r\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\r\n * Sets the type of array used when creating new vectors and matrices\r\n *\r\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\r\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\r\n * Convert Degree To Radian\r\n *\r\n * @param {Number} a Angle in Degrees\r\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\r\n * Tests whether or not the arguments have approximately the same value, within an absolute\r\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\r\n * than or equal to 1.0, and a relative tolerance is used for larger values)\r\n *\r\n * @param {Number} a The first number to test.\r\n * @param {Number} b The second number to test.\r\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};","import * as glMatrix from \"./common.js\";\n/**\r\n * 3 Dimensional Vector\r\n * @module vec3\r\n */\n\n/**\r\n * Creates a new, empty vec3\r\n *\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec3 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec3} a vector to clone\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Calculates the length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Creates a new vec3 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} a new 3D vector\r\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Copy the values from one vec3 to another\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the source vector\r\n * @returns {vec3} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\r\n * Set the components of a vec3 to the given values\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @returns {vec3} out\r\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\r\n * Adds two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\r\n * Multiplies two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\r\n * Divides two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to ceil\r\n * @returns {vec3} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to floor\r\n * @returns {vec3} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\r\n * Math.round the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to round\r\n * @returns {vec3} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\r\n * Scales a vec3 by a scalar number\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec3} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\r\n * Adds two vec3's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec3} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Calculates the squared length of a vec3\r\n *\r\n * @param {ReadonlyVec3} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\r\n * Negates the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to negate\r\n * @returns {vec3} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to invert\r\n * @returns {vec3} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\r\n * Normalize a vec3\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a vector to normalize\r\n * @returns {vec3} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec3's\r\n *\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\r\n * Computes the cross product of two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec3's\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\r\n * Performs a hermite interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Performs a bezier interpolation with two control points\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the first operand\r\n * @param {ReadonlyVec3} b the second operand\r\n * @param {ReadonlyVec3} c the third operand\r\n * @param {ReadonlyVec3} d the fourth operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec3} out\r\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec3} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\r\n * Transforms the vec3 with a mat4.\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\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 return out;\n}\n/**\r\n * Transforms the vec3 with a mat3.\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n 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/**\r\n * Transforms the vec3 with a quat\r\n * Can also be used for dual quaternions. (Multiply it with the real part)\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec3} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec3} out\r\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\r\n * Rotate a 3D vector around the x-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the y-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Rotate a 3D vector around the z-axis\r\n * @param {vec3} out The receiving vec3\r\n * @param {ReadonlyVec3} a The vec3 point to rotate\r\n * @param {ReadonlyVec3} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec3} out\r\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\r\n * Get the angle between two 3D vectors\r\n * @param {ReadonlyVec3} a The first operand\r\n * @param {ReadonlyVec3} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec3 to zero\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @returns {vec3} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec3} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec3} a The first vector.\r\n * @param {ReadonlyVec3} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\r\n * Alias for {@link vec3.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec3.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec3.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec3.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec3.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec3.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec3.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec3s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();","export function vec2_transformMat4AsVector(out, a, m) {\n const x = a[0];\n const y = a[1];\n const w = m[3] * x + m[7] * y || 1.0;\n out[0] = (m[0] * x + m[4] * y) / w;\n out[1] = (m[1] * x + m[5] * y) / w;\n return out;\n}\nexport function vec3_transformMat4AsVector(out, a, m) {\n const x = a[0];\n const y = a[1];\n const z = a[2];\n const w = m[3] * x + m[7] * y + m[11] * z || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z) / w;\n return out;\n}\nexport function vec3_transformMat2(out, a, m) {\n const x = a[0];\n const y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n out[2] = a[2];\n return out;\n}\nexport function vec4_transformMat2(out, a, m) {\n const x = a[0];\n const y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\nexport function vec4_transformMat3(out, a, m) {\n const x = a[0];\n const y = a[1];\n const z = a[2];\n out[0] = m[0] * x + m[3] * y + m[6] * z;\n out[1] = m[1] * x + m[4] * y + m[7] * z;\n out[2] = m[2] * x + m[5] * y + m[8] * z;\n out[3] = a[3];\n return out;\n}\n//# sourceMappingURL=gl-matrix-extras.js.map","import Vector from './base/vector';\nimport { config, isArray } from '../lib/common';\nimport { checkNumber } from '../lib/validators';\nimport * as vec3 from 'gl-matrix/vec3';\nimport { vec3_transformMat2, vec3_transformMat4AsVector } from '../lib/gl-matrix-extras';\nconst ORIGIN = [0, 0, 0];\nconst constants = {};\nexport default class Vector3 extends Vector {\n static get ZERO() {\n return constants.ZERO = constants.ZERO || Object.freeze(new Vector3(0, 0, 0, 0));\n }\n\n constructor(x = 0, y = 0, z = 0) {\n super(-0, -0, -0);\n\n if (arguments.length === 1 && isArray(x)) {\n this.copy(x);\n } else {\n if (config.debug) {\n checkNumber(x);\n checkNumber(y);\n checkNumber(z);\n }\n\n this[0] = x;\n this[1] = y;\n this[2] = z;\n }\n }\n\n set(x, y, z) {\n this[0] = x;\n this[1] = y;\n this[2] = z;\n return this.check();\n }\n\n copy(array) {\n this[0] = array[0];\n this[1] = array[1];\n this[2] = array[2];\n return this.check();\n }\n\n fromObject(object) {\n if (config.debug) {\n checkNumber(object.x);\n checkNumber(object.y);\n checkNumber(object.z);\n }\n\n this[0] = object.x;\n this[1] = object.y;\n this[2] = object.z;\n return this.check();\n }\n\n toObject(object) {\n object.x = this[0];\n object.y = this[1];\n object.z = this[2];\n return object;\n }\n\n get ELEMENTS() {\n return 3;\n }\n\n get z() {\n return this[2];\n }\n\n set z(value) {\n this[2] = checkNumber(value);\n }\n\n angle(vector) {\n return vec3.angle(this, vector);\n }\n\n cross(vector) {\n vec3.cross(this, this, vector);\n return this.check();\n }\n\n rotateX({\n radians,\n origin = ORIGIN\n }) {\n vec3.rotateX(this, this, origin, radians);\n return this.check();\n }\n\n rotateY({\n radians,\n origin = ORIGIN\n }) {\n vec3.rotateY(this, this, origin, radians);\n return this.check();\n }\n\n rotateZ({\n radians,\n origin = ORIGIN\n }) {\n vec3.rotateZ(this, this, origin, radians);\n return this.check();\n }\n\n transform(matrix4) {\n return this.transformAsPoint(matrix4);\n }\n\n transformAsPoint(matrix4) {\n vec3.transformMat4(this, this, matrix4);\n return this.check();\n }\n\n transformAsVector(matrix4) {\n vec3_transformMat4AsVector(this, this, matrix4);\n return this.check();\n }\n\n transformByMatrix3(matrix3) {\n vec3.transformMat3(this, this, matrix3);\n return this.check();\n }\n\n transformByMatrix2(matrix2) {\n vec3_transformMat2(this, this, matrix2);\n return this.check();\n }\n\n transformByQuaternion(quaternion) {\n vec3.transformQuat(this, this, quaternion);\n return this.check();\n }\n\n}\n//# sourceMappingURL=vector3.js.map","import MathArray from './math-array';\nimport { checkNumber } from '../../lib/validators';\nimport { config } from '../../lib/common';\nimport assert from '../../lib/assert';\nexport default class Matrix extends MathArray {\n get ELEMENTS() {\n assert(false);\n return 0;\n }\n\n get RANK() {\n assert(false);\n return 0;\n }\n\n toString() {\n let string = '[';\n\n if (config.printRowMajor) {\n string += 'row-major:';\n\n for (let row = 0; row < this.RANK; ++row) {\n for (let col = 0; col < this.RANK; ++col) {\n string += \" \".concat(this[col * this.RANK + row]);\n }\n }\n } else {\n string += 'column-major:';\n\n for (let i = 0; i < this.ELEMENTS; ++i) {\n string += \" \".concat(this[i]);\n }\n }\n\n string += ']';\n return string;\n }\n\n getElementIndex(row, col) {\n return col * this.RANK + row;\n }\n\n getElement(row, col) {\n return this[col * this.RANK + row];\n }\n\n setElement(row, col, value) {\n this[col * this.RANK + row] = checkNumber(value);\n return this;\n }\n\n getColumn(columnIndex, result = new Array(this.RANK).fill(-0)) {\n const firstIndex = columnIndex * this.RANK;\n\n for (let i = 0; i < this.RANK; ++i) {\n result[i] = this[firstIndex + i];\n }\n\n return result;\n }\n\n setColumn(columnIndex, columnVector) {\n const firstIndex = columnIndex * this.RANK;\n\n for (let i = 0; i < this.RANK; ++i) {\n this[firstIndex + i] = columnVector[i];\n }\n\n return this;\n }\n\n}\n//# sourceMappingURL=matrix.js.map","import * as glMatrix from \"./common.js\";\n/**\r\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\r\n * @module mat4\r\n */\n\n/**\r\n * Creates a new identity mat4\r\n *\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 initialized with values from an existing matrix\r\n *\r\n * @param {ReadonlyMat4} a matrix to clone\r\n * @returns {mat4} a new 4x4 matrix\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\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 return out;\n}\n/**\r\n * Copy the values from one mat4 to another\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\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 return out;\n}\n/**\r\n * Create a new mat4 with the given values\r\n *\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} A new mat4\r\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set the components of a mat4 to the given values\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\r\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\r\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\r\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\r\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\r\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\r\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\r\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\r\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\r\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\r\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\r\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\r\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\r\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\r\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\r\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\r\n * @returns {mat4} out\r\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\r\n * Set a mat4 to the identity matrix\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @returns {mat4} out\r\n */\n\nexport function identity(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/**\r\n * Transpose the values of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Inverts a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\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/**\r\n * Calculates the adjugate of a mat4\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {mat4} out\r\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\r\n * Calculates the determinant of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the source matrix\r\n * @returns {Number} determinant of a\r\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\r\n * Multiplies two mat4s\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n 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];\n b1 = b[5];\n b2 = b[6];\n 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];\n b1 = b[9];\n b2 = b[10];\n 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];\n b1 = b[13];\n b2 = b[14];\n 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}\n/**\r\n * Translate a mat4 by the given vector\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to translate\r\n * @param {ReadonlyVec3} v vector to translate by\r\n * @returns {mat4} out\r\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\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];\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 a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n 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\n return out;\n}\n/**\r\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\r\n * @returns {mat4} out\r\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n 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/**\r\n * Rotates a mat4 by the given angle around the given axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\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 a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the X axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\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 } // Perform axis-specific matrix multiplication\n\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/**\r\n * Rotates a matrix by the given angle around the Y axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\r\n * Rotates a matrix by the given angle around the Z axis\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to rotate\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\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 } // Perform axis-specific matrix multiplication\n\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/**\r\n * Creates a matrix from a vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromTranslation(out, v) {\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] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a vector scaling\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.scale(dest, dest, vec);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyVec3} v Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\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/**\r\n * Creates a matrix from a given angle around a given axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotate(dest, dest, rad, axis);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @param {ReadonlyVec3} axis the axis to rotate around\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\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/**\r\n * Creates a matrix from the given angle around the X axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateX(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\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/**\r\n * Creates a matrix from the given angle around the Y axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateY(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\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/**\r\n * Creates a matrix from the given angle around the Z axis\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.rotateZ(dest, dest, rad);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {Number} rad the angle to rotate the matrix by\r\n * @returns {mat4} out\r\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\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/**\r\n * Creates a matrix from a quaternion rotation and vector translation\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a new mat4 from a dual quat.\r\n *\r\n * @param {mat4} out Matrix\r\n * @param {ReadonlyQuat2} a Dual Quaternion\r\n * @returns {mat4} mat4 receiving operation result\r\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\r\n * Returns the translation vector component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslation,\r\n * the returned vector will be the same as the translation vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive translation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\r\n * Returns the scaling factor component of a transformation\r\n * matrix. If a matrix is built with fromRotationTranslationScale\r\n * with a normalized Quaternion paramter, the returned vector will be\r\n * the same as the scaling vector\r\n * originally supplied.\r\n * @param {vec3} out Vector to receive scaling factor component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {vec3} out\r\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\r\n * Returns a quaternion representing the rotational component\r\n * of a transformation matrix. If a matrix is built with\r\n * fromRotationTranslation, the returned quaternion will be the\r\n * same as the quaternion originally supplied.\r\n * @param {quat} out Quaternion to receive the rotation component\r\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\r\n * @return {quat} out\r\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\r\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\r\n * This is equivalent to (but much faster than):\r\n *\r\n * mat4.identity(dest);\r\n * mat4.translate(dest, vec);\r\n * mat4.translate(dest, origin);\r\n * let quatMat = mat4.create();\r\n * quat4.toMat4(quat, quatMat);\r\n * mat4.multiply(dest, quatMat);\r\n * mat4.scale(dest, scale)\r\n * mat4.translate(dest, negativeOrigin);\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {quat4} q Rotation quaternion\r\n * @param {ReadonlyVec3} v Translation vector\r\n * @param {ReadonlyVec3} s Scaling vector\r\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\r\n * @returns {mat4} out\r\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\r\n * Calculates a 4x4 matrix from the given quaternion\r\n *\r\n * @param {mat4} out mat4 receiving operation result\r\n * @param {ReadonlyQuat} q Quaternion to create matrix from\r\n *\r\n * @returns {mat4} out\r\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\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/**\r\n * Generates a frustum matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Number} left Left bound of the frustum\r\n * @param {Number} right Right bound of the frustum\r\n * @param {Number} bottom Bottom bound of the frustum\r\n * @param {Number} top Top bound of the frustum\r\n * @param {Number} near Near bound of the frustum\r\n * @param {Number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given bounds.\r\n * Passing null/undefined/no value for far will generate infinite projection matrix.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} fovy Vertical field of view in radians\r\n * @param {number} aspect Aspect ratio. typically viewport width/height\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum, can be null or Infinity\r\n * @returns {mat4} out\r\n */\n\nexport function perspective(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\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[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\r\n * Generates a perspective projection matrix with the given field of view.\r\n * This is primarily useful for generating projection matrices to be used\r\n * with the still experiemental WebVR API.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\r\n * Generates a orthogonal projection matrix with the given bounds\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {number} left Left bound of the frustum\r\n * @param {number} right Right bound of the frustum\r\n * @param {number} bottom Bottom bound of the frustum\r\n * @param {number} top Top bound of the frustum\r\n * @param {number} near Near bound of the frustum\r\n * @param {number} far Far bound of the frustum\r\n * @returns {mat4} out\r\n */\n\nexport function ortho(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var 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/**\r\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\r\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\r\n * Generates a matrix that makes something look at something else.\r\n *\r\n * @param {mat4} out mat4 frustum matrix will be written into\r\n * @param {ReadonlyVec3} eye Position of the viewer\r\n * @param {ReadonlyVec3} center Point the viewer is looking at\r\n * @param {ReadonlyVec3} up vec3 pointing up\r\n * @returns {mat4} out\r\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\r\n * Returns a string representation of a mat4\r\n *\r\n * @param {ReadonlyMat4} a matrix to represent as a string\r\n * @returns {String} string representation of the matrix\r\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\r\n * Returns Frobenius norm of a mat4\r\n *\r\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\r\n * @returns {Number} Frobenius norm\r\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\r\n * Adds two mat4's\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\r\n * Subtracts matrix b from matrix a\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @returns {mat4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\r\n * Multiply each element of the matrix by a scalar.\r\n *\r\n * @param {mat4} out the receiving matrix\r\n * @param {ReadonlyMat4} a the matrix to scale\r\n * @param {Number} b amount to scale the matrix's elements by\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalar(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 out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\r\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\r\n *\r\n * @param {mat4} out the receiving vector\r\n * @param {ReadonlyMat4} a the first operand\r\n * @param {ReadonlyMat4} b the second operand\r\n * @param {Number} scale the amount to scale b's elements by before adding\r\n * @returns {mat4} out\r\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\r\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\r\n * Returns whether or not the matrices have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyMat4} a The first matrix.\r\n * @param {ReadonlyMat4} b The second matrix.\r\n * @returns {Boolean} True if the matrices are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\r\n * Alias for {@link mat4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link mat4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;","import * as glMatrix from \"./common.js\";\n/**\r\n * 2 Dimensional Vector\r\n * @module vec2\r\n */\n\n/**\r\n * Creates a new, empty vec2\r\n *\r\n * @returns {vec2} a new 2D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec2} a vector to clone\r\n * @returns {vec2} a new 2D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Creates a new vec2 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} a new 2D vector\r\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Copy the values from one vec2 to another\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the source vector\r\n * @returns {vec2} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\r\n * Set the components of a vec2 to the given values\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @returns {vec2} out\r\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\r\n * Adds two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\r\n * Multiplies two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\r\n * Divides two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to ceil\r\n * @returns {vec2} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to floor\r\n * @returns {vec2} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec2} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\r\n * Math.round the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to round\r\n * @returns {vec2} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\r\n * Scales a vec2 by a scalar number\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec2} out\r\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\r\n * Adds two vec2's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec2} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\r\n * Calculates the length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\r\n * Calculates the squared length of a vec2\r\n *\r\n * @param {ReadonlyVec2} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\r\n * Negates the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to negate\r\n * @returns {vec2} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to invert\r\n * @returns {vec2} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\r\n * Normalize a vec2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a vector to normalize\r\n * @returns {vec2} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec2's\r\n *\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\r\n * Computes the cross product of two vec2's\r\n * Note that the cross product must by definition produce a 3D vector\r\n *\r\n * @param {vec3} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @returns {vec3} out\r\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec2's\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the first operand\r\n * @param {ReadonlyVec2} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec2} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec2} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat2d\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat2d} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat3\r\n * 3rd vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat3} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\r\n * Transforms the vec2 with a mat4\r\n * 3rd vector component is implicitly '0'\r\n * 4th vector component is implicitly '1'\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @param {ReadonlyVec2} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec2} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\r\n * Rotate a 2D vector\r\n * @param {vec2} out The receiving vec2\r\n * @param {ReadonlyVec2} a The vec2 point to rotate\r\n * @param {ReadonlyVec2} b The origin of the rotation\r\n * @param {Number} rad The angle of rotation in radians\r\n * @returns {vec2} out\r\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\r\n * Get the angle between two 2D vectors\r\n * @param {ReadonlyVec2} a The first operand\r\n * @param {ReadonlyVec2} b The second operand\r\n * @returns {Number} The angle in radians\r\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\r\n * Set the components of a vec2 to zero\r\n *\r\n * @param {vec2} out the receiving vector\r\n * @returns {vec2} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec2} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\r\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec2} a The first vector.\r\n * @param {ReadonlyVec2} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\r\n * Alias for {@link vec2.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec2.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec2.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec2.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec2.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec2.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec2.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec2s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();","import * as glMatrix from \"./common.js\";\n/**\r\n * 4 Dimensional Vector\r\n * @module vec4\r\n */\n\n/**\r\n * Creates a new, empty vec4\r\n *\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with values from an existing vector\r\n *\r\n * @param {ReadonlyVec4} a vector to clone\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Creates a new vec4 initialized with the given values\r\n *\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} a new 4D vector\r\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Copy the values from one vec4 to another\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the source vector\r\n * @returns {vec4} out\r\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to the given values\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} x X component\r\n * @param {Number} y Y component\r\n * @param {Number} z Z component\r\n * @param {Number} w W component\r\n * @returns {vec4} out\r\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\r\n * Adds two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\r\n * Subtracts vector b from vector a\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\r\n * Multiplies two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\r\n * Divides two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\r\n * Math.ceil the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to ceil\r\n * @returns {vec4} out\r\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\r\n * Math.floor the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to floor\r\n * @returns {vec4} out\r\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\r\n * Returns the minimum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\r\n * Returns the maximum of two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {vec4} out\r\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\r\n * Math.round the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to round\r\n * @returns {vec4} out\r\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\r\n * Scales a vec4 by a scalar number\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to scale\r\n * @param {Number} b amount to scale the vector by\r\n * @returns {vec4} out\r\n */\n\nexport function scale(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/**\r\n * Adds two vec4's after scaling the second operand by a scalar value\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} scale the amount to scale b by before adding\r\n * @returns {vec4} out\r\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\r\n * Calculates the euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} distance between a and b\r\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared euclidian distance between two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} squared distance between a and b\r\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Calculates the length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate length of\r\n * @returns {Number} length of a\r\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\r\n * Calculates the squared length of a vec4\r\n *\r\n * @param {ReadonlyVec4} a vector to calculate squared length of\r\n * @returns {Number} squared length of a\r\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\r\n * Negates the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to negate\r\n * @returns {vec4} out\r\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\r\n * Returns the inverse of the components of a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to invert\r\n * @returns {vec4} out\r\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\r\n * Normalize a vec4\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a vector to normalize\r\n * @returns {vec4} out\r\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\r\n * Calculates the dot product of two vec4's\r\n *\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @returns {Number} dot product of a and b\r\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\r\n * Returns the cross-product of three vectors in a 4-dimensional space\r\n *\r\n * @param {ReadonlyVec4} result the receiving vector\r\n * @param {ReadonlyVec4} U the first vector\r\n * @param {ReadonlyVec4} V the second vector\r\n * @param {ReadonlyVec4} W the third vector\r\n * @returns {vec4} result\r\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\r\n * Performs a linear interpolation between two vec4's\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the first operand\r\n * @param {ReadonlyVec4} b the second operand\r\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\r\n * @returns {vec4} out\r\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\r\n * Generates a random vector with the given scale\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\r\n * @returns {vec4} out\r\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\r\n * Transforms the vec4 with a mat4.\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyMat4} m matrix to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n 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/**\r\n * Transforms the vec4 with a quat\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @param {ReadonlyVec4} a the vector to transform\r\n * @param {ReadonlyQuat} q quaternion to transform with\r\n * @returns {vec4} out\r\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\r\n * Set the components of a vec4 to zero\r\n *\r\n * @param {vec4} out the receiving vector\r\n * @returns {vec4} out\r\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\r\n * Returns a string representation of a vector\r\n *\r\n * @param {ReadonlyVec4} a vector to represent as a string\r\n * @returns {String} string representation of the vector\r\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\r\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\r\n * Returns whether or not the vectors have approximately the same elements in the same position.\r\n *\r\n * @param {ReadonlyVec4} a The first vector.\r\n * @param {ReadonlyVec4} b The second vector.\r\n * @returns {Boolean} True if the vectors are equal, false otherwise.\r\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\r\n * Alias for {@link vec4.subtract}\r\n * @function\r\n */\n\nexport var sub = subtract;\n/**\r\n * Alias for {@link vec4.multiply}\r\n * @function\r\n */\n\nexport var mul = multiply;\n/**\r\n * Alias for {@link vec4.divide}\r\n * @function\r\n */\n\nexport var div = divide;\n/**\r\n * Alias for {@link vec4.distance}\r\n * @function\r\n */\n\nexport var dist = distance;\n/**\r\n * Alias for {@link vec4.squaredDistance}\r\n * @function\r\n */\n\nexport var sqrDist = squaredDistance;\n/**\r\n * Alias for {@link vec4.length}\r\n * @function\r\n */\n\nexport var len = length;\n/**\r\n * Alias for {@link vec4.squaredLength}\r\n * @function\r\n */\n\nexport var sqrLen = squaredLength;\n/**\r\n * Perform some operation over an array of vec4s.\r\n *\r\n * @param {Array} a the array of vectors to iterate over\r\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\r\n * @param {Number} offset Number of elements to skip at the beginning of the array\r\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\r\n * @param {Function} fn Function to call for each vector in the array\r\n * @param {Object} [arg] additional argument to pass to fn\r\n * @returns {Array} a\r\n * @function\r\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();","import { checkVector, deprecated } from '../lib/validators';\nimport Matrix from './base/matrix';\nimport { vec2_transformMat4AsVector, vec3_transformMat4AsVector } from '../lib/gl-matrix-extras';\nimport * as mat4 from 'gl-matrix/mat4';\nimport * as vec2 from 'gl-matrix/vec2';\nimport * as vec3 from 'gl-matrix/vec3';\nimport * as vec4 from 'gl-matrix/vec4';\nconst IDENTITY = Object.freeze([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\nconst ZERO = Object.freeze([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\nconst INDICES = Object.freeze({\n COL0ROW0: 0,\n COL0ROW1: 1,\n COL0ROW2: 2,\n COL0ROW3: 3,\n COL1ROW0: 4,\n COL1ROW1: 5,\n COL1ROW2: 6,\n COL1ROW3: 7,\n COL2ROW0: 8,\n COL2ROW1: 9,\n COL2ROW2: 10,\n COL2ROW3: 11,\n COL3ROW0: 12,\n COL3ROW1: 13,\n COL3ROW2: 14,\n COL3ROW3: 15\n});\nconst constants = {};\nexport default class Matrix4 extends Matrix {\n static get IDENTITY() {\n constants.IDENTITY = constants.IDENTITY || Object.freeze(new Matrix4(IDENTITY));\n return constants.IDENTITY;\n }\n\n static get ZERO() {\n constants.ZERO = constants.ZERO || Object.freeze(new Matrix4(ZERO));\n return constants.ZERO;\n }\n\n get INDICES() {\n return INDICES;\n }\n\n get ELEMENTS() {\n return 16;\n }\n\n get RANK() {\n return 4;\n }\n\n constructor(array) {\n super(-0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0);\n\n if (arguments.length === 1 && Array.isArray(array)) {\n this.copy(array);\n } else {\n this.identity();\n }\n }\n\n copy(array) {\n this[0] = array[0];\n this[1] = array[1];\n this[2] = array[2];\n this[3] = array[3];\n this[4] = array[4];\n this[5] = array[5];\n this[6] = array[6];\n this[7] = array[7];\n this[8] = array[8];\n this[9] = array[9];\n this[10] = array[10];\n this[11] = array[11];\n this[12] = array[12];\n this[13] = array[13];\n this[14] = array[14];\n this[15] = array[15];\n return this.check();\n }\n\n set(m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33) {\n this[0] = m00;\n this[1] = m10;\n this[2] = m20;\n this[3] = m30;\n this[4] = m01;\n this[5] = m11;\n this[6] = m21;\n this[7] = m31;\n this[8] = m02;\n this[9] = m12;\n this[10] = m22;\n this[11] = m32;\n this[12] = m03;\n this[13] = m13;\n this[14] = m23;\n this[15] = m33;\n return this.check();\n }\n\n setRowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n this[0] = m00;\n this[1] = m10;\n this[2] = m20;\n this[3] = m30;\n this[4] = m01;\n this[5] = m11;\n this[6] = m21;\n this[7] = m31;\n this[8] = m02;\n this[9] = m12;\n this[10] = m22;\n this[11] = m32;\n this[12] = m03;\n this[13] = m13;\n this[14] = m23;\n this[15] = m33;\n return this.check();\n }\n\n toRowMajor(result) {\n result[0] = this[0];\n result[1] = this[4];\n result[2] = this[8];\n result[3] = this[12];\n result[4] = this[1];\n result[5] = this[5];\n result[6] = this[9];\n result[7] = this[13];\n result[8] = this[2];\n result[9] = this[6];\n result[10] = this[10];\n result[11] = this[14];\n result[12] = this[3];\n result[13] = this[7];\n result[14] = this[11];\n result[15] = this[15];\n return result;\n }\n\n identity() {\n return this.copy(IDENTITY);\n }\n\n fromQuaternion(q) {\n mat4.fromQuat(this, q);\n return this.check();\n }\n\n frustum({\n left,\n right,\n bottom,\n top,\n near,\n far\n }) {\n if (far === Infinity) {\n Matrix4._computeInfinitePerspectiveOffCenter(this, left, right, bottom, top, near);\n } else {\n mat4.frustum(this, left, right, bottom, top, near, far);\n }\n\n return this.check();\n }\n\n static _computeInfinitePerspectiveOffCenter(result, left, right, bottom, top, near) {\n const column0Row0 = 2.0 * near / (right - left);\n const column1Row1 = 2.0 * near / (top - bottom);\n const column2Row0 = (right + left) / (right - left);\n const column2Row1 = (top + bottom) / (top - bottom);\n const column2Row2 = -1.0;\n const column2Row3 = -1.0;\n const column3Row2 = -2.0 * near;\n result[0] = column0Row0;\n result[1] = 0.0;\n result[2] = 0.0;\n result[3] = 0.0;\n result[4] = 0.0;\n result[5] = column1Row1;\n result[6] = 0.0;\n result[7] = 0.0;\n result[8] = column2Row0;\n result[9] = column2Row1;\n result[10] = column2Row2;\n result[11] = column2Row3;\n result[12] = 0.0;\n result[13] = 0.0;\n result[14] = column3Row2;\n result[15] = 0.0;\n return result;\n }\n\n lookAt(eye, center, up) {\n if (arguments.length === 1) {\n ({\n eye,\n center,\n up\n } = eye);\n }\n\n center = center || [0, 0, 0];\n up = up || [0, 1, 0];\n mat4.lookAt(this, eye, center, up);\n return this.check();\n }\n\n ortho({\n left,\n right,\n bottom,\n top,\n near = 0.1,\n far = 500\n }) {\n mat4.ortho(this, left, right, bottom, top, near, far);\n return this.check();\n }\n\n orthographic({\n fovy = 45 * Math.PI / 180,\n aspect = 1,\n focalDistance = 1,\n near = 0.1,\n far = 500\n }) {\n if (fovy > Math.PI * 2) {\n throw Error('radians');\n }\n\n const halfY = fovy / 2;\n const top = focalDistance * Math.tan(halfY);\n const right = top * aspect;\n return new Matrix4().ortho({\n left: -right,\n right,\n bottom: -top,\n top,\n near,\n far\n });\n }\n\n perspective({\n fovy = undefined,\n fov = 45 * Math.PI / 180,\n aspect = 1,\n near = 0.1,\n far = 500\n } = {}) {\n fovy = fovy || fov;\n\n if (fovy > Math.PI * 2) {\n throw Error('radians');\n }\n\n mat4.perspective(this, fovy, aspect, near, far);\n return this.check();\n }\n\n determinant() {\n return mat4.determinant(this);\n }\n\n getScale(result = [-0, -0, -0]) {\n result[0] = Math.sqrt(this[0] * this[0] + this[1] * this[1] + this[2] * this[2]);\n result[1] = Math.sqrt(this[4] * this[4] + this[5] * this[5] + this[6] * this[6]);\n result[2] = Math.sqrt(this[8] * this[8] + this[9] * this[9] + this[10] * this[10]);\n return result;\n }\n\n getTranslation(result = [-0, -0, -0]) {\n result[0] = this[12];\n result[1] = this[13];\n result[2] = this[14];\n return result;\n }\n\n getRotation(result = [-0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0], scaleResult = null) {\n const scale = this.getScale(scaleResult || [-0, -0, -0]);\n const inverseScale0 = 1 / scale[0];\n const inverseScale1 = 1 / scale[1];\n const inverseScale2 = 1 / scale[2];\n result[0] = this[0] * inverseScale0;\n result[1] = this[1] * inverseScale1;\n result[2] = this[2] * inverseScale2;\n result[3] = 0;\n result[4] = this[4] * inverseScale0;\n result[5] = this[5] * inverseScale1;\n result[6] = this[6] * inverseScale2;\n result[7] = 0;\n result[8] = this[8] * inverseScale0;\n result[9] = this[9] * inverseScale1;\n result[10] = this[10] * inverseScale2;\n result[11] = 0;\n result[12] = 0;\n result[13] = 0;\n result[14] = 0;\n result[15] = 1;\n return result;\n }\n\n getRotationMatrix3(result = [-0, -0, -0, -0, -0, -0, -0, -0, -0], scaleResult = null) {\n const scale = this.getScale(scaleResult || [-0, -0, -0]);\n const inverseScale0 = 1 / scale[0];\n const inverseScale1 = 1 / scale[1];\n const inverseScale2 = 1 / scale[2];\n result[0] = this[0] * inverseScale0;\n result[1] = this[1] * inverseScale1;\n result[2] = this[2] * inverseScale2;\n result[3] = this[4] * inverseScale0;\n result[4] = this[5] * inverseScale1;\n result[5] = this[6] * inverseScale2;\n result[6] = this[8] * inverseScale0;\n result[7] = this[9] * inverseScale1;\n result[8] = this[10] * inverseScale2;\n return result;\n }\n\n transpose() {\n mat4.transpose(this, this);\n return this.check();\n }\n\n invert() {\n mat4.invert(this, this);\n return this.check();\n }\n\n multiplyLeft(a) {\n mat4.multiply(this, a, this);\n return this.check();\n }\n\n multiplyRight(a) {\n mat4.multiply(this, this, a);\n return this.check();\n }\n\n rotateX(radians) {\n mat4.rotateX(this, this, radians);\n return this.check();\n }\n\n rotateY(radians) {\n mat4.rotateY(this, this, radians);\n return this.check();\n }\n\n rotateZ(radians) {\n mat4.rotateZ(this, this, radians);\n return this.check();\n }\n\n rotateXYZ([rx, ry, rz]) {\n return this.rotateX(rx).rotateY(ry).rotateZ(rz);\n }\n\n rotateAxis(radians, axis) {\n mat4.rotate(this, this, radians, axis);\n return this.check();\n }\n\n scale(factor) {\n if (Array.isArray(factor)) {\n mat4.scale(this, this, factor);\n } else {\n mat4.scale(this, this, [factor, factor, factor]);\n }\n\n return this.check();\n }\n\n translate(vec) {\n mat4.translate(this, this, vec);\n return this.check();\n }\n\n transform(vector, result) {\n if (vector.length === 4) {\n result = vec4.transformMat4(result || [-0, -0, -0, -0], vector, this);\n checkVector(result, 4);\n return result;\n }\n\n return this.transformAsPoint(vector, result);\n }\n\n transformAsPoint(vector, result) {\n const {\n length\n } = vector;\n\n switch (length) {\n case 2:\n result = vec2.transformMat4(result || [-0, -0], vector, this);\n break;\n\n case 3:\n result = vec3.transformMat4(result || [-0, -0, -0], vector, this);\n break;\n\n default:\n throw new Error('Illegal vector');\n }\n\n checkVector(result, vector.length);\n return result;\n }\n\n transformAsVector(vector, result) {\n switch (vector.length) {\n case 2:\n result = vec2_transformMat4AsVector(result || [-0, -0], vector, this);\n break;\n\n case 3:\n result = vec3_transformMat4AsVector(result || [-0, -0, -0], vector, this);\n break;\n\n default:\n throw new Error('Illegal vector');\n }\n\n checkVector(result, vector.length);\n return result;\n }\n\n makeRotationX(radians) {\n return this.identity().rotateX(radians);\n }\n\n makeTranslation(x, y, z) {\n return this.identity().translate([x, y, z]);\n }\n\n transformPoint(vector, result) {\n deprecated('Matrix4.transformPoint', '3.0');\n return this.transformAsPoint(vector, result);\n }\n\n transformVector(vector, result) {\n deprecated('Matrix4.transformVector', '3.0');\n return this.transformAsPoint(vector, result);\n }\n\n transformDirection(vector, result) {\n deprecated('Matrix4.transformDirection', '3.0');\n return this.transformAsVector(vector, result);\n }\n\n}\n//# sourceMappingURL=matrix4.js.map","export default {\n EPSILON1: 1e-1,\n EPSILON2: 1e-2,\n EPSILON3: 1e-3,\n EPSILON4: 1e-4,\n EPSILON5: 1e-5,\n EPSILON6: 1e-6,\n EPSILON7: 1e-7,\n EPSILON8: 1e-8,\n EPSILON9: 1e-9,\n EPSILON10: 1e-10,\n EPSILON11: 1e-11,\n EPSILON12: 1e-12,\n EPSILON13: 1e-13,\n EPSILON14: 1e-14,\n EPSILON15: 1e-15,\n EPSILON16: 1e-16,\n EPSILON17: 1e-17,\n EPSILON18: 1e-18,\n EPSILON19: 1e-19,\n EPSILON20: 1e-20,\n PI_OVER_TWO: Math.PI / 2,\n PI_OVER_FOUR: Math.PI / 4,\n PI_OVER_SIX: Math.PI / 6,\n TWO_PI: Math.PI * 2\n};\n//# sourceMappingURL=math-utils.js.map","export const WGS84_RADIUS_X = 6378137.0;\nexport const WGS84_RADIUS_Y = 6378137.0;\nexport const WGS84_RADIUS_Z = 6356752.3142451793;\nexport const WGS84_CONSTANTS = {\n radii: [WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z],\n radiiSquared: [WGS84_RADIUS_X * WGS84_RADIUS_X, WGS84_RADIUS_Y * WGS84_RADIUS_Y, WGS84_RADIUS_Z * WGS84_RADIUS_Z],\n oneOverRadii: [1.0 / WGS84_RADIUS_X, 1.0 / WGS84_RADIUS_Y, 1.0 / WGS84_RADIUS_Z],\n oneOverRadiiSquared: [1.0 / (WGS84_RADIUS_X * WGS84_RADIUS_X), 1.0 / (WGS84_RADIUS_Y * WGS84_RADIUS_Y), 1.0 / (WGS84_RADIUS_Z * WGS84_RADIUS_Z)],\n maximumRadius: Math.max(WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z),\n centerToleranceSquared: 1e-1\n};\n//# sourceMappingURL=constants.js.map","import { Vector3, isArray, toRadians, toDegrees, config } from '@math.gl/core';\nimport { WGS84_CONSTANTS } from './constants';\n\nconst noop = x => x;\n\nconst scratchVector = new Vector3();\nexport function fromCartographic(cartographic, result, map = noop) {\n if (isArray(cartographic)) {\n result[0] = map(cartographic[0]);\n result[1] = map(cartographic[1]);\n result[2] = cartographic[2];\n } else if ('longitude' in cartographic) {\n result[0] = map(cartographic.longitude);\n result[1] = map(cartographic.latitude);\n result[2] = cartographic.height;\n } else {\n result[0] = map(cartographic.x);\n result[1] = map(cartographic.y);\n result[2] = cartographic.z;\n }\n\n return result;\n}\nexport function fromCartographicToRadians(cartographic, vector = scratchVector) {\n return fromCartographic(cartographic, vector, config._cartographicRadians ? noop : toRadians);\n}\nexport function fromCartographicToDegrees(cartographic, vector = scratchVector) {\n return fromCartographic(cartographic, vector, config._cartographicRadians ? toDegrees : noop);\n}\nexport function toCartographic(vector, cartographic, map = noop) {\n if (isArray(cartographic)) {\n cartographic[0] = map(vector[0]);\n cartographic[1] = map(vector[1]);\n cartographic[2] = vector[2];\n } else if ('longitude' in cartographic) {\n cartographic.longitude = map(vector[0]);\n cartographic.latitude = map(vector[1]);\n cartographic.height = vector[2];\n } else {\n cartographic.x = map(vector[0]);\n cartographic.y = map(vector[1]);\n cartographic.z = vector[2];\n }\n\n return cartographic;\n}\nexport function toCartographicFromRadians(vector, cartographic) {\n return toCartographic(vector, cartographic, config._cartographicRadians ? noop : toDegrees);\n}\nexport function toCartographicFromDegrees(vector, cartographic) {\n return toCartographic(vector, cartographic, config._cartographicRadians ? toRadians : noop);\n}\nexport function isWGS84(vector) {\n if (!vector) {\n return false;\n }\n\n scratchVector.from(vector);\n const {\n oneOverRadiiSquared,\n centerToleranceSquared\n } = WGS84_CONSTANTS;\n const x2 = vector[0] * vector[0] * oneOverRadiiSquared[0];\n const y2 = vector[1] * vector[1] * oneOverRadiiSquared[1];\n const z2 = vector[2] * vector[2] * oneOverRadiiSquared[2];\n return Math.abs(x2 + y2 + z2 - 1) < centerToleranceSquared;\n}\n//# sourceMappingURL=type-utils.js.map","import { Vector3, assert, _MathUtils } from '@math.gl/core';\nimport * as vec3 from 'gl-matrix/vec3';\nconst scratchVector = new Vector3();\nconst scaleToGeodeticSurfaceIntersection = new Vector3();\nconst scaleToGeodeticSurfaceGradient = new Vector3();\nexport default function scaleToGeodeticSurface(cartesian, ellipsoid, result = new Vector3()) {\n const {\n oneOverRadii,\n oneOverRadiiSquared,\n centerToleranceSquared\n } = ellipsoid;\n scratchVector.from(cartesian);\n const positionX = cartesian.x;\n const positionY = cartesian.y;\n const positionZ = cartesian.z;\n const oneOverRadiiX = oneOverRadii.x;\n const oneOverRadiiY = oneOverRadii.y;\n const oneOverRadiiZ = oneOverRadii.z;\n const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;\n const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;\n const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;\n const squaredNorm = x2 + y2 + z2;\n const ratio = Math.sqrt(1.0 / squaredNorm);\n\n if (!Number.isFinite(ratio)) {\n return undefined;\n }\n\n const intersection = scaleToGeodeticSurfaceIntersection;\n intersection.copy(cartesian).scale(ratio);\n\n if (squaredNorm < centerToleranceSquared) {\n return intersection.to(result);\n }\n\n const oneOverRadiiSquaredX = oneOverRadiiSquared.x;\n const oneOverRadiiSquaredY = oneOverRadiiSquared.y;\n const oneOverRadiiSquaredZ = oneOverRadiiSquared.z;\n const gradient = scaleToGeodeticSurfaceGradient;\n gradient.set(intersection.x * oneOverRadiiSquaredX * 2.0, intersection.y * oneOverRadiiSquaredY * 2.0, intersection.z * oneOverRadiiSquaredZ * 2.0);\n let lambda = (1.0 - ratio) * cartesian.len() / (0.5 * gradient.len());\n let correction = 0.0;\n let xMultiplier;\n let yMultiplier;\n let zMultiplier;\n let func;\n\n do {\n lambda -= correction;\n xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);\n yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);\n zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);\n const xMultiplier2 = xMultiplier * xMultiplier;\n const yMultiplier2 = yMultiplier * yMultiplier;\n const zMultiplier2 = zMultiplier * zMultiplier;\n const xMultiplier3 = xMultiplier2 * xMultiplier;\n const yMultiplier3 = yMultiplier2 * yMultiplier;\n const zMultiplier3 = zMultiplier2 * zMultiplier;\n func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;\n const denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ;\n const derivative = -2.0 * denominator;\n correction = func / derivative;\n } while (Math.abs(func) > _MathUtils.EPSILON12);\n\n return scratchVector.scale([xMultiplier, yMultiplier, zMultiplier]).to(result);\n}\n//# sourceMappingURL=scale-to-geodetic-surface.js.map","import { Vector3, assert, equals as equalsEpsilon } from '@math.gl/core';\nconst EPSILON14 = 1e-14;\nconst scratchOrigin = new Vector3();\nconst VECTOR_PRODUCT_LOCAL_FRAME = {\n up: {\n south: 'east',\n north: 'west',\n west: 'south',\n east: 'north'\n },\n down: {\n south: 'west',\n north: 'east',\n west: 'north',\n east: 'south'\n },\n south: {\n up: 'west',\n down: 'east',\n west: 'down',\n east: 'up'\n },\n north: {\n up: 'east',\n down: 'west',\n west: 'up',\n east: 'down'\n },\n west: {\n up: 'north',\n down: 'south',\n north: 'down',\n south: 'up'\n },\n east: {\n up: 'south',\n down: 'north',\n north: 'up',\n south: 'down'\n }\n};\nconst degeneratePositionLocalFrame = {\n north: [-1, 0, 0],\n east: [0, 1, 0],\n up: [0, 0, 1],\n south: [1, 0, 0],\n west: [0, -1, 0],\n down: [0, 0, -1]\n};\nconst scratchAxisVectors = {\n east: new Vector3(),\n north: new Vector3(),\n up: new Vector3(),\n west: new Vector3(),\n south: new Vector3(),\n down: new Vector3()\n};\nconst scratchVector1 = new Vector3();\nconst scratchVector2 = new Vector3();\nconst scratchVector3 = new Vector3();\nexport default function localFrameToFixedFrame(ellipsoid, firstAxis, secondAxis, thirdAxis, cartesianOrigin, result) {\n const thirdAxisInferred = VECTOR_PRODUCT_LOCAL_FRAME[firstAxis] && VECTOR_PRODUCT_LOCAL_FRAME[firstAxis][secondAxis];\n assert(thirdAxisInferred && (!thirdAxis || thirdAxis === thirdAxisInferred));\n let firstAxisVector;\n let secondAxisVector;\n let thirdAxisVector;\n const origin = scratchOrigin.copy(cartesianOrigin);\n const atPole = equalsEpsilon(origin.x, 0.0, EPSILON14) && equalsEpsilon(origin.y, 0.0, EPSILON14);\n\n if (atPole) {\n const sign = Math.sign(origin.z);\n firstAxisVector = scratchVector1.fromArray(degeneratePositionLocalFrame[firstAxis]);\n\n if (firstAxis !== 'east' && firstAxis !== 'west') {\n firstAxisVector.scale(sign);\n }\n\n secondAxisVector = scratchVector2.fromArray(degeneratePositionLocalFrame[secondAxis]);\n\n if (secondAxis !== 'east' && secondAxis !== 'west') {\n secondAxisVector.scale(sign);\n }\n\n thirdAxisVector = scratchVector3.fromArray(degeneratePositionLocalFrame[thirdAxis]);\n\n if (thirdAxis !== 'east' && thirdAxis !== 'west') {\n thirdAxisVector.scale(sign);\n }\n } else {\n const {\n up,\n east,\n north\n } = scratchAxisVectors;\n east.set(-origin.y, origin.x, 0.0).normalize();\n ellipsoid.geodeticSurfaceNormal(origin, up);\n north.copy(up).cross(east);\n const {\n down,\n west,\n south\n } = scratchAxisVectors;\n down.copy(up).scale(-1);\n west.copy(east).scale(-1);\n south.copy(north).scale(-1);\n firstAxisVector = scratchAxisVectors[firstAxis];\n secondAxisVector = scratchAxisVectors[secondAxis];\n thirdAxisVector = scratchAxisVectors[thirdAxis];\n }\n\n result[0] = firstAxisVector.x;\n result[1] = firstAxisVector.y;\n result[2] = firstAxisVector.z;\n result[3] = 0.0;\n result[4] = secondAxisVector.x;\n result[5] = secondAxisVector.y;\n result[6] = secondAxisVector.z;\n result[7] = 0.0;\n result[8] = thirdAxisVector.x;\n result[9] = thirdAxisVector.y;\n result[10] = thirdAxisVector.z;\n result[11] = 0.0;\n result[12] = origin.x;\n result[13] = origin.y;\n result[14] = origin.z;\n result[15] = 1.0;\n return result;\n}\n//# sourceMappingURL=ellipsoid-transform.js.map","import { Vector3, Matrix4, toRadians, toDegrees, assert, equals, _MathUtils } from '@math.gl/core';\nimport * as vec3 from 'gl-matrix/vec3';\nimport { WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z } from '../constants';\nimport { fromCartographicToRadians, toCartographicFromRadians } from '../type-utils';\nimport scaleToGeodeticSurface from './helpers/scale-to-geodetic-surface';\nimport localFrameToFixedFrame from './helpers/ellipsoid-transform';\nconst scratchVector = new Vector3();\nconst scratchNormal = new Vector3();\nconst scratchK = new Vector3();\nconst scratchPosition = new Vector3();\nconst scratchHeight = new Vector3();\nconst scratchCartesian = new Vector3();\nlet wgs84;\nexport default class Ellipsoid {\n static get WGS84() {\n wgs84 = wgs84 || new Ellipsoid(WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z);\n return wgs84;\n }\n\n constructor(x = 0.0, y = 0.0, z = 0.0) {\n assert(x >= 0.0);\n assert(y >= 0.0);\n assert(z >= 0.0);\n this.radii = new Vector3(x, y, z);\n this.radiiSquared = new Vector3(x * x, y * y, z * z);\n this.radiiToTheFourth = new Vector3(x * x * x * x, y * y * y * y, z * z * z * z);\n this.oneOverRadii = new Vector3(x === 0.0 ? 0.0 : 1.0 / x, y === 0.0 ? 0.0 : 1.0 / y, z === 0.0 ? 0.0 : 1.0 / z);\n this.oneOverRadiiSquared = new Vector3(x === 0.0 ? 0.0 : 1.0 / (x * x), y === 0.0 ? 0.0 : 1.0 / (y * y), z === 0.0 ? 0.0 : 1.0 / (z * z));\n this.minimumRadius = Math.min(x, y, z);\n this.maximumRadius = Math.max(x, y, z);\n this.centerToleranceSquared = _MathUtils.EPSILON1;\n\n if (this.radiiSquared.z !== 0) {\n this.squaredXOverSquaredZ = this.radiiSquared.x / this.radiiSquared.z;\n }\n\n Object.freeze(this);\n }\n\n equals(right) {\n return this === right || Boolean(right && this.radii.equals(right.radii));\n }\n\n toString() {\n return this.radii.toString();\n }\n\n cartographicToCartesian(cartographic, result = [0, 0, 0]) {\n const normal = scratchNormal;\n const k = scratchK;\n const [,, height] = cartographic;\n this.geodeticSurfaceNormalCartographic(cartographic, normal);\n k.copy(this.radiiSquared).scale(normal);\n const gamma = Math.sqrt(normal.dot(k));\n k.scale(1 / gamma);\n normal.scale(height);\n k.add(normal);\n return k.to(result);\n }\n\n cartesianToCartographic(cartesian, result = [0, 0, 0]) {\n scratchCartesian.from(cartesian);\n const point = this.scaleToGeodeticSurface(scratchCartesian, scratchPosition);\n\n if (!point) {\n return undefined;\n }\n\n const normal = this.geodeticSurfaceNormal(point, scratchNormal);\n const h = scratchHeight;\n h.copy(scratchCartesian).subtract(point);\n const longitude = Math.atan2(normal.y, normal.x);\n const latitude = Math.asin(normal.z);\n const height = Math.sign(vec3.dot(h, scratchCartesian)) * vec3.length(h);\n return toCartographicFromRadians([longitude, latitude, height], result);\n }\n\n eastNorthUpToFixedFrame(origin, result = new Matrix4()) {\n return localFrameToFixedFrame(this, 'east', 'north', 'up', origin, result);\n }\n\n localFrameToFixedFrame(firstAxis, secondAxis, thirdAxis, origin, result = new Matrix4()) {\n return localFrameToFixedFrame(this, firstAxis, secondAxis, thirdAxis, origin, result);\n }\n\n geocentricSurfaceNormal(cartesian, result = [0, 0, 0]) {\n return scratchVector.from(cartesian).normalize().to(result);\n }\n\n geodeticSurfaceNormalCartographic(cartographic, result = [0, 0, 0]) {\n const cartographicVectorRadians = fromCartographicToRadians(cartographic);\n const longitude = cartographicVectorRadians[0];\n const latitude = cartographicVectorRadians[1];\n const cosLatitude = Math.cos(latitude);\n scratchVector.set(cosLatitude * Math.cos(longitude), cosLatitude * Math.sin(longitude), Math.sin(latitude)).normalize();\n return scratchVector.to(result);\n }\n\n geodeticSurfaceNormal(cartesian, result = [0, 0, 0]) {\n return scratchVector.from(cartesian).scale(this.oneOverRadiiSquared).normalize().to(result);\n }\n\n scaleToGeodeticSurface(cartesian, result) {\n return scaleToGeodeticSurface(cartesian, this, result);\n }\n\n scaleToGeocentricSurface(cartesian, result = [0, 0, 0]) {\n scratchPosition.from(cartesian);\n const positionX = scratchPosition.x;\n const positionY = scratchPosition.y;\n const positionZ = scratchPosition.z;\n const oneOverRadiiSquared = this.oneOverRadiiSquared;\n const beta = 1.0 / Math.sqrt(positionX * positionX * oneOverRadiiSquared.x + positionY * positionY * oneOverRadiiSquared.y + positionZ * positionZ * oneOverRadiiSquared.z);\n return scratchPosition.multiplyScalar(beta).to(result);\n }\n\n transformPositionToScaledSpace(position, result = [0, 0, 0]) {\n return scratchPosition.from(position).scale(this.oneOverRadii).to(result);\n }\n\n transformPositionFromScaledSpace(position, result = [0, 0, 0]) {\n return scratchPosition.from(position).scale(this.radii).to(result);\n }\n\n getSurfaceNormalIntersectionWithZAxis(position, buffer = 0.0, result = [0, 0, 0]) {\n assert(equals(this.radii.x, this.radii.y, _MathUtils.EPSILON15));\n assert(this.radii.z > 0);\n scratchPosition.from(position);\n const z = scratchPosition.z * (1 - this.squaredXOverSquaredZ);\n\n if (Math.abs(z) >= this.radii.z - buffer) {\n return undefined;\n }\n\n return scratchPosition.set(0.0, 0.0, z).to(result);\n }\n\n}\n//# sourceMappingURL=ellipsoid.js.map","// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n","import {isBrowser} from '@loaders.gl/loader-utils';\nimport type {ImageTypeEnum} from '../../types';\n\n// @ts-ignore TS2339: Property does not exist on type\nconst {_parseImageNode} = globalThis;\n\nconst IMAGE_SUPPORTED = typeof Image !== 'undefined'; // NOTE: \"false\" positives if jsdom is installed\nconst IMAGE_BITMAP_SUPPORTED = typeof ImageBitmap !== 'undefined';\nconst NODE_IMAGE_SUPPORTED = Boolean(_parseImageNode);\nconst DATA_SUPPORTED = isBrowser ? true : NODE_IMAGE_SUPPORTED;\n\n/**\n * Checks if a loaders.gl image type is supported\n * @param type image type string\n */\nexport function isImageTypeSupported(type: string): boolean {\n switch (type) {\n case 'auto':\n // Should only ever be false in Node.js, if polyfills have not been installed...\n return IMAGE_BITMAP_SUPPORTED || IMAGE_SUPPORTED || DATA_SUPPORTED;\n\n case 'imagebitmap':\n return IMAGE_BITMAP_SUPPORTED;\n case 'image':\n return IMAGE_SUPPORTED;\n case 'data':\n return DATA_SUPPORTED;\n\n default:\n throw new Error(`@loaders.gl/images: image ${type} not supported in this environment`);\n }\n}\n\n/**\n * Returns the \"most performant\" supported image type on this platform\n * @returns image type string\n */\nexport function getDefaultImageType(): ImageTypeEnum {\n if (IMAGE_BITMAP_SUPPORTED) {\n return 'imagebitmap';\n }\n if (IMAGE_SUPPORTED) {\n return 'image';\n }\n if (DATA_SUPPORTED) {\n return 'data';\n }\n\n // This should only happen in Node.js\n throw new Error('Install \\'@loaders.gl/polyfills\\' to parse images under Node.js');\n}\n","import type {ImageType, ImageTypeEnum, ImageDataType} from '../../types';\n\nexport function isImage(image: ImageType): boolean {\n return Boolean(getImageTypeOrNull(image));\n}\n\nexport function deleteImage(image: ImageType): void {\n switch (getImageType(image)) {\n case 'imagebitmap':\n (image as ImageBitmap).close();\n break;\n default:\n // Nothing to do for images and image data objects\n }\n}\n\nexport function getImageType(image: ImageType): ImageTypeEnum {\n const format = getImageTypeOrNull(image);\n if (!format) {\n throw new Error('Not an image');\n }\n return format;\n}\n\nexport function getImageSize(image: ImageType): {width: number; height: number} {\n return getImageData(image);\n}\n\nexport function getImageData(image: ImageType): ImageDataType | ImageData {\n switch (getImageType(image)) {\n case 'data':\n return image as unknown as ImageData;\n\n case 'image':\n case 'imagebitmap':\n // Extract the image data from the image via a canvas\n const canvas = document.createElement('canvas');\n // TODO - reuse the canvas?\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('getImageData');\n }\n // @ts-ignore\n canvas.width = image.width;\n // @ts-ignore\n canvas.height = image.height;\n // @ts-ignore\n context.drawImage(image, 0, 0);\n // @ts-ignore\n return context.getImageData(0, 0, image.width, image.height);\n\n default:\n throw new Error('getImageData');\n }\n}\n\n// PRIVATE\n\n// eslint-disable-next-line complexity\nfunction getImageTypeOrNull(image) {\n if (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) {\n return 'imagebitmap';\n }\n if (typeof Image !== 'undefined' && image instanceof Image) {\n return 'image';\n }\n if (image && typeof image === 'object' && image.data && image.width && image.height) {\n return 'data';\n }\n return null;\n}\n","// SVG parsing has limitations, e.g:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n\nconst SVG_DATA_URL_PATTERN = /^data:image\\/svg\\+xml/;\nconst SVG_URL_PATTERN = /\\.svg((\\?|#).*)?$/;\n\nexport function isSVG(url) {\n return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));\n}\n\nexport function getBlobOrSVGDataUrl(arrayBuffer: ArrayBuffer, url?: string): Blob | string {\n if (isSVG(url)) {\n // Prepare a properly tagged data URL, and load using normal mechanism\n const textDecoder = new TextDecoder();\n let xmlText = textDecoder.decode(arrayBuffer);\n // TODO Escape in browser to support e.g. Chinese characters\n try {\n if (typeof unescape === 'function' && typeof encodeURIComponent === 'function') {\n xmlText = unescape(encodeURIComponent(xmlText));\n }\n } catch (error) {\n throw new Error((error as Error).message);\n }\n // base64 encoding is safer. utf-8 fails in some browsers\n const src = `data:image/svg+xml;base64,${btoa(xmlText)}`;\n return src;\n }\n return getBlob(arrayBuffer, url);\n}\n\nexport function getBlob(arrayBuffer: ArrayBuffer, url?: string): Blob {\n if (isSVG(url)) {\n // https://bugs.chromium.org/p/chromium/issues/detail?id=606319\n // return new Blob([new Uint8Array(arrayBuffer)], {type: 'image/svg+xml'});\n throw new Error('SVG cannot be parsed directly to imagebitmap');\n }\n // TODO - how to determine mime type? Param? Sniff here?\n return new Blob([new Uint8Array(arrayBuffer)]); // MIME type not needed?\n}\n","import type {ImageLoaderOptions} from '../../image-loader';\nimport {getBlobOrSVGDataUrl} from './svg-utils';\n\n// Parses html image from array buffer\nexport default async function parseToImage(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions,\n url?: string\n): Promise<HTMLImageElement> {\n // Note: image parsing requires conversion to Blob (for createObjectURL).\n // Potentially inefficient for not using `response.blob()` (and for File / Blob inputs)...\n // But presumably not worth adding 'blob' flag to loader objects?\n\n const blobOrDataUrl = getBlobOrSVGDataUrl(arrayBuffer, url);\n const URL = self.URL || self.webkitURL;\n const objectUrl = typeof blobOrDataUrl !== 'string' && URL.createObjectURL(blobOrDataUrl);\n try {\n return await loadToImage(objectUrl || blobOrDataUrl, options);\n } finally {\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nexport async function loadToImage(url, options): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = url;\n\n // The `image.onload()` callback does not guarantee that the image has been decoded\n // so a main thread \"freeze\" can be incurred when using the image for the first time.\n // `Image.decode()` returns a promise that completes when image is decoded.\n\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decode\n // Note: When calling `img.decode()`, we do not need to wait for `img.onload()`\n // Note: `HTMLImageElement.decode()` is not available in Edge and IE11\n if (options.image && options.image.decode && image.decode) {\n await image.decode();\n return image;\n }\n\n // Create a promise that tracks onload/onerror callbacks\n return await new Promise((resolve, reject) => {\n try {\n image.onload = () => resolve(image);\n image.onerror = (err) => reject(new Error(`Could not load image ${url}: ${err}`));\n } catch (error) {\n reject(error);\n }\n });\n}\n","import type {ImageLoaderOptions} from '../../image-loader';\nimport {isSVG, getBlob} from './svg-utils';\nimport parseToImage from './parse-to-image';\n\nconst EMPTY_OBJECT = {};\n\nlet imagebitmapOptionsSupported = true;\n\n/**\n * Asynchronously parses an array buffer into an ImageBitmap - this contains the decoded data\n * ImageBitmaps are supported on worker threads, but not supported on Edge, IE11 and Safari\n * https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap#Browser_compatibility\n *\n * TODO - createImageBitmap supports source rect (5 param overload), pass through?\n */\nexport default async function parseToImageBitmap(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions,\n url?: string\n): Promise<ImageBitmap> {\n let blob;\n\n // Cannot parse SVG directly to ImageBitmap, parse to Image first\n if (isSVG(url)) {\n // Note: this only works on main thread\n const image = await parseToImage(arrayBuffer, options, url);\n blob = image;\n } else {\n // Create blob from the array buffer\n blob = getBlob(arrayBuffer, url);\n }\n\n const imagebitmapOptions = options && options.imagebitmap;\n\n return await safeCreateImageBitmap(blob, imagebitmapOptions);\n}\n\n/**\n * Safely creates an imageBitmap with options\n * *\n * Firefox crashes if imagebitmapOptions is supplied\n * Avoid supplying if not provided or supported, remember if not supported\n */\nasync function safeCreateImageBitmap(\n blob: Blob,\n imagebitmapOptions: ImageBitmapOptions | null = null\n): Promise<ImageBitmap> {\n if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) {\n imagebitmapOptions = null;\n }\n\n if (imagebitmapOptions) {\n try {\n // @ts-ignore Options\n return await createImageBitmap(blob, imagebitmapOptions);\n } catch (error) {\n console.warn(error); // eslint-disable-line\n imagebitmapOptionsSupported = false;\n }\n }\n\n return await createImageBitmap(blob);\n}\n\nfunction isEmptyObject(object) {\n // @ts-ignore\n for (const key in object || EMPTY_OBJECT) {\n return false;\n }\n return true;\n}\n","// Attributions\n// * Based on binary-gltf-utils under MIT license: Copyright (c) 2016-17 Karl Cheng\n\n// TODO: make these functions work for Node.js buffers?\n// Quarantine references to Buffer to prevent bundler from adding big polyfills\n// import {bufferToArrayBuffer} from '../node/buffer-to-array-buffer';\n// TODO - this should be handled in @loaders.gl/polyfills\n\n/** MIME type, width and height extracted from binary compressed image data */\nexport type BinaryImageMetadata = {\n mimeType: string;\n width: number;\n height: number;\n};\n\nconst BIG_ENDIAN = false;\nconst LITTLE_ENDIAN = true;\n\n/**\n * Extracts `{mimeType, width and height}` from a memory buffer containing a known image format\n * Currently supports `image/png`, `image/jpeg`, `image/bmp` and `image/gif`.\n * @param binaryData image file memory to parse\n * @returns metadata or null if memory is not a valid image file format layout.\n */\nexport function getBinaryImageMetadata(\n binaryData: DataView | ArrayBuffer\n): BinaryImageMetadata | null {\n const dataView = toDataView(binaryData);\n return (\n getPngMetadata(dataView) ||\n getJpegMetadata(dataView) ||\n getGifMetadata(dataView) ||\n getBmpMetadata(dataView)\n );\n}\n\n// PNG\n\nfunction getPngMetadata(binaryData) {\n const dataView = toDataView(binaryData);\n // Check file contains the first 4 bytes of the PNG signature.\n const isPng = dataView.byteLength >= 24 && dataView.getUint32(0, BIG_ENDIAN) === 0x89504e47;\n if (!isPng) {\n return null;\n }\n\n // Extract size from a binary PNG file\n return {\n mimeType: 'image/png',\n width: dataView.getUint32(16, BIG_ENDIAN),\n height: dataView.getUint32(20, BIG_ENDIAN)\n };\n}\n\n// GIF\n\n// Extract size from a binary GIF file\n// TODO: GIF is not this simple\nfunction getGifMetadata(binaryData) {\n const dataView = toDataView(binaryData);\n // Check first 4 bytes of the GIF signature (\"GIF8\").\n const isGif = dataView.byteLength >= 10 && dataView.getUint32(0, BIG_ENDIAN) === 0x47494638;\n if (!isGif) {\n return null;\n }\n\n // GIF is little endian.\n return {\n mimeType: 'image/gif',\n width: dataView.getUint16(6, LITTLE_ENDIAN),\n height: dataView.getUint16(8, LITTLE_ENDIAN)\n };\n}\n\n// BMP\n\n// TODO: BMP is not this simple\nexport function getBmpMetadata(binaryData) {\n const dataView = toDataView(binaryData);\n // Check magic number is valid (first 2 characters should be \"BM\").\n // The mandatory bitmap file header is 14 bytes long.\n const isBmp =\n dataView.byteLength >= 14 &&\n dataView.getUint16(0, BIG_ENDIAN) === 0x424d &&\n dataView.getUint32(2, LITTLE_ENDIAN) === dataView.byteLength;\n\n if (!isBmp) {\n return null;\n }\n\n // BMP is little endian.\n return {\n mimeType: 'image/bmp',\n width: dataView.getUint32(18, LITTLE_ENDIAN),\n height: dataView.getUint32(22, LITTLE_ENDIAN)\n };\n}\n\n// JPEG\n\n// Extract width and height from a binary JPEG file\nfunction getJpegMetadata(binaryData) {\n const dataView = toDataView(binaryData);\n // Check file contains the JPEG \"start of image\" (SOI) marker\n // followed by another marker.\n const isJpeg =\n dataView.byteLength >= 3 &&\n dataView.getUint16(0, BIG_ENDIAN) === 0xffd8 &&\n dataView.getUint8(2) === 0xff;\n\n if (!isJpeg) {\n return null;\n }\n\n const {tableMarkers, sofMarkers} = getJpegMarkers();\n\n // Exclude the two byte SOI marker.\n let i = 2;\n while (i + 9 < dataView.byteLength) {\n const marker = dataView.getUint16(i, BIG_ENDIAN);\n\n // The frame that contains the width and height of the JPEG image.\n if (sofMarkers.has(marker)) {\n return {\n mimeType: 'image/jpeg',\n height: dataView.getUint16(i + 5, BIG_ENDIAN), // Number of lines\n width: dataView.getUint16(i + 7, BIG_ENDIAN) // Number of pixels per line\n };\n }\n\n // Miscellaneous tables/data preceding the frame header.\n if (!tableMarkers.has(marker)) {\n return null;\n }\n\n // Length includes size of length parameter but not the two byte header.\n i += 2;\n i += dataView.getUint16(i, BIG_ENDIAN);\n }\n\n return null;\n}\n\nfunction getJpegMarkers() {\n // Tables/misc header markers.\n // DQT, DHT, DAC, DRI, COM, APP_n\n const tableMarkers = new Set([0xffdb, 0xffc4, 0xffcc, 0xffdd, 0xfffe]);\n for (let i = 0xffe0; i < 0xfff0; ++i) {\n tableMarkers.add(i);\n }\n\n // SOF markers and DHP marker.\n // These markers are after tables/misc data.\n const sofMarkers = new Set([\n 0xffc0, 0xffc1, 0xffc2, 0xffc3, 0xffc5, 0xffc6, 0xffc7, 0xffc9, 0xffca, 0xffcb, 0xffcd, 0xffce,\n 0xffcf, 0xffde\n ]);\n\n return {tableMarkers, sofMarkers};\n}\n\n// TODO - move into image module?\nfunction toDataView(data) {\n if (data instanceof DataView) {\n return data;\n }\n if (ArrayBuffer.isView(data)) {\n return new DataView(data.buffer);\n }\n\n // TODO: make these functions work for Node.js buffers?\n // if (bufferToArrayBuffer) {\n // data = bufferToArrayBuffer(data);\n // }\n\n // Careful - Node Buffers will look like ArrayBuffers (keep after isBuffer)\n if (data instanceof ArrayBuffer) {\n return new DataView(data);\n }\n throw new Error('toDataView');\n}\n","import type {ImageLoaderOptions} from '../../image-loader';\nimport type {ImageDataType} from '../../types';\nimport {assert} from '@loaders.gl/loader-utils';\nimport {getBinaryImageMetadata} from '../category-api/binary-image-api';\n\n// Note: These types should be consistent with loaders.gl/polyfills\n\ntype NDArray = {\n shape: number[];\n data: Uint8Array;\n width: number;\n height: number;\n components: number;\n layers: number[];\n};\n\ntype ParseImageNode = (arrayBuffer: ArrayBuffer, mimeType: string) => Promise<NDArray>;\n\n// Use polyfills if installed to parsed image using get-pixels\nexport default async function parseToNodeImage(\n arrayBuffer: ArrayBuffer,\n options: ImageLoaderOptions\n): Promise<ImageDataType> {\n const {mimeType} = getBinaryImageMetadata(arrayBuffer) || {};\n\n // @ts-ignore\n const _parseImageNode: ParseImageNode = globalThis._parseImageNode;\n assert(_parseImageNode); // '@loaders.gl/polyfills not installed'\n\n // @ts-expect-error TODO should we throw error in this case?\n return await _parseImageNode(arrayBuffer, mimeType);\n}\n","import type {LoaderContext} from '@loaders.gl/loader-utils';\nimport {assert} from '@loaders.gl/loader-utils';\nimport type {ImageType} from '../../types';\nimport type {ImageLoaderOptions} from '../../image-loader';\nimport {isImageTypeSupported, getDefaultImageType} from '../category-api/image-type';\nimport {getImageData} from '../category-api/parsed-image-api';\nimport parseToImage from './parse-to-image';\nimport parseToImageBitmap from './parse-to-image-bitmap';\nimport parseToNodeImage from './parse-to-node-image';\n\n// Parse to platform defined image type (data on node, ImageBitmap or HTMLImage on browser)\n// eslint-disable-next-line complexity\nexport default async function parseImage(\n arrayBuffer: ArrayBuffer,\n options?: ImageLoaderOptions,\n context?: LoaderContext\n): Promise<ImageType> {\n options = options || {};\n const imageOptions = options.image || {};\n\n // The user can request a specific output format via `options.image.type`\n const imageType = imageOptions.type || 'auto';\n\n const {url} = context || {};\n\n // Note: For options.image.type === `data`, we may still need to load as `image` or `imagebitmap`\n const loadType = getLoadableImageType(imageType);\n\n let image;\n switch (loadType) {\n case 'imagebitmap':\n image = await parseToImageBitmap(arrayBuffer, options, url);\n break;\n case 'image':\n image = await parseToImage(arrayBuffer, options, url);\n break;\n case 'data':\n // Node.js loads imagedata directly\n image = await parseToNodeImage(arrayBuffer, options);\n break;\n default:\n assert(false);\n }\n\n // Browser: if options.image.type === 'data', we can now extract data from the loaded image\n if (imageType === 'data') {\n image = getImageData(image);\n }\n\n return image;\n}\n\n// Get a loadable image type from image type\nfunction getLoadableImageType(type) {\n switch (type) {\n case 'auto':\n case 'data':\n // Browser: For image data we need still need to load using an image format\n // Node: the default image type is `data`.\n return getDefaultImageType();\n default:\n // Throw an error if not supported\n isImageTypeSupported(type);\n return type;\n }\n}\n","import type {LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {VERSION} from './lib/utils/version';\nimport parseImage from './lib/parsers/parse-image';\nimport {getBinaryImageMetadata} from './lib/category-api/binary-image-api';\n\nconst EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp', 'ico', 'svg'];\nconst MIME_TYPES = [\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'image/vnd.microsoft.icon',\n 'image/svg+xml'\n];\n\nexport type ImageLoaderOptions = LoaderOptions & {\n image?: {\n type?: 'auto' | 'data' | 'imagebitmap' | 'image';\n decode?: boolean;\n };\n imagebitmap?: ImageBitmapOptions;\n};\n\nconst DEFAULT_IMAGE_LOADER_OPTIONS: ImageLoaderOptions = {\n image: {\n type: 'auto',\n decode: true // if format is HTML\n }\n // imagebitmap: {} - passes (platform dependent) parameters to ImageBitmap constructor\n};\n\n/**\n * Loads a platform-specific image type\n * Note: This type can be used as input data to WebGL texture creation\n */\nexport const ImageLoader = {\n id: 'image',\n module: 'images',\n name: 'Images',\n version: VERSION,\n mimeTypes: MIME_TYPES,\n extensions: EXTENSIONS,\n parse: parseImage,\n // TODO: byteOffset, byteLength;\n tests: [(arrayBuffer) => Boolean(getBinaryImageMetadata(new DataView(arrayBuffer)))],\n options: DEFAULT_IMAGE_LOADER_OPTIONS\n};\n\nexport const _typecheckImageLoader: LoaderWithParser = ImageLoader;\n","import type {Loader, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {DracoParseOptions} from './lib/draco-parser';\n// import type {DracoMeshData} from './types';\nimport {VERSION} from './lib/utils/version';\n\nexport type DracoLoaderOptions = LoaderOptions & {\n draco?: DracoParseOptions & {\n decoderType?: 'wasm' | 'js';\n libraryPath?: string;\n extraAttributes?;\n attributeNameEntry?: string;\n };\n};\n\nconst DEFAULT_DRACO_OPTIONS: DracoLoaderOptions = {\n draco: {\n decoderType: typeof WebAssembly === 'object' ? 'wasm' : 'js', // 'js' for IE11\n libraryPath: 'libs/',\n extraAttributes: {},\n attributeNameEntry: undefined\n }\n};\n\n/**\n * Worker loader for Draco3D compressed geometries\n */\nexport const DracoLoader = {\n name: 'Draco',\n id: 'draco',\n module: 'draco',\n shapes: ['mesh'],\n version: VERSION,\n worker: true,\n extensions: ['drc'],\n mimeTypes: ['application/octet-stream'],\n binary: true,\n tests: ['DRACO'],\n options: DEFAULT_DRACO_OPTIONS\n};\n\nexport const _TypecheckDracoLoader: Loader = DracoLoader;\n","// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n","// Mesh category utilities\n// TODO - move to mesh category module, or to math.gl/geometry module\nimport {TypedArray} from '../../types';\nimport {MeshAttributes} from './mesh-types';\n\ntype TypedArrays = {[key: string]: TypedArray};\n\n/**\n * Holds an axis aligned bounding box\n * TODO - make sure AxisAlignedBoundingBox in math.gl/culling understands this format (or change this format)\n */\ntype BoundingBox = [[number, number, number], [number, number, number]];\n\n/**\n * Get number of vertices in mesh\n * @param attributes\n */\nexport function getMeshSize(attributes: TypedArrays): number {\n let size = 0;\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n if (ArrayBuffer.isView(attribute)) {\n // @ts-ignore DataView doesn't have BYTES_PER_ELEMENT\n size += attribute.byteLength * attribute.BYTES_PER_ELEMENT;\n }\n }\n return size;\n}\n\n/**\n * Get the (axis aligned) bounding box of a mesh\n * @param attributes\n * @returns array of two vectors representing the axis aligned bounding box\n */\n// eslint-disable-next-line complexity\nexport function getMeshBoundingBox(attributes: MeshAttributes): BoundingBox {\n let minX = Infinity;\n let minY = Infinity;\n let minZ = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let maxZ = -Infinity;\n\n const positions = attributes.POSITION ? attributes.POSITION.value : [];\n const len = positions && positions.length;\n\n for (let i = 0; i < len; i += 3) {\n const x = positions[i];\n const y = positions[i + 1];\n const z = positions[i + 2];\n\n minX = x < minX ? x : minX;\n minY = y < minY ? y : minY;\n minZ = z < minZ ? z : minZ;\n\n maxX = x > maxX ? x : maxX;\n maxY = y > maxY ? y : maxY;\n maxZ = z > maxZ ? z : maxZ;\n }\n return [\n [minX, minY, minZ],\n [maxX, maxY, maxZ]\n ];\n}\n","import {assert} from '../../utils/assert';\nimport Field from './field';\n\nexport type SchemaMetadata = Map<string, any>;\n\n/**\n * ArrowJS `Schema` API-compatible class for row-based tables (returned from `DataTable`)\n * https://loaders.gl/arrowjs/docs/api-reference/schema\n */\nexport default class Schema {\n fields: Field[];\n // TODO - Arrow just allows Map<string, string>\n metadata: SchemaMetadata;\n\n constructor(fields: Field[], metadata?: SchemaMetadata) {\n assert(Array.isArray(fields));\n checkNames(fields);\n // For kepler fields, create arrow compatible `Fields` that have kepler fields as `metadata`\n this.fields = fields;\n this.metadata = metadata || new Map();\n }\n\n // TODO - arrow only seems to compare fields, not metadata\n compareTo(other: Schema): boolean {\n if (this.metadata !== other.metadata) {\n return false;\n }\n if (this.fields.length !== other.fields.length) {\n return false;\n }\n for (let i = 0; i < this.fields.length; ++i) {\n if (!this.fields[i].compareTo(other.fields[i])) {\n return false;\n }\n }\n return true;\n }\n\n select(...columnNames: string[]): Schema {\n // Ensure column names reference valid fields\n const nameMap = Object.create(null);\n for (const name of columnNames) {\n nameMap[name] = true;\n }\n const selectedFields = this.fields.filter((field) => nameMap[field.name]);\n return new Schema(selectedFields, this.metadata);\n }\n\n selectAt(...columnIndices: number[]): Schema {\n // Ensure column indices reference valid fields\n const selectedFields = columnIndices.map((index) => this.fields[index]).filter(Boolean);\n return new Schema(selectedFields, this.metadata);\n }\n\n assign(schemaOrFields: Schema | Field[]): Schema {\n let fields: Field[];\n let metadata: SchemaMetadata = this.metadata;\n\n if (schemaOrFields instanceof Schema) {\n const otherSchema = schemaOrFields;\n fields = otherSchema.fields;\n metadata = mergeMaps(mergeMaps(new Map(), this.metadata), otherSchema.metadata);\n } else {\n fields = schemaOrFields;\n }\n\n // Create a merged list of fields, overwrite fields in place, new fields at end\n const fieldMap: {[key: string]: Field} = Object.create(null);\n\n for (const field of this.fields) {\n fieldMap[field.name] = field;\n }\n\n for (const field of fields) {\n fieldMap[field.name] = field;\n }\n\n const mergedFields = Object.values(fieldMap);\n\n return new Schema(mergedFields, metadata);\n }\n}\n\n// Warn if any duplicated field names\nfunction checkNames(fields) {\n const usedNames = {};\n for (const field of fields) {\n if (usedNames[field.name]) {\n // eslint-disable-next-line\n console.warn('Schema: duplicated field name', field.name, field);\n }\n usedNames[field.name] = true;\n }\n}\n\nfunction mergeMaps<T>(m1: T, m2: T): T {\n // @ts-ignore\n return new Map([...(m1 || new Map()), ...(m2 || new Map())]);\n}\n","// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nexport function assert(condition: boolean, message?: string) {\n if (!condition) {\n throw new Error(message || 'loader assertion failed.');\n }\n}\n","// This code is adapted from ArrowJS https://github.com/apache/arrow\n// under Apache license http://www.apache.org/licenses/LICENSE-2.0\n\n/**\n * Main data type enumeration.\n *\n * Data types in this library are all *logical*. They can be expressed as\n * either a primitive physical type (bytes or bits of some fixed size), a\n * nested type consisting of other data types, or another data type (e.g. a\n * timestamp encoded as an int64).\n *\n * **Note**: Only enum values 0-17 (NONE through Map) are written to an Arrow\n * IPC payload.\n *\n * The rest of the values are specified here so TypeScript can narrow the type\n * signatures further beyond the base Arrow Types. The Arrow DataTypes include\n * metadata like `bitWidth` that impact the type signatures of the values we\n * accept and return.\n *\n * For example, the `Int8Vector` reads 1-byte numbers from an `Int8Array`, an\n * `Int32Vector` reads a 4-byte number from an `Int32Array`, and an `Int64Vector`\n * reads a pair of 4-byte lo, hi 32-bit integers as a zero-copy slice from the\n * underlying `Int32Array`.\n *\n * Library consumers benefit by knowing the narrowest type, since we can ensure\n * the types across all public methods are propagated, and never bail to `any`.\n * These values are _never_ used at runtime, and they will _never_ be written\n * to the flatbuffers metadata of serialized Arrow IPC payloads.\n */\nexport enum Type {\n /** The default placeholder type */\n NONE = 0,\n /** A NULL type having no physical storage */\n Null = 1,\n /** Signed or unsigned 8, 16, 32, or 64-bit little-endian integer */\n Int = 2,\n /** 2, 4, or 8-byte floating point value */\n Float = 3,\n /** Variable-length bytes (no guarantee of UTF8-ness) */\n Binary = 4,\n /** UTF8 variable-length string as List<Char> */\n Utf8 = 5,\n /** Boolean as 1 bit, LSB bit-packed ordering */\n Bool = 6,\n /** Precision-and-scale-based decimal type. Storage type depends on the parameters. */\n Decimal = 7,\n /** int32_t days or int64_t milliseconds since the UNIX epoch */\n Date = 8,\n /** Time as signed 32 or 64-bit integer, representing either seconds, milliseconds, microseconds, or nanoseconds since midnight since midnight */\n Time = 9,\n /** Exact timestamp encoded with int64 since UNIX epoch (Default unit millisecond) */\n Timestamp = 10,\n /** YEAR_MONTH or DAY_TIME interval in SQL style */\n Interval = 11,\n /** A list of some logical data type */\n List = 12,\n /** Struct of logical types */\n Struct = 13,\n /** Union of logical types */\n Union = 14,\n /** Fixed-size binary. Each value occupies the same number of bytes */\n FixedSizeBinary = 15,\n /** Fixed-size list. Each value occupies the same number of bytes */\n FixedSizeList = 16,\n /** Map of named logical types */\n Map = 17,\n\n /** Dictionary aka Category type */\n Dictionary = -1,\n Int8 = -2,\n Int16 = -3,\n Int32 = -4,\n Int64 = -5,\n Uint8 = -6,\n Uint16 = -7,\n Uint32 = -8,\n Uint64 = -9,\n Float16 = -10,\n Float32 = -11,\n Float64 = -12,\n DateDay = -13,\n DateMillisecond = -14,\n TimestampSecond = -15,\n TimestampMillisecond = -16,\n TimestampMicrosecond = -17,\n TimestampNanosecond = -18,\n TimeSecond = -19,\n TimeMillisecond = -20,\n TimeMicrosecond = -21,\n TimeNanosecond = -22,\n DenseUnion = -23,\n SparseUnion = -24,\n IntervalDayTime = -25,\n IntervalYearMonth = -26\n}\n","import {DataType} from './type';\n\n/**\n * ArrowJS `Field` API-compatible class for row-based tables\n * https://loaders.gl/arrowjs/docs/api-reference/field\n * A field holds name, nullable, and metadata information about a table \"column\"\n * A Schema is essentially a list of fields\n */\nexport default class Field {\n name: string;\n type: DataType;\n nullable: boolean;\n metadata: Map<string, string>;\n\n constructor(\n name: string,\n type: DataType,\n nullable = false,\n metadata: Map<string, string> = new Map()\n ) {\n this.name = name;\n this.type = type;\n this.nullable = nullable;\n this.metadata = metadata;\n }\n\n get typeId(): number {\n return this.type && this.type.typeId;\n }\n\n clone(): Field {\n return new Field(this.name, this.type, this.nullable, this.metadata);\n }\n\n compareTo(other: this): boolean {\n return (\n this.name === other.name &&\n this.type === other.type &&\n this.nullable === other.nullable &&\n this.metadata === other.metadata\n );\n }\n\n toString(): string {\n return `${this.type}${this.nullable ? ', nullable' : ''}${\n this.metadata ? `, metadata: ${this.metadata}` : ''\n }`;\n }\n}\n","// This code is adapted from ArrowJS https://github.com/apache/arrow\n// under Apache license http://www.apache.org/licenses/LICENSE-2.0\n\nimport {Type} from './enum';\n\nimport Field from './field';\n\nexport {Type} from './enum';\n\nexport type TypedIntArray =\n | Int8Array\n | Uint8Array\n | Int16Array\n | Uint16Array\n | Int32Array\n | Uint32Array\n | Int32Array\n | Uint32Array\n | Uint8ClampedArray;\n\nexport type TypedFloatArray = Float32Array | Float64Array;\n\nexport type TypedArray = TypedIntArray | TypedFloatArray;\n\nexport type AnyArrayType = Array<any> | TypedIntArray | TypedFloatArray;\n\nexport class DataType {\n static isNull(x: any): boolean {\n return x && x.typeId === Type.Null;\n }\n static isInt(x: any): boolean {\n return x && x.typeId === Type.Int;\n }\n static isFloat(x: any): boolean {\n return x && x.typeId === Type.Float;\n }\n static isBinary(x: any): boolean {\n return x && x.typeId === Type.Binary;\n }\n static isUtf8(x: any): boolean {\n return x && x.typeId === Type.Utf8;\n }\n static isBool(x: any): boolean {\n return x && x.typeId === Type.Bool;\n }\n static isDecimal(x: any): boolean {\n return x && x.typeId === Type.Decimal;\n }\n static isDate(x: any): boolean {\n return x && x.typeId === Type.Date;\n }\n static isTime(x: any): boolean {\n return x && x.typeId === Type.Time;\n }\n static isTimestamp(x: any): boolean {\n return x && x.typeId === Type.Timestamp;\n }\n static isInterval(x: any): boolean {\n return x && x.typeId === Type.Interval;\n }\n static isList(x: any): boolean {\n return x && x.typeId === Type.List;\n }\n static isStruct(x: any): boolean {\n return x && x.typeId === Type.Struct;\n }\n static isUnion(x: any): boolean {\n return x && x.typeId === Type.Union;\n }\n static isFixedSizeBinary(x: any): boolean {\n return x && x.typeId === Type.FixedSizeBinary;\n }\n static isFixedSizeList(x: any): boolean {\n return x && x.typeId === Type.FixedSizeList;\n }\n static isMap(x: any): boolean {\n return x && x.typeId === Type.Map;\n }\n static isDictionary(x: any): boolean {\n return x && x.typeId === Type.Dictionary;\n }\n\n get typeId(): Type {\n return Type.NONE;\n }\n\n // get ArrayType(): AnyArrayType {\n // return Int8Array;\n // }\n\n // get ArrayType() { return Array; }\n compareTo(other: DataType): boolean {\n // TODO\n return this === other; // comparer.visit(this, other);\n }\n}\n\n// NULL\n\nexport class Null extends DataType {\n get typeId(): Type {\n return Type.Null;\n }\n get [Symbol.toStringTag](): string {\n return 'Null';\n }\n toString(): string {\n return 'Null';\n }\n}\n\n// BOOLEANS\n\nexport class Bool extends DataType {\n get typeId(): Type {\n return Type.Bool;\n }\n // get ArrayType() {\n // return Uint8Array;\n // }\n get [Symbol.toStringTag](): string {\n return 'Bool';\n }\n toString(): string {\n return 'Bool';\n }\n}\n\n// INTS\n\nexport class Int extends DataType {\n readonly isSigned: boolean;\n readonly bitWidth: number;\n constructor(isSigned, bitWidth) {\n super();\n this.isSigned = isSigned;\n this.bitWidth = bitWidth;\n }\n get typeId(): Type {\n return Type.Int;\n }\n // get ArrayType() {\n // switch (this.bitWidth) {\n // case 8:\n // return this.isSigned ? Int8Array : Uint8Array;\n // case 16:\n // return this.isSigned ? Int16Array : Uint16Array;\n // case 32:\n // return this.isSigned ? Int32Array : Uint32Array;\n // case 64:\n // return this.isSigned ? Int32Array : Uint32Array;\n // default:\n // throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`);\n // }\n // }\n get [Symbol.toStringTag](): string {\n return 'Int';\n }\n toString(): string {\n return `${this.isSigned ? 'I' : 'Ui'}nt${this.bitWidth}`;\n }\n}\n\nexport class Int8 extends Int {\n constructor() {\n super(true, 8);\n }\n}\nexport class Int16 extends Int {\n constructor() {\n super(true, 16);\n }\n}\nexport class Int32 extends Int {\n constructor() {\n super(true, 32);\n }\n}\nexport class Int64 extends Int {\n constructor() {\n super(true, 64);\n }\n}\nexport class Uint8 extends Int {\n constructor() {\n super(false, 8);\n }\n}\nexport class Uint16 extends Int {\n constructor() {\n super(false, 16);\n }\n}\nexport class Uint32 extends Int {\n constructor() {\n super(false, 32);\n }\n}\nexport class Uint64 extends Int {\n constructor() {\n super(false, 64);\n }\n}\n\n// FLOATS\n\nconst Precision = {\n HALF: 16,\n SINGLE: 32,\n DOUBLE: 64\n};\n\nexport class Float extends DataType {\n readonly precision: number;\n constructor(precision) {\n super();\n this.precision = precision;\n }\n get typeId(): Type {\n return Type.Float;\n }\n // get ArrayType() {\n // switch (this.precision) {\n // case Precision.HALF:\n // return Uint16Array;\n // case Precision.SINGLE:\n // return Float32Array;\n // case Precision.DOUBLE:\n // return Float64Array;\n // default:\n // throw new Error(`Unrecognized ${this[Symbol.toStringTag]} type`);\n // }\n // }\n get [Symbol.toStringTag](): string {\n return 'Float';\n }\n toString(): string {\n return `Float${this.precision}`;\n }\n}\n\nexport class Float16 extends Float {\n constructor() {\n super(Precision.HALF);\n }\n}\nexport class Float32 extends Float {\n constructor() {\n super(Precision.SINGLE);\n }\n}\nexport class Float64 extends Float {\n constructor() {\n super(Precision.DOUBLE);\n }\n}\n\nexport class Binary extends DataType {\n constructor() {\n super();\n }\n get typeId() {\n return Type.Binary;\n }\n toString() {\n return 'Binary';\n }\n get [Symbol.toStringTag]() {\n return 'Binary';\n }\n}\n\n// STRINGS\n\nexport class Utf8 extends DataType {\n get typeId(): Type {\n return Type.Utf8;\n }\n // get ArrayType() {\n // return Uint8Array;\n // }\n get [Symbol.toStringTag](): string {\n return 'Utf8';\n }\n toString(): string {\n return 'Utf8';\n }\n}\n\n// DATES, TIMES AND INTERVALS\n\nconst DateUnit = {\n DAY: 0,\n MILLISECOND: 1\n};\n\nexport class Date extends DataType {\n readonly unit: number;\n constructor(unit) {\n super();\n this.unit = unit;\n }\n get typeId(): Type {\n return Type.Date;\n }\n // get ArrayType() {\n // return Int32Array;\n // }\n get [Symbol.toStringTag](): string {\n return 'Date';\n }\n toString(): string {\n return `Date${(this.unit + 1) * 32}<${DateUnit[this.unit]}>`;\n }\n}\n\nexport class DateDay extends Date {\n constructor() {\n super(DateUnit.DAY);\n }\n}\nexport class DateMillisecond extends Date {\n constructor() {\n super(DateUnit.MILLISECOND);\n }\n}\n\nconst TimeUnit = {\n SECOND: 1,\n MILLISECOND: 1e3,\n MICROSECOND: 1e6,\n NANOSECOND: 1e9\n};\n\nexport class Time extends DataType {\n readonly unit: number;\n readonly bitWidth: number;\n\n constructor(unit, bitWidth) {\n super();\n this.unit = unit;\n this.bitWidth = bitWidth;\n }\n get typeId(): Type {\n return Type.Time;\n }\n toString(): string {\n return `Time${this.bitWidth}<${TimeUnit[this.unit]}>`;\n }\n get [Symbol.toStringTag](): string {\n return 'Time';\n }\n // get ArrayType() {\n // return Int32Array;\n // }\n}\n\nexport class TimeSecond extends Time {\n constructor() {\n super(TimeUnit.SECOND, 32);\n }\n}\nexport class TimeMillisecond extends Time {\n constructor() {\n super(TimeUnit.MILLISECOND, 32);\n }\n}\n// export class TimeMicrosecond extends Time { constructor() { super(TimeUnit.MICROSECOND, 64); } }\n// export class TimeNanosecond extends Time { constructor() { super(TimeUnit.NANOSECOND, 64); } }\n\nexport class Timestamp extends DataType {\n readonly unit: any;\n readonly timezone: any;\n\n constructor(unit: any, timezone = null) {\n super();\n this.unit = unit;\n this.timezone = timezone;\n }\n get typeId(): Type {\n return Type.Timestamp;\n }\n // get ArrayType() {\n // return Int32Array;\n // }\n get [Symbol.toStringTag](): string {\n return 'Timestamp';\n }\n toString(): string {\n return `Timestamp<${TimeUnit[this.unit]}${this.timezone ? `, ${this.timezone}` : ''}>`;\n }\n}\n\nexport class TimestampSecond extends Timestamp {\n constructor(timezone = null) {\n super(TimeUnit.SECOND, timezone);\n }\n}\nexport class TimestampMillisecond extends Timestamp {\n constructor(timezone = null) {\n super(TimeUnit.MILLISECOND, timezone);\n }\n}\nexport class TimestampMicrosecond extends Timestamp {\n constructor(timezone = null) {\n super(TimeUnit.MICROSECOND, timezone);\n }\n}\nexport class TimestampNanosecond extends Timestamp {\n constructor(timezone = null) {\n super(TimeUnit.NANOSECOND, timezone);\n }\n}\n\nconst IntervalUnit = {\n DAY_TIME: 0,\n YEAR_MONTH: 1\n};\n\nexport class Interval extends DataType {\n readonly unit: number;\n constructor(unit: number) {\n super();\n this.unit = unit;\n }\n get typeId(): Type {\n return Type.Interval;\n }\n // get ArrayType() {\n // return Int32Array;\n // }\n get [Symbol.toStringTag](): string {\n return 'Interval';\n }\n toString(): string {\n return `Interval<${IntervalUnit[this.unit]}>`;\n }\n}\n\nexport class IntervalDayTime extends Interval {\n constructor() {\n super(IntervalUnit.DAY_TIME);\n }\n}\nexport class IntervalYearMonth extends Interval {\n constructor() {\n super(IntervalUnit.YEAR_MONTH);\n }\n}\n\nexport class FixedSizeList extends DataType {\n readonly listSize: number;\n readonly children: Field[];\n\n constructor(listSize: number, child: Field) {\n super();\n this.listSize = listSize;\n this.children = [child];\n }\n get typeId(): Type {\n return Type.FixedSizeList;\n }\n get valueType() {\n return this.children[0].type;\n }\n get valueField() {\n return this.children[0];\n }\n // get ArrayType() {\n // return this.valueType.ArrayType;\n // }\n get [Symbol.toStringTag](): string {\n return 'FixedSizeList';\n }\n toString(): string {\n return `FixedSizeList[${this.listSize}]<${this.valueType}>`;\n }\n}\n\nexport class Struct extends DataType {\n public readonly children: Field[];\n\n constructor(children: Field[]) {\n super();\n this.children = children;\n }\n\n public get typeId() {\n return Type.Struct;\n }\n public toString() {\n return `Struct<{${this.children.map((f) => `${f.name}:${f.type}`).join(', ')}}>`;\n }\n get [Symbol.toStringTag](): string {\n return 'Struct';\n }\n}\n","import {MeshAttribute, MeshAttributes} from './mesh-types';\nimport {Schema, Field, FixedSizeList} from '../../lib/schema';\nimport {getArrowTypeFromTypedArray} from '../../lib/arrow/arrow-like-type-utils';\n\n/**\n * Create a schema for mesh attributes data\n * @param attributes\n * @param metadata\n * @returns\n */\nexport function deduceMeshSchema(\n attributes: MeshAttributes,\n metadata?: Map<string, string>\n): Schema {\n const fields = deduceMeshFields(attributes);\n return new Schema(fields, metadata);\n}\n\n/**\n * Create arrow-like schema field for mesh attribute\n * @param attributeName\n * @param attribute\n * @param optionalMetadata\n * @returns\n */\nexport function deduceMeshField(\n attributeName: string,\n attribute: MeshAttribute,\n optionalMetadata?: Map<string, string>\n): Field {\n const type = getArrowTypeFromTypedArray(attribute.value);\n const metadata = optionalMetadata ? optionalMetadata : makeMeshAttributeMetadata(attribute);\n const field = new Field(\n attributeName,\n new FixedSizeList(attribute.size, new Field('value', type)),\n false,\n metadata\n );\n return field;\n}\n\n/**\n * Create fields array for mesh attributes\n * @param attributes\n * @returns\n */\nfunction deduceMeshFields(attributes: MeshAttributes): Field[] {\n const fields: Field[] = [];\n for (const attributeName in attributes) {\n const attribute: MeshAttribute = attributes[attributeName];\n fields.push(deduceMeshField(attributeName, attribute));\n }\n return fields;\n}\n\n/**\n * Make metadata by mesh attribute properties\n * @param attribute\n * @returns\n */\nexport function makeMeshAttributeMetadata(attribute: MeshAttribute): Map<string, string> {\n const result = new Map();\n if ('byteOffset' in attribute) {\n result.set('byteOffset', attribute.byteOffset!.toString(10));\n }\n if ('byteStride' in attribute) {\n result.set('byteStride', attribute.byteStride!.toString(10));\n }\n if ('normalized' in attribute) {\n result.set('normalized', attribute.normalized!.toString());\n }\n return result;\n}\n","import type {TypedArray} from '../../types';\nimport {DataType, Float32, Float64, Int16, Int32, Int8, Uint16, Uint32, Uint8} from '../schema';\n\nexport function getArrowTypeFromTypedArray(array: TypedArray): DataType {\n switch (array.constructor) {\n case Int8Array:\n return new Int8();\n case Uint8Array:\n return new Uint8();\n case Int16Array:\n return new Int16();\n case Uint16Array:\n return new Uint16();\n case Int32Array:\n return new Int32();\n case Uint32Array:\n return new Uint32();\n case Float32Array:\n return new Float32();\n case Float64Array:\n return new Float64();\n default:\n throw new Error('array type not supported');\n }\n}\n","import {deduceMeshField, MeshAttribute} from '@loaders.gl/schema';\nimport {Schema, Field} from '@loaders.gl/schema';\nimport type {DracoAttribute, DracoLoaderData, DracoMetadataEntry} from '../draco-types';\n\n/** Extract an arrow-like schema from a Draco mesh */\nexport function getDracoSchema(\n attributes: {[attributeName: string]: MeshAttribute},\n loaderData: DracoLoaderData,\n indices?: MeshAttribute\n): Schema {\n const metadataMap = makeMetadata(loaderData.metadata);\n const fields: Field[] = [];\n const namedLoaderDataAttributes = transformAttributesLoaderData(loaderData.attributes);\n for (const attributeName in attributes) {\n const attribute = attributes[attributeName];\n const field = getArrowFieldFromAttribute(\n attributeName,\n attribute,\n namedLoaderDataAttributes[attributeName]\n );\n fields.push(field);\n }\n if (indices) {\n const indicesField = getArrowFieldFromAttribute('indices', indices);\n fields.push(indicesField);\n }\n return new Schema(fields, metadataMap);\n}\n\nfunction transformAttributesLoaderData(loaderData: {[key: number]: DracoAttribute}): {\n [attributeName: string]: DracoAttribute;\n} {\n const result: {[attributeName: string]: DracoAttribute} = {};\n for (const key in loaderData) {\n const dracoAttribute = loaderData[key];\n result[dracoAttribute.name || 'undefined'] = dracoAttribute;\n }\n return result;\n}\n\nfunction getArrowFieldFromAttribute(\n attributeName: string,\n attribute: MeshAttribute,\n loaderData?: DracoAttribute\n): Field {\n const metadataMap = loaderData ? makeMetadata(loaderData.metadata) : undefined;\n const field = deduceMeshField(attributeName, attribute, metadataMap);\n return field;\n}\n\nfunction makeMetadata(metadata: {[key: string]: DracoMetadataEntry}): Map<string, string> {\n const metadataMap = new Map();\n for (const key in metadata) {\n metadataMap.set(`${key}.string`, JSON.stringify(metadata[key]));\n }\n return metadataMap;\n}\n","/* eslint-disable camelcase */\n\nimport type {TypedArray, MeshAttribute, MeshGeometry} from '@loaders.gl/schema';\n\n// Draco types (input)\nimport type {\n Draco3D,\n Decoder,\n Mesh,\n PointCloud,\n PointAttribute,\n Metadata,\n MetadataQuerier,\n DracoInt32Array,\n draco_DataType\n} from '../draco3d/draco3d-types';\n\n// Parsed data types (output)\nimport type {\n DracoMesh,\n DracoLoaderData,\n DracoAttribute,\n DracoMetadataEntry,\n DracoQuantizationTransform,\n DracoOctahedronTransform\n} from './draco-types';\n\nimport {getMeshBoundingBox} from '@loaders.gl/schema';\nimport {getDracoSchema} from './utils/get-draco-schema';\n\n/**\n * @param topology - How triangle indices should be generated (mesh only)\n * @param attributeNameEntry\n * @param extraAttributes\n * @param quantizedAttributes\n * @param octahedronAttributes\n */\nexport type DracoParseOptions = {\n topology?: 'triangle-list' | 'triangle-strip';\n attributeNameEntry?: string;\n extraAttributes?: {[uniqueId: string]: number};\n quantizedAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];\n octahedronAttributes?: ('POSITION' | 'NORMAL' | 'COLOR' | 'TEX_COORD' | 'GENERIC')[];\n};\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst GEOMETRY_TYPE = {\n TRIANGULAR_MESH: 0,\n POINT_CLOUD: 1\n};\n\n// Native Draco attribute names to GLTF attribute names.\nconst DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP = {\n POSITION: 'POSITION',\n NORMAL: 'NORMAL',\n COLOR: 'COLOR_0',\n TEX_COORD: 'TEXCOORD_0'\n};\n\nconst DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP = {\n 1: Int8Array,\n 2: Uint8Array,\n 3: Int16Array,\n 4: Uint16Array,\n 5: Int32Array,\n 6: Uint32Array,\n 9: Float32Array\n};\n\nconst INDEX_ITEM_SIZE = 4;\n\nexport default class DracoParser {\n draco: Draco3D;\n decoder: Decoder;\n metadataQuerier: MetadataQuerier;\n\n // draco - the draco decoder, either import `draco3d` or load dynamically\n constructor(draco: Draco3D) {\n this.draco = draco;\n this.decoder = new this.draco.Decoder();\n this.metadataQuerier = new this.draco.MetadataQuerier();\n }\n\n /**\n * Destroy draco resources\n */\n destroy(): void {\n this.draco.destroy(this.decoder);\n this.draco.destroy(this.metadataQuerier);\n }\n\n /**\n * NOTE: caller must call `destroyGeometry` on the return value after using it\n * @param arrayBuffer\n * @param options\n */\n parseSync(arrayBuffer: ArrayBuffer, options: DracoParseOptions = {}): DracoMesh {\n const buffer = new this.draco.DecoderBuffer();\n buffer.Init(new Int8Array(arrayBuffer), arrayBuffer.byteLength);\n\n this._disableAttributeTransforms(options);\n\n const geometry_type = this.decoder.GetEncodedGeometryType(buffer);\n const dracoGeometry =\n geometry_type === this.draco.TRIANGULAR_MESH\n ? new this.draco.Mesh()\n : new this.draco.PointCloud();\n\n try {\n let dracoStatus;\n switch (geometry_type) {\n case this.draco.TRIANGULAR_MESH:\n dracoStatus = this.decoder.DecodeBufferToMesh(buffer, dracoGeometry as Mesh);\n break;\n\n case this.draco.POINT_CLOUD:\n dracoStatus = this.decoder.DecodeBufferToPointCloud(buffer, dracoGeometry);\n break;\n\n default:\n throw new Error('DRACO: Unknown geometry type.');\n }\n\n if (!dracoStatus.ok() || !dracoGeometry.ptr) {\n const message = `DRACO decompression failed: ${dracoStatus.error_msg()}`;\n // console.error(message);\n throw new Error(message);\n }\n\n const loaderData = this._getDracoLoaderData(dracoGeometry, geometry_type, options);\n\n const geometry = this._getMeshData(dracoGeometry, loaderData, options);\n\n const boundingBox = getMeshBoundingBox(geometry.attributes);\n\n const schema = getDracoSchema(geometry.attributes, loaderData, geometry.indices);\n\n const data: DracoMesh = {\n loader: 'draco',\n loaderData,\n header: {\n vertexCount: dracoGeometry.num_points(),\n boundingBox\n },\n ...geometry,\n schema\n };\n return data;\n } finally {\n this.draco.destroy(buffer);\n if (dracoGeometry) {\n this.draco.destroy(dracoGeometry);\n }\n }\n }\n\n // Draco specific \"loader data\"\n\n /**\n * Extract\n * @param dracoGeometry\n * @param geometry_type\n * @param options\n * @returns\n */\n _getDracoLoaderData(\n dracoGeometry: Mesh | PointCloud,\n geometry_type,\n options: DracoParseOptions\n ): DracoLoaderData {\n const metadata = this._getTopLevelMetadata(dracoGeometry);\n const attributes = this._getDracoAttributes(dracoGeometry, options);\n\n return {\n geometry_type,\n num_attributes: dracoGeometry.num_attributes(),\n num_points: dracoGeometry.num_points(),\n num_faces: dracoGeometry instanceof this.draco.Mesh ? dracoGeometry.num_faces() : 0,\n metadata,\n attributes\n };\n }\n\n /**\n * Extract all draco provided information and metadata for each attribute\n * @param dracoGeometry\n * @param options\n * @returns\n */\n _getDracoAttributes(\n dracoGeometry: Mesh | PointCloud,\n options: DracoParseOptions\n ): {[unique_id: number]: DracoAttribute} {\n const dracoAttributes: {[unique_id: number]: DracoAttribute} = {};\n\n for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {\n // Note: Draco docs do not seem clear on `GetAttribute` ids just being a zero-based index,\n // but it does seems to work this way\n const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);\n\n const metadata = this._getAttributeMetadata(dracoGeometry, attributeId);\n\n dracoAttributes[dracoAttribute.unique_id()] = {\n unique_id: dracoAttribute.unique_id(),\n attribute_type: dracoAttribute.attribute_type(),\n data_type: dracoAttribute.data_type(),\n num_components: dracoAttribute.num_components(),\n\n byte_offset: dracoAttribute.byte_offset(),\n byte_stride: dracoAttribute.byte_stride(),\n normalized: dracoAttribute.normalized(),\n attribute_index: attributeId,\n\n metadata\n };\n\n // Add transformation parameters for any attributes app wants untransformed\n const quantization = this._getQuantizationTransform(dracoAttribute, options);\n if (quantization) {\n dracoAttributes[dracoAttribute.unique_id()].quantization_transform = quantization;\n }\n\n const octahedron = this._getOctahedronTransform(dracoAttribute, options);\n if (octahedron) {\n dracoAttributes[dracoAttribute.unique_id()].octahedron_transform = octahedron;\n }\n }\n\n return dracoAttributes;\n }\n\n /**\n * Get standard loaders.gl mesh category data\n * Extracts the geometry from draco\n * @param dracoGeometry\n * @param options\n */\n _getMeshData(\n dracoGeometry: Mesh | PointCloud,\n loaderData: DracoLoaderData,\n options: DracoParseOptions\n ): MeshGeometry {\n const attributes = this._getMeshAttributes(loaderData, dracoGeometry, options);\n\n const positionAttribute = attributes.POSITION;\n if (!positionAttribute) {\n throw new Error('DRACO: No position attribute found.');\n }\n\n // For meshes, we need indices to define the faces.\n if (dracoGeometry instanceof this.draco.Mesh) {\n switch (options.topology) {\n case 'triangle-strip':\n return {\n topology: 'triangle-strip',\n mode: 4, // GL.TRIANGLES\n attributes,\n indices: {\n value: this._getTriangleStripIndices(dracoGeometry),\n size: 1\n }\n };\n case 'triangle-list':\n default:\n return {\n topology: 'triangle-list',\n mode: 5, // GL.TRIANGLE_STRIP\n attributes,\n indices: {\n value: this._getTriangleListIndices(dracoGeometry),\n size: 1\n }\n };\n }\n }\n\n // PointCloud - must come last as Mesh inherits from PointCloud\n return {\n topology: 'point-list',\n mode: 0, // GL.POINTS\n attributes\n };\n }\n\n _getMeshAttributes(\n loaderData: DracoLoaderData,\n dracoGeometry: Mesh | PointCloud,\n options: DracoParseOptions\n ): {[attributeName: string]: MeshAttribute} {\n const attributes: {[key: string]: MeshAttribute} = {};\n\n for (const loaderAttribute of Object.values(loaderData.attributes)) {\n const attributeName = this._deduceAttributeName(loaderAttribute, options);\n loaderAttribute.name = attributeName;\n const {value, size} = this._getAttributeValues(dracoGeometry, loaderAttribute);\n attributes[attributeName] = {\n value,\n size,\n byteOffset: loaderAttribute.byte_offset,\n byteStride: loaderAttribute.byte_stride,\n normalized: loaderAttribute.normalized\n };\n }\n\n return attributes;\n }\n\n // MESH INDICES EXTRACTION\n\n /**\n * For meshes, we need indices to define the faces.\n * @param dracoGeometry\n */\n _getTriangleListIndices(dracoGeometry: Mesh) {\n // Example on how to retrieve mesh and attributes.\n const numFaces = dracoGeometry.num_faces();\n const numIndices = numFaces * 3;\n const byteLength = numIndices * INDEX_ITEM_SIZE;\n\n const ptr = this.draco._malloc(byteLength);\n try {\n this.decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);\n return new Uint32Array(this.draco.HEAPF32.buffer, ptr, numIndices).slice();\n } finally {\n this.draco._free(ptr);\n }\n }\n\n /**\n * For meshes, we need indices to define the faces.\n * @param dracoGeometry\n */\n _getTriangleStripIndices(dracoGeometry: Mesh) {\n const dracoArray = new this.draco.DracoInt32Array();\n try {\n /* const numStrips = */ this.decoder.GetTriangleStripsFromMesh(dracoGeometry, dracoArray);\n return getUint32Array(dracoArray);\n } finally {\n this.draco.destroy(dracoArray);\n }\n }\n\n /**\n *\n * @param dracoGeometry\n * @param dracoAttribute\n * @param attributeName\n */\n _getAttributeValues(\n dracoGeometry: Mesh | PointCloud,\n attribute: DracoAttribute\n ): {value: TypedArray; size: number} {\n const TypedArrayCtor = DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];\n const numComponents = attribute.num_components;\n const numPoints = dracoGeometry.num_points();\n const numValues = numPoints * numComponents;\n\n const byteLength = numValues * TypedArrayCtor.BYTES_PER_ELEMENT;\n const dataType = getDracoDataType(this.draco, TypedArrayCtor);\n\n let value: TypedArray;\n\n const ptr = this.draco._malloc(byteLength);\n try {\n const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attribute.attribute_index);\n this.decoder.GetAttributeDataArrayForAllPoints(\n dracoGeometry,\n dracoAttribute,\n dataType,\n byteLength,\n ptr\n );\n value = new TypedArrayCtor(this.draco.HEAPF32.buffer, ptr, numValues).slice();\n } finally {\n this.draco._free(ptr);\n }\n\n return {value, size: numComponents};\n }\n\n // Attribute names\n\n /** \n * DRACO does not store attribute names - We need to deduce an attribute name\n * for each attribute\n _getAttributeNames(\n dracoGeometry: Mesh | PointCloud,\n options: DracoParseOptions\n ): {[unique_id: number]: string} {\n const attributeNames: {[unique_id: number]: string} = {};\n for (let attributeId = 0; attributeId < dracoGeometry.num_attributes(); attributeId++) {\n const dracoAttribute = this.decoder.GetAttribute(dracoGeometry, attributeId);\n const attributeName = this._deduceAttributeName(dracoAttribute, options);\n attributeNames[attributeName] = attributeName;\n }\n return attributeNames;\n }\n */\n\n /**\n * Deduce an attribute name.\n * @note DRACO does not save attribute names, just general type (POSITION, COLOR)\n * to help optimize compression. We generate GLTF compatible names for the Draco-recognized\n * types\n * @param attributeData\n */\n _deduceAttributeName(attribute: DracoAttribute, options: DracoParseOptions): string {\n // Deduce name based on application provided map\n const uniqueId = attribute.unique_id;\n for (const [attributeName, attributeUniqueId] of Object.entries(\n options.extraAttributes || {}\n )) {\n if (attributeUniqueId === uniqueId) {\n return attributeName;\n }\n }\n\n // Deduce name based on attribute type\n const thisAttributeType = attribute.attribute_type;\n for (const dracoAttributeConstant in DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP) {\n const attributeType = this.draco[dracoAttributeConstant];\n if (attributeType === thisAttributeType) {\n // TODO - Return unique names if there multiple attributes per type\n // (e.g. multiple TEX_COORDS or COLORS)\n return DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP[dracoAttributeConstant];\n }\n }\n\n // Look up in metadata\n // TODO - shouldn't this have priority?\n const entryName = options.attributeNameEntry || 'name';\n if (attribute.metadata[entryName]) {\n return attribute.metadata[entryName].string;\n }\n\n // Attribute of \"GENERIC\" type, we need to assign some name\n return `CUSTOM_ATTRIBUTE_${uniqueId}`;\n }\n\n // METADATA EXTRACTION\n\n /** Get top level metadata */\n _getTopLevelMetadata(dracoGeometry: Mesh | PointCloud) {\n const dracoMetadata = this.decoder.GetMetadata(dracoGeometry);\n return this._getDracoMetadata(dracoMetadata);\n }\n\n /** Get per attribute metadata */\n _getAttributeMetadata(dracoGeometry: Mesh | PointCloud, attributeId: number) {\n const dracoMetadata = this.decoder.GetAttributeMetadata(dracoGeometry, attributeId);\n return this._getDracoMetadata(dracoMetadata);\n }\n\n /**\n * Extract metadata field values\n * @param dracoMetadata\n * @returns\n */\n _getDracoMetadata(dracoMetadata: Metadata): {[entry: string]: DracoMetadataEntry} {\n // The not so wonderful world of undocumented Draco APIs :(\n if (!dracoMetadata || !dracoMetadata.ptr) {\n return {};\n }\n const result = {};\n const numEntries = this.metadataQuerier.NumEntries(dracoMetadata);\n for (let entryIndex = 0; entryIndex < numEntries; entryIndex++) {\n const entryName = this.metadataQuerier.GetEntryName(dracoMetadata, entryIndex);\n result[entryName] = this._getDracoMetadataField(dracoMetadata, entryName);\n }\n return result;\n }\n\n /**\n * Extracts possible values for one metadata entry by name\n * @param dracoMetadata\n * @param entryName\n */\n _getDracoMetadataField(dracoMetadata: Metadata, entryName: string): DracoMetadataEntry {\n const dracoArray = new this.draco.DracoInt32Array();\n try {\n // Draco metadata fields can hold int32 arrays\n this.metadataQuerier.GetIntEntryArray(dracoMetadata, entryName, dracoArray);\n const intArray = getInt32Array(dracoArray);\n return {\n int: this.metadataQuerier.GetIntEntry(dracoMetadata, entryName),\n string: this.metadataQuerier.GetStringEntry(dracoMetadata, entryName),\n double: this.metadataQuerier.GetDoubleEntry(dracoMetadata, entryName),\n intArray\n };\n } finally {\n this.draco.destroy(dracoArray);\n }\n }\n\n // QUANTIZED ATTRIBUTE SUPPORT (NO DECOMPRESSION)\n\n /** Skip transforms for specific attribute types */\n _disableAttributeTransforms(options: DracoParseOptions) {\n const {quantizedAttributes = [], octahedronAttributes = []} = options;\n const skipAttributes = [...quantizedAttributes, ...octahedronAttributes];\n for (const dracoAttributeName of skipAttributes) {\n this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);\n }\n }\n\n /**\n * Extract (and apply?) Position Transform\n * @todo not used\n */\n _getQuantizationTransform(\n dracoAttribute: PointAttribute,\n options: DracoParseOptions\n ): DracoQuantizationTransform | null {\n const {quantizedAttributes = []} = options;\n const attribute_type = dracoAttribute.attribute_type();\n const skip = quantizedAttributes.map((type) => this.decoder[type]).includes(attribute_type);\n if (skip) {\n const transform = new this.draco.AttributeQuantizationTransform();\n try {\n if (transform.InitFromAttribute(dracoAttribute)) {\n return {\n quantization_bits: transform.quantization_bits(),\n range: transform.range(),\n min_values: new Float32Array([1, 2, 3]).map((i) => transform.min_value(i))\n };\n }\n } finally {\n this.draco.destroy(transform);\n }\n }\n return null;\n }\n\n _getOctahedronTransform(\n dracoAttribute: PointAttribute,\n options: DracoParseOptions\n ): DracoOctahedronTransform | null {\n const {octahedronAttributes = []} = options;\n const attribute_type = dracoAttribute.attribute_type();\n const octahedron = octahedronAttributes\n .map((type) => this.decoder[type])\n .includes(attribute_type);\n if (octahedron) {\n const transform = new this.draco.AttributeQuantizationTransform();\n try {\n if (transform.InitFromAttribute(dracoAttribute)) {\n return {\n quantization_bits: transform.quantization_bits()\n };\n }\n } finally {\n this.draco.destroy(transform);\n }\n }\n return null;\n }\n\n // HELPERS\n}\n\n/**\n * Get draco specific data type by TypedArray constructor type\n * @param attributeType\n * @returns draco specific data type\n */\nfunction getDracoDataType(draco: Draco3D, attributeType: any): draco_DataType {\n switch (attributeType) {\n case Float32Array:\n return draco.DT_FLOAT32;\n case Int8Array:\n return draco.DT_INT8;\n case Int16Array:\n return draco.DT_INT16;\n case Int32Array:\n return draco.DT_INT32;\n case Uint8Array:\n return draco.DT_UINT8;\n case Uint16Array:\n return draco.DT_UINT16;\n case Uint32Array:\n return draco.DT_UINT32;\n default:\n return draco.DT_INVALID;\n }\n}\n\n/**\n * Copy a Draco int32 array into a JS typed array\n */\nfunction getInt32Array(dracoArray: DracoInt32Array): Int32Array {\n const numValues = dracoArray.size();\n const intArray = new Int32Array(numValues);\n for (let i = 0; i < numValues; i++) {\n intArray[i] = dracoArray.GetValue(i);\n }\n return intArray;\n}\n\n/**\n * Copy a Draco int32 array into a JS typed array\n */\nfunction getUint32Array(dracoArray: DracoInt32Array): Int32Array {\n const numValues = dracoArray.size();\n const intArray = new Int32Array(numValues);\n for (let i = 0; i < numValues; i++) {\n intArray[i] = dracoArray.GetValue(i);\n }\n return intArray;\n}\n","/* global importScripts */\nimport {global, isBrowser, isWorker} from '../env-utils/globals';\nimport * as node from '../node/require-utils.node';\nimport {assert} from '../env-utils/assert';\nimport {VERSION as __VERSION__} from '../env-utils/version';\n\n// TODO - unpkg.com doesn't seem to have a `latest` specifier for alpha releases...\nconst LATEST = 'beta';\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : LATEST;\n\nconst loadLibraryPromises = {}; // promises\n\n/**\n * Dynamically loads a library (\"module\")\n *\n * - wasm library: Array buffer is returned\n * - js library: Parse JS is returned\n *\n * Method depends on environment\n * - browser - script element is created and installed on document\n * - worker - eval is called on global context\n * - node - file is required\n *\n * @param libraryUrl\n * @param moduleName\n * @param options\n */\nexport async function loadLibrary(\n libraryUrl: string,\n moduleName: string | null = null,\n options: object = {}\n): Promise<any> {\n if (moduleName) {\n libraryUrl = getLibraryUrl(libraryUrl, moduleName, options);\n }\n\n // Ensure libraries are only loaded once\n loadLibraryPromises[libraryUrl] =\n loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);\n return await loadLibraryPromises[libraryUrl];\n}\n\n// TODO - sort out how to resolve paths for main/worker and dev/prod\nexport function getLibraryUrl(library, moduleName?: string, options?): string {\n // Check if already a URL\n if (library.startsWith('http')) {\n return library;\n }\n\n // Allow application to import and supply libraries through `options.modules`\n const modules = options.modules || {};\n if (modules[library]) {\n return modules[library];\n }\n\n // Load from local files, not from CDN scripts in Node.js\n // TODO - needs to locate the modules directory when installed!\n if (!isBrowser) {\n return `modules/${moduleName}/dist/libs/${library}`;\n }\n\n // In browser, load from external scripts\n if (options.CDN) {\n assert(options.CDN.startsWith('http'));\n return `${options.CDN}/${moduleName}@${VERSION}/dist/libs/${library}`;\n }\n\n // TODO - loading inside workers requires paths relative to worker script location...\n if (isWorker) {\n return `../src/libs/${library}`;\n }\n\n return `modules/${moduleName}/src/libs/${library}`;\n}\n\nasync function loadLibraryFromFile(libraryUrl) {\n if (libraryUrl.endsWith('wasm')) {\n const response = await fetch(libraryUrl);\n return await response.arrayBuffer();\n }\n\n if (!isBrowser) {\n return node.requireFromFile && (await node.requireFromFile(libraryUrl));\n }\n if (isWorker) {\n return importScripts(libraryUrl);\n }\n // TODO - fix - should be more secure than string parsing since observes CORS\n // if (isBrowser) {\n // return await loadScriptFromFile(libraryUrl);\n // }\n\n const response = await fetch(libraryUrl);\n const scriptSource = await response.text();\n return loadLibraryFromString(scriptSource, libraryUrl);\n}\n\n/*\nasync function loadScriptFromFile(libraryUrl) {\n const script = document.createElement('script');\n script.src = libraryUrl;\n return await new Promise((resolve, reject) => {\n script.onload = data => {\n resolve(data);\n };\n script.onerror = reject;\n });\n}\n*/\n\n// TODO - Needs security audit...\n// - Raw eval call\n// - Potentially bypasses CORS\n// Upside is that this separates fetching and parsing\n// we could create a`LibraryLoader` or`ModuleLoader`\nfunction loadLibraryFromString(scriptSource, id) {\n if (!isBrowser) {\n return node.requireFromString && node.requireFromString(scriptSource, id);\n }\n\n if (isWorker) {\n // Use lvalue trick to make eval run in global scope\n eval.call(global, scriptSource); // eslint-disable-line no-eval\n // https://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript\n // http://perfectionkills.com/global-eval-what-are-the-options/\n return null;\n }\n\n const script = document.createElement('script');\n script.id = id;\n // most browsers like a separate text node but some throw an error. The second method covers those.\n try {\n script.appendChild(document.createTextNode(scriptSource));\n } catch (e) {\n script.text = scriptSource;\n }\n document.body.appendChild(script);\n return null;\n}\n\n// TODO - technique for module injection into worker, from THREE.DracoLoader...\n/*\nfunction combineWorkerWithLibrary(worker, jsContent) {\n var fn = wWorker.toString();\n var body = [\n '// injected',\n jsContent,\n '',\n '// worker',\n fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))\n ].join('\\n');\n this.workerSourceURL = URL.createObjectURL(new Blob([body]));\n}\n*/\n","// Dynamic DRACO module loading inspired by THREE.DRACOLoader\n// https://github.com/mrdoob/three.js/blob/398c4f39ebdb8b23eefd4a7a5ec49ec0c96c7462/examples/jsm/loaders/DRACOLoader.js\n// by Don McCurdy / https://www.donmccurdy.com / MIT license\n\nimport {loadLibrary} from '@loaders.gl/worker-utils';\n\nconst DRACO_VERSION = '1.4.1';\nconst DRACO_JS_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_VERSION}/draco_decoder.js`;\nconst DRACO_WASM_WRAPPER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_VERSION}/draco_wasm_wrapper.js`;\nconst DRACO_WASM_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_VERSION}/draco_decoder.wasm`;\n\nconst DRACO_ENCODER_URL = `https://raw.githubusercontent.com/google/draco/${DRACO_VERSION}/javascript/draco_encoder.js`;\n\nlet loadDecoderPromise;\nlet loadEncoderPromise;\n\nexport async function loadDracoDecoderModule(options) {\n const modules = options.modules || {};\n\n // Check if a bundled draco3d library has been supplied by application\n if (modules.draco3d) {\n loadDecoderPromise =\n loadDecoderPromise ||\n modules.draco3d.createDecoderModule({}).then((draco) => {\n return {draco};\n });\n } else {\n // If not, dynamically load the WASM script from our CDN\n loadDecoderPromise = loadDecoderPromise || loadDracoDecoder(options);\n }\n return await loadDecoderPromise;\n}\n\nexport async function loadDracoEncoderModule(options) {\n const modules = options.modules || {};\n\n // Check if a bundled draco3d library has been supplied by application\n if (modules.draco3d) {\n loadEncoderPromise =\n loadEncoderPromise ||\n modules.draco3d.createEncoderModule({}).then((draco) => {\n return {draco};\n });\n } else {\n // If not, dynamically load the WASM script from our CDN\n loadEncoderPromise = loadEncoderPromise || loadDracoEncoder(options);\n }\n return await loadEncoderPromise;\n}\n\n// DRACO DECODER LOADING\n\nasync function loadDracoDecoder(options) {\n let DracoDecoderModule;\n let wasmBinary;\n switch (options.draco && options.draco.decoderType) {\n case 'js':\n DracoDecoderModule = await loadLibrary(DRACO_JS_DECODER_URL, 'draco', options);\n break;\n\n case 'wasm':\n default:\n [DracoDecoderModule, wasmBinary] = await Promise.all([\n await loadLibrary(DRACO_WASM_WRAPPER_URL, 'draco', options),\n await loadLibrary(DRACO_WASM_DECODER_URL, 'draco', options)\n ]);\n }\n // Depends on how import happened...\n // @ts-ignore\n DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;\n return await initializeDracoDecoder(DracoDecoderModule, wasmBinary);\n}\n\nfunction initializeDracoDecoder(DracoDecoderModule, wasmBinary) {\n const options: {wasmBinary?: any} = {};\n if (wasmBinary) {\n options.wasmBinary = wasmBinary;\n }\n\n return new Promise((resolve) => {\n DracoDecoderModule({\n ...options,\n onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.\n });\n });\n}\n\n// ENCODER\n\nasync function loadDracoEncoder(options) {\n let DracoEncoderModule = await loadLibrary(DRACO_ENCODER_URL, 'draco', options);\n // @ts-ignore\n DracoEncoderModule = DracoEncoderModule || globalThis.DracoEncoderModule;\n\n return new Promise((resolve) => {\n DracoEncoderModule({\n onModuleLoaded: (draco) => resolve({draco}) // Module is Promise-like. Wrap in object to avoid loop.\n });\n });\n}\n","import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {DracoMesh, DracoLoaderData} from './lib/draco-types';\nimport type {DracoLoaderOptions} from './draco-loader';\nimport {DracoLoader as DracoWorkerLoader} from './draco-loader';\nimport DracoParser from './lib/draco-parser';\nimport {loadDracoDecoderModule} from './lib/draco-module-loader';\n\n// Draco data types\n\nexport type {DracoMesh, DracoLoaderData};\n\n// Draco Writer\n\nexport type {DracoWriterOptions} from './draco-writer';\nexport {DracoWriter} from './draco-writer';\n\n// Draco Loader\n\nexport type {DracoLoaderOptions};\nexport {DracoWorkerLoader};\n\n/**\n * Loader for Draco3D compressed geometries\n */\nexport const DracoLoader = {\n ...DracoWorkerLoader,\n parse\n};\n\nasync function parse(arrayBuffer: ArrayBuffer, options?: DracoLoaderOptions): Promise<DracoMesh> {\n const {draco} = await loadDracoDecoderModule(options);\n const dracoParser = new DracoParser(draco);\n try {\n return dracoParser.parseSync(arrayBuffer, options?.draco);\n } finally {\n dracoParser.destroy();\n }\n}\n\n// TYPE TESTS - TODO find a better way than exporting junk\nexport const _TypecheckDracoLoader: LoaderWithParser = DracoLoader;\n","const t=new Uint8Array([0]),e=[171,75,84,88,32,50,48,187,13,10,26,10];var n,i,s,a,r,o,l,f;!function(t){t[t.NONE=0]=\"NONE\",t[t.BASISLZ=1]=\"BASISLZ\",t[t.ZSTD=2]=\"ZSTD\",t[t.ZLIB=3]=\"ZLIB\"}(n||(n={})),function(t){t[t.BASICFORMAT=0]=\"BASICFORMAT\"}(i||(i={})),function(t){t[t.UNSPECIFIED=0]=\"UNSPECIFIED\",t[t.ETC1S=163]=\"ETC1S\",t[t.UASTC=166]=\"UASTC\"}(s||(s={})),function(t){t[t.UNSPECIFIED=0]=\"UNSPECIFIED\",t[t.SRGB=1]=\"SRGB\"}(a||(a={})),function(t){t[t.UNSPECIFIED=0]=\"UNSPECIFIED\",t[t.LINEAR=1]=\"LINEAR\",t[t.SRGB=2]=\"SRGB\",t[t.ITU=3]=\"ITU\",t[t.NTSC=4]=\"NTSC\",t[t.SLOG=5]=\"SLOG\",t[t.SLOG2=6]=\"SLOG2\"}(r||(r={})),function(t){t[t.ALPHA_STRAIGHT=0]=\"ALPHA_STRAIGHT\",t[t.ALPHA_PREMULTIPLIED=1]=\"ALPHA_PREMULTIPLIED\"}(o||(o={})),function(t){t[t.RGB=0]=\"RGB\",t[t.RRR=3]=\"RRR\",t[t.GGG=4]=\"GGG\",t[t.AAA=15]=\"AAA\"}(l||(l={})),function(t){t[t.RGB=0]=\"RGB\",t[t.RGBA=3]=\"RGBA\",t[t.RRR=4]=\"RRR\",t[t.RRRG=5]=\"RRRG\"}(f||(f={}));class U{constructor(){this.vkFormat=0,this.typeSize=1,this.pixelWidth=0,this.pixelHeight=0,this.pixelDepth=0,this.layerCount=0,this.faceCount=1,this.supercompressionScheme=n.NONE,this.levels=[],this.dataFormatDescriptor=[{vendorId:0,descriptorType:i.BASICFORMAT,versionNumber:2,descriptorBlockSize:40,colorModel:s.UNSPECIFIED,colorPrimaries:a.SRGB,transferFunction:a.SRGB,flags:o.ALPHA_STRAIGHT,texelBlockDimension:{x:4,y:4,z:1,w:1},bytesPlane:[],samples:[]}],this.keyValue={},this.globalData=null}}class c{constructor(t,e,n,i){this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_skip(t){return this._offset+=t,this}_scan(t,e=0){const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}function h(t){return\"undefined\"!=typeof TextEncoder?(new TextEncoder).encode(t):Buffer.from(t)}function _(t){return\"undefined\"!=typeof TextDecoder?(new TextDecoder).decode(t):Buffer.from(t).toString(\"utf8\")}function g(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function p(t){const n=new Uint8Array(t.buffer,t.byteOffset,e.length);if(n[0]!==e[0]||n[1]!==e[1]||n[2]!==e[2]||n[3]!==e[3]||n[4]!==e[4]||n[5]!==e[5]||n[6]!==e[6]||n[7]!==e[7]||n[8]!==e[8]||n[9]!==e[9]||n[10]!==e[10]||n[11]!==e[11])throw new Error(\"Missing KTX 2.0 identifier.\");const i=new U,s=17*Uint32Array.BYTES_PER_ELEMENT,a=new c(t,e.length,s,!0);i.vkFormat=a._nextUint32(),i.typeSize=a._nextUint32(),i.pixelWidth=a._nextUint32(),i.pixelHeight=a._nextUint32(),i.pixelDepth=a._nextUint32(),i.layerCount=a._nextUint32(),i.faceCount=a._nextUint32();const r=a._nextUint32();i.supercompressionScheme=a._nextUint32();const o=a._nextUint32(),l=a._nextUint32(),f=a._nextUint32(),h=a._nextUint32(),g=a._nextUint64(),p=a._nextUint64(),x=new c(t,e.length+s,3*r*8,!0);for(let e=0;e<r;e++)i.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+x._nextUint64(),x._nextUint64()),uncompressedByteLength:x._nextUint64()});const u=new c(t,o,l,!0),y={vendorId:u._skip(4)._nextUint16(),descriptorType:u._nextUint16(),versionNumber:u._nextUint16(),descriptorBlockSize:u._nextUint16(),colorModel:u._nextUint8(),colorPrimaries:u._nextUint8(),transferFunction:u._nextUint8(),flags:u._nextUint8(),texelBlockDimension:{x:u._nextUint8()+1,y:u._nextUint8()+1,z:u._nextUint8()+1,w:u._nextUint8()+1},bytesPlane:[u._nextUint8(),u._nextUint8(),u._nextUint8(),u._nextUint8(),u._nextUint8(),u._nextUint8(),u._nextUint8(),u._nextUint8()],samples:[]},D=(y.descriptorBlockSize/4-6)/4;for(let t=0;t<D;t++)y.samples[t]={bitOffset:u._nextUint16(),bitLength:u._nextUint8(),channelID:u._nextUint8(),samplePosition:[u._nextUint8(),u._nextUint8(),u._nextUint8(),u._nextUint8()],sampleLower:u._nextUint32(),sampleUpper:u._nextUint32()};i.dataFormatDescriptor.length=0,i.dataFormatDescriptor.push(y);const b=new c(t,f,h,!0);for(;b._offset<h;){const t=b._nextUint32(),e=b._scan(t),n=_(e),s=b._scan(t-e.byteLength);i.keyValue[n]=n.match(/^ktx/i)?_(s):s,t%4&&b._skip(4-t%4)}if(p<=0)return i;const d=new c(t,g,p,!0),B=d._nextUint16(),w=d._nextUint16(),A=d._nextUint32(),S=d._nextUint32(),m=d._nextUint32(),L=d._nextUint32(),I=[];for(let t=0;t<r;t++)I.push({imageFlags:d._nextUint32(),rgbSliceByteOffset:d._nextUint32(),rgbSliceByteLength:d._nextUint32(),alphaSliceByteOffset:d._nextUint32(),alphaSliceByteLength:d._nextUint32()});const R=g+d._offset,E=R+A,T=E+S,O=T+m,P=new Uint8Array(t.buffer,t.byteOffset+R,A),C=new Uint8Array(t.buffer,t.byteOffset+E,S),F=new Uint8Array(t.buffer,t.byteOffset+T,m),G=new Uint8Array(t.buffer,t.byteOffset+O,L);return i.globalData={endpointCount:B,selectorCount:w,imageDescs:I,endpointsData:P,selectorsData:C,tablesData:F,extendedData:G},i}function x(){return(x=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}const u={keepWriter:!1};function y(n,s={}){s=x({},u,s);let a=new ArrayBuffer(0);if(n.globalData){const t=new ArrayBuffer(20+5*n.globalData.imageDescs.length*4),e=new DataView(t);e.setUint16(0,n.globalData.endpointCount,!0),e.setUint16(2,n.globalData.selectorCount,!0),e.setUint32(4,n.globalData.endpointsData.byteLength,!0),e.setUint32(8,n.globalData.selectorsData.byteLength,!0),e.setUint32(12,n.globalData.tablesData.byteLength,!0),e.setUint32(16,n.globalData.extendedData.byteLength,!0);for(let t=0;t<n.globalData.imageDescs.length;t++){const i=n.globalData.imageDescs[t];e.setUint32(20+5*t*4+0,i.imageFlags,!0),e.setUint32(20+5*t*4+4,i.rgbSliceByteOffset,!0),e.setUint32(20+5*t*4+8,i.rgbSliceByteLength,!0),e.setUint32(20+5*t*4+12,i.alphaSliceByteOffset,!0),e.setUint32(20+5*t*4+16,i.alphaSliceByteLength,!0)}a=g([t,n.globalData.endpointsData,n.globalData.selectorsData,n.globalData.tablesData,n.globalData.extendedData])}const r=[];let o=n.keyValue;s.keepWriter||(o=x({},n.keyValue,{KTXwriter:\"KTX-Parse v0.0.4\"}));for(const e in o){const n=o[e],i=h(e),s=\"string\"==typeof n?h(n):n,a=i.byteLength+1+s.byteLength+1,l=a%4?4-a%4:0;r.push(g([new Uint32Array([a]),i,t,s,t,new Uint8Array(l).fill(0)]))}const l=g(r),f=new ArrayBuffer(44),U=new DataView(f);if(1!==n.dataFormatDescriptor.length||n.dataFormatDescriptor[0].descriptorType!==i.BASICFORMAT)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const c=n.dataFormatDescriptor[0];U.setUint32(0,44,!0),U.setUint16(4,c.vendorId,!0),U.setUint16(6,c.descriptorType,!0),U.setUint16(8,c.versionNumber,!0),U.setUint16(10,c.descriptorBlockSize,!0),U.setUint8(12,c.colorModel),U.setUint8(13,c.colorPrimaries),U.setUint8(14,c.transferFunction),U.setUint8(15,c.flags),U.setUint8(16,c.texelBlockDimension.x-1),U.setUint8(17,c.texelBlockDimension.y-1),U.setUint8(18,c.texelBlockDimension.z-1),U.setUint8(19,c.texelBlockDimension.w-1);for(let t=0;t<8;t++)U.setUint8(20+t,c.bytesPlane[t]);for(let t=0;t<c.samples.length;t++){const e=c.samples[t],n=28+16*t;U.setUint16(n+0,e.bitOffset,!0),U.setUint8(n+2,e.bitLength),U.setUint8(n+3,e.channelID),U.setUint8(n+4,e.samplePosition[0]),U.setUint8(n+5,e.samplePosition[1]),U.setUint8(n+6,e.samplePosition[2]),U.setUint8(n+7,e.samplePosition[3]),U.setUint32(n+8,e.sampleLower,!0),U.setUint32(n+12,e.sampleUpper,!0)}const _=e.length+68+3*n.levels.length*8,p=_+f.byteLength;let y=p+l.byteLength;y%8&&(y+=8-y%8);const D=[],b=new DataView(new ArrayBuffer(3*n.levels.length*8));let d=y+a.byteLength;for(let t=0;t<n.levels.length;t++){const e=n.levels[t];D.push(e.levelData),b.setBigUint64(24*t+0,BigInt(d),!0),b.setBigUint64(24*t+8,BigInt(e.levelData.byteLength),!0),b.setBigUint64(24*t+16,BigInt(e.uncompressedByteLength),!0),d+=e.levelData.byteLength}const B=new ArrayBuffer(68),w=new DataView(B);return w.setUint32(0,n.vkFormat,!0),w.setUint32(4,n.typeSize,!0),w.setUint32(8,n.pixelWidth,!0),w.setUint32(12,n.pixelHeight,!0),w.setUint32(16,n.pixelDepth,!0),w.setUint32(20,n.layerCount,!0),w.setUint32(24,n.faceCount,!0),w.setUint32(28,n.levels.length,!0),w.setUint32(32,n.supercompressionScheme,!0),w.setUint32(36,_,!0),w.setUint32(40,f.byteLength,!0),w.setUint32(44,p,!0),w.setUint32(48,l.byteLength,!0),w.setBigUint64(52,BigInt(y),!0),w.setBigUint64(60,BigInt(a.byteLength),!0),new Uint8Array(g([new Uint8Array(e).buffer,B,b.buffer,f,l,new ArrayBuffer(y-(p+l.byteLength)),a,...D]))}export{U as KTX2Container,p as read,y as write};\n//# sourceMappingURL=ktx-parse.modern.js.map\n","import {CompressedTextureExtractOptions, TextureLevel} from '../../types';\n\n/**\n * Extract mipmap images from compressed texture buffer\n * @param data - binary data of compressed texture or Array of level objects\n * @param options.mipMapLevels - number of mipmap level inside image\n * @param options.width - width of 0 - level\n * @param options.height - height of 0 - level\n * @param options.sizeFunction - format-related function to calculate level size in bytes\n * @param options.internalFormat - WebGL compatible format code\n * @returns Array of the texture levels\n */\nexport function extractMipmapImages(\n data: Uint8Array | Array<Object>,\n options: CompressedTextureExtractOptions\n): TextureLevel[] {\n const images = new Array(options.mipMapLevels);\n\n let levelWidth = options.width;\n let levelHeight = options.height;\n let offset = 0;\n\n for (let i = 0; i < options.mipMapLevels; ++i) {\n const levelSize = getLevelSize(options, levelWidth, levelHeight, data, i);\n const levelData = getLevelData(data, i, offset, levelSize);\n\n images[i] = {\n compressed: true,\n format: options.internalFormat,\n data: levelData,\n width: levelWidth,\n height: levelHeight,\n levelSize\n };\n\n levelWidth = Math.max(1, levelWidth >> 1);\n levelHeight = Math.max(1, levelHeight >> 1);\n\n offset += levelSize;\n }\n return images;\n}\n\nfunction getLevelData(data, index, offset, levelSize) {\n if (!Array.isArray(data)) {\n return new Uint8Array(data.buffer, data.byteOffset + offset, levelSize);\n }\n\n return data[index].levelData;\n}\n\nfunction getLevelSize(options, levelWidth, levelHeight, data, index) {\n if (!Array.isArray(data)) {\n return options.sizeFunction(levelWidth, levelHeight);\n }\n return options.sizeFunction(data[index]);\n}\n","/* eslint-disable camelcase */\nexport const GL = {\n // WEBGL_compressed_texture_s3tc\n\n COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83f0,\n COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83f1,\n COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83f2,\n COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83f3,\n\n // WEBGL_compressed_texture_es3\n\n COMPRESSED_R11_EAC: 0x9270,\n COMPRESSED_SIGNED_R11_EAC: 0x9271,\n COMPRESSED_RG11_EAC: 0x9272,\n COMPRESSED_SIGNED_RG11_EAC: 0x9273,\n COMPRESSED_RGB8_ETC2: 0x9274,\n COMPRESSED_RGBA8_ETC2_EAC: 0x9275,\n COMPRESSED_SRGB8_ETC2: 0x9276,\n COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 0x9277,\n COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9278,\n COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9279,\n\n // WEBGL_compressed_texture_pvrtc\n\n COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 0x8c00,\n COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 0x8c02,\n COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 0x8c01,\n COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 0x8c03,\n\n // WEBGL_compressed_texture_etc1\n\n COMPRESSED_RGB_ETC1_WEBGL: 0x8d64,\n\n // WEBGL_compressed_texture_atc\n\n COMPRESSED_RGB_ATC_WEBGL: 0x8c92,\n COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: 0x8c93,\n COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: 0x87ee,\n\n // WEBGL_compressed_texture_astc\n\n COMPRESSED_RGBA_ASTC_4X4_KHR: 0x93b0,\n COMPRESSED_RGBA_ASTC_5X4_KHR: 0x93b1,\n COMPRESSED_RGBA_ASTC_5X5_KHR: 0x93b2,\n COMPRESSED_RGBA_ASTC_6X5_KHR: 0x93b3,\n COMPRESSED_RGBA_ASTC_6X6_KHR: 0x93b4,\n COMPRESSED_RGBA_ASTC_8X5_KHR: 0x93b5,\n COMPRESSED_RGBA_ASTC_8X6_KHR: 0x93b6,\n COMPRESSED_RGBA_ASTC_8X8_KHR: 0x93b7,\n COMPRESSED_RGBA_ASTC_10X5_KHR: 0x93b8,\n COMPRESSED_RGBA_ASTC_10X6_KHR: 0x93b9,\n COMPRESSED_RGBA_ASTC_10X8_KHR: 0x93ba,\n COMPRESSED_RGBA_ASTC_10X10_KHR: 0x93bb,\n COMPRESSED_RGBA_ASTC_12X10_KHR: 0x93bc,\n COMPRESSED_RGBA_ASTC_12X12_KHR: 0x93bd,\n COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR: 0x93d0,\n COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR: 0x93d1,\n COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR: 0x93d2,\n COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR: 0x93d3,\n COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR: 0x93d4,\n COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR: 0x93d5,\n COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR: 0x93d6,\n COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR: 0x93d7,\n COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR: 0x93d8,\n COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR: 0x93d9,\n COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR: 0x93da,\n COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR: 0x93db,\n COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR: 0x93dc,\n COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR: 0x93dd,\n\n // EXT_texture_compression_rgtc\n\n COMPRESSED_RED_RGTC1_EXT: 0x8dbb,\n COMPRESSED_SIGNED_RED_RGTC1_EXT: 0x8dbc,\n COMPRESSED_RED_GREEN_RGTC2_EXT: 0x8dbd,\n COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: 0x8dbe,\n\n // WEBGL_compressed_texture_s3tc_srgb\n\n COMPRESSED_SRGB_S3TC_DXT1_EXT: 0x8c4c,\n COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 0x8c4d,\n COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 0x8c4e,\n COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 0x8c4f\n};\n","import {GL} from '../gl-constants';\n\nconst VULKAN_TO_WEBGL_FORMAT_MAP = {\n 131: GL.COMPRESSED_RGB_S3TC_DXT1_EXT,\n 132: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT,\n 133: GL.COMPRESSED_RGBA_S3TC_DXT1_EXT,\n 134: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,\n 135: GL.COMPRESSED_RGBA_S3TC_DXT3_EXT,\n 136: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,\n 137: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT,\n 138: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,\n 139: GL.COMPRESSED_RED_RGTC1_EXT,\n 140: GL.COMPRESSED_SIGNED_RED_RGTC1_EXT,\n 141: GL.COMPRESSED_RED_GREEN_RGTC2_EXT,\n 142: GL.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT,\n 147: GL.COMPRESSED_RGB8_ETC2,\n 148: GL.COMPRESSED_SRGB8_ETC2,\n 149: GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,\n 150: GL.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,\n 151: GL.COMPRESSED_RGBA8_ETC2_EAC,\n 152: GL.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,\n 153: GL.COMPRESSED_R11_EAC,\n 154: GL.COMPRESSED_SIGNED_R11_EAC,\n 155: GL.COMPRESSED_RG11_EAC,\n 156: GL.COMPRESSED_SIGNED_RG11_EAC,\n // @ts-ignore\n 157: GL.COMPRESSED_RGBA_ASTC_4x4_KHR,\n // @ts-ignore\n 158: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,\n // @ts-ignore\n 159: GL.COMPRESSED_RGBA_ASTC_5x4_KHR,\n // @ts-ignore\n 160: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR,\n // @ts-ignore\n 161: GL.COMPRESSED_RGBA_ASTC_5x5_KHR,\n // @ts-ignore\n 162: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,\n // @ts-ignore\n 163: GL.COMPRESSED_RGBA_ASTC_6x5_KHR,\n // @ts-ignore\n 164: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,\n // @ts-ignore\n 165: GL.COMPRESSED_RGBA_ASTC_6x6_KHR,\n // @ts-ignore\n 166: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,\n // @ts-ignore\n 167: GL.COMPRESSED_RGBA_ASTC_8x5_KHR,\n // @ts-ignore\n 168: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,\n // @ts-ignore\n 169: GL.COMPRESSED_RGBA_ASTC_8x6_KHR,\n // @ts-ignore\n 170: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,\n // @ts-ignore\n 171: GL.COMPRESSED_RGBA_ASTC_8x8_KHR,\n // @ts-ignore\n 172: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,\n // @ts-ignore\n 173: GL.COMPRESSED_RGBA_ASTC_10x5_KHR,\n // @ts-ignore\n 174: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,\n // @ts-ignore\n 175: GL.COMPRESSED_RGBA_ASTC_10x6_KHR,\n // @ts-ignore\n 176: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,\n // @ts-ignore\n 177: GL.COMPRESSED_RGBA_ASTC_10x8_KHR,\n // @ts-ignore\n 178: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,\n // @ts-ignore\n 179: GL.COMPRESSED_RGBA_ASTC_10x10_KHR,\n // @ts-ignore\n 180: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,\n // @ts-ignore\n 181: GL.COMPRESSED_RGBA_ASTC_12x10_KHR,\n // @ts-ignore\n 182: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,\n // @ts-ignore\n 183: GL.COMPRESSED_RGBA_ASTC_12x12_KHR,\n // @ts-ignore\n 184: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,\n 1000054000: GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,\n 1000054001: GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n // @ts-ignore\n 1000066000: GL.COMPRESSED_RGBA_ASTC_4x4_KHR,\n // @ts-ignore\n 1000066001: GL.COMPRESSED_RGBA_ASTC_5x4_KHR,\n // @ts-ignore\n 1000066002: GL.COMPRESSED_RGBA_ASTC_5x5_KHR,\n // @ts-ignore\n 1000066003: GL.COMPRESSED_RGBA_ASTC_6x5_KHR,\n // @ts-ignore\n 1000066004: GL.COMPRESSED_RGBA_ASTC_6x6_KHR,\n // @ts-ignore\n 1000066005: GL.COMPRESSED_RGBA_ASTC_8x5_KHR,\n // @ts-ignore\n 1000066006: GL.COMPRESSED_RGBA_ASTC_8x6_KHR,\n // @ts-ignore\n 1000066007: GL.COMPRESSED_RGBA_ASTC_8x8_KHR,\n // @ts-ignore\n 1000066008: GL.COMPRESSED_RGBA_ASTC_10x5_KHR,\n // @ts-ignore\n 1000066009: GL.COMPRESSED_RGBA_ASTC_10x6_KHR,\n // @ts-ignore\n 1000066010: GL.COMPRESSED_RGBA_ASTC_10x8_KHR,\n // @ts-ignore\n 1000066011: GL.COMPRESSED_RGBA_ASTC_10x10_KHR,\n // @ts-ignore\n 1000066012: GL.COMPRESSED_RGBA_ASTC_12x10_KHR,\n // @ts-ignore\n 1000066013: GL.COMPRESSED_RGBA_ASTC_12x12_KHR\n};\n\n/**\n * Returns WebGl format based on Vulkan format\n * Vulkan to WebGl format mapping provided here http://github.khronos.org/KTX-Specification/#formatMapping\n * Vulkan name to format number mapping provided here: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkFormat.html\n * @param {Number} vkFormat\n * @returns {Number}\n */\nexport function mapVkFormatToWebGL(vkFormat) {\n return VULKAN_TO_WEBGL_FORMAT_MAP[vkFormat];\n}\n","import {read} from 'ktx-parse';\nimport {extractMipmapImages} from '../utils/extract-mipmap-images';\nimport {mapVkFormatToWebGL} from '../utils/ktx-format-helper';\n\nconst KTX2_ID = [\n // '´', 'K', 'T', 'X', '2', '0', 'ª', '\\r', '\\n', '\\x1A', '\\n'\n 0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a\n];\n\n// eslint-disable-next-line complexity\nexport function isKTX(data) {\n const id = new Uint8Array(data.buffer || data, data.byteOffset || 0, KTX2_ID.length);\n const notKTX =\n id[0] !== KTX2_ID[0] || // '´'\n id[1] !== KTX2_ID[1] || // 'K'\n id[2] !== KTX2_ID[2] || // 'T'\n id[3] !== KTX2_ID[3] || // 'X'\n id[4] !== KTX2_ID[4] || // ' '\n id[5] !== KTX2_ID[5] || // '2'\n id[6] !== KTX2_ID[6] || // '0'\n id[7] !== KTX2_ID[7] || // 'ª'\n id[8] !== KTX2_ID[8] || // '\\r'\n id[9] !== KTX2_ID[9] || // '\\n'\n id[10] !== KTX2_ID[10] || // '\\x1A'\n id[11] !== KTX2_ID[11]; // '\\n'\n\n return !notKTX;\n}\n\nexport function parseKTX(arrayBuffer) {\n const uint8Array = new Uint8Array(arrayBuffer);\n const ktx = read(uint8Array);\n const mipMapLevels = Math.max(1, ktx.levels.length);\n const width = ktx.pixelWidth;\n const height = ktx.pixelHeight;\n const internalFormat = mapVkFormatToWebGL(ktx.vkFormat);\n\n return extractMipmapImages(ktx.levels, {\n mipMapLevels,\n width,\n height,\n sizeFunction: (level) => level.uncompressedByteLength,\n internalFormat\n });\n}\n","import type {TextureLevel} from '../../types';\nimport {assert} from '@loaders.gl/loader-utils';\nimport {GL} from '../gl-constants';\nimport {extractMipmapImages} from '../utils/extract-mipmap-images';\n\nconst getATCLevelSize = getDxt1LevelSize;\nconst getATCALevelSize = getDxtXLevelSize;\nconst getATCILevelSize = getDxtXLevelSize;\nconst DDS_CONSTANTS = {\n MAGIC_NUMBER: 0x20534444,\n HEADER_LENGTH: 31,\n MAGIC_NUMBER_INDEX: 0,\n HEADER_SIZE_INDEX: 1,\n HEADER_FLAGS_INDEX: 2,\n HEADER_HEIGHT_INDEX: 3,\n HEADER_WIDTH_INDEX: 4,\n MIPMAPCOUNT_INDEX: 7,\n HEADER_PF_FLAGS_INDEX: 20,\n HEADER_PF_FOURCC_INDEX: 21,\n DDSD_MIPMAPCOUNT: 0x20000,\n DDPF_FOURCC: 0x4,\n PIXEL_FORMATS: {\n DXT1: GL.COMPRESSED_RGB_S3TC_DXT1_EXT,\n DXT3: GL.COMPRESSED_RGBA_S3TC_DXT3_EXT,\n DXT5: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT,\n 'ATC ': GL.COMPRESSED_RGB_ATC_WEBGL,\n ATCA: GL.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL,\n ATCI: GL.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL\n },\n SIZE_FUNCTIONS: {\n DXT1: getDxt1LevelSize,\n DXT3: getDxtXLevelSize,\n DXT5: getDxtXLevelSize,\n 'ATC ': getATCLevelSize,\n ATCA: getATCALevelSize,\n ATCI: getATCILevelSize\n }\n};\n\n/**\n * Check if data is in \"DDS\" format by its magic number\n * @param data - binary data of compressed texture\n * @returns true - data in \"DDS\" format, else - false\n */\nexport function isDDS(data: ArrayBuffer): boolean {\n const header = new Uint32Array(data, 0, DDS_CONSTANTS.HEADER_LENGTH);\n const magic = header[DDS_CONSTANTS.MAGIC_NUMBER_INDEX];\n return magic === DDS_CONSTANTS.MAGIC_NUMBER;\n}\n\n/**\n * Parse texture data as \"DDS\" format\n * @param data - binary data of compressed texture\n * @returns Array of the texture levels\n */\nexport function parseDDS(data: ArrayBuffer): TextureLevel[] {\n const header = new Int32Array(data, 0, DDS_CONSTANTS.HEADER_LENGTH);\n const pixelFormatNumber = header[DDS_CONSTANTS.HEADER_PF_FOURCC_INDEX];\n assert(\n Boolean(header[DDS_CONSTANTS.HEADER_PF_FLAGS_INDEX] & DDS_CONSTANTS.DDPF_FOURCC),\n 'DDS: Unsupported format, must contain a FourCC code'\n );\n const fourCC = int32ToFourCC(pixelFormatNumber);\n const internalFormat = DDS_CONSTANTS.PIXEL_FORMATS[fourCC];\n const sizeFunction = DDS_CONSTANTS.SIZE_FUNCTIONS[fourCC];\n assert(internalFormat && sizeFunction, `DDS: Unknown pixel format ${pixelFormatNumber}`);\n\n let mipMapLevels = 1;\n if (header[DDS_CONSTANTS.HEADER_FLAGS_INDEX] & DDS_CONSTANTS.DDSD_MIPMAPCOUNT) {\n mipMapLevels = Math.max(1, header[DDS_CONSTANTS.MIPMAPCOUNT_INDEX]);\n }\n const width = header[DDS_CONSTANTS.HEADER_WIDTH_INDEX];\n const height = header[DDS_CONSTANTS.HEADER_HEIGHT_INDEX];\n const dataOffset = header[DDS_CONSTANTS.HEADER_SIZE_INDEX] + 4;\n const image = new Uint8Array(data, dataOffset);\n\n return extractMipmapImages(image, {\n mipMapLevels,\n width,\n height,\n sizeFunction,\n internalFormat\n });\n}\n\n/**\n * DXT1 applicable function to calculate level size\n * @param width - level width\n * @param height - level height\n * @returns level size in bytes\n */\nexport function getDxt1LevelSize(width: number, height: number): number {\n return ((width + 3) >> 2) * ((height + 3) >> 2) * 8;\n}\n\n/**\n * DXT3 & DXT5 applicable function to calculate level size\n * @param width - level width\n * @param height - level height\n * @returns level size in bytes\n */\nexport function getDxtXLevelSize(width: number, height: number): number {\n return ((width + 3) >> 2) * ((height + 3) >> 2) * 16;\n}\n\n/**\n * Convert every byte of Int32 value to char\n * @param {number} value - Int32 number\n * @returns {string} string of 4 characters\n */\nfunction int32ToFourCC(value) {\n return String.fromCharCode(\n value & 0xff,\n (value >> 8) & 0xff,\n (value >> 16) & 0xff,\n (value >> 24) & 0xff\n );\n}\n","import {TextureLevel} from '../../types';\n/* eslint-disable camelcase */\n// Forked from PicoGL: https://github.com/tsherif/picogl.js/blob/master/examples/utils/utils.js\n// Copyright (c) 2017 Tarek Sherif, The MIT License (MIT)\nimport {GL} from '../gl-constants';\nimport {extractMipmapImages} from '../utils/extract-mipmap-images';\n\nconst PVR_CONSTANTS = {\n MAGIC_NUMBER: 0x03525650,\n MAGIC_NUMBER_EXTRA: 0x50565203,\n HEADER_LENGTH: 13,\n HEADER_SIZE: 52,\n MAGIC_NUMBER_INDEX: 0,\n PIXEL_FORMAT_INDEX: 2,\n COLOUR_SPACE_INDEX: 4,\n HEIGHT_INDEX: 6,\n WIDTH_INDEX: 7,\n MIPMAPCOUNT_INDEX: 11,\n METADATA_SIZE_INDEX: 12\n};\n\nconst PVR_PIXEL_FORMATS = {\n 0: [GL.COMPRESSED_RGB_PVRTC_2BPPV1_IMG],\n 1: [GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG],\n 2: [GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG],\n 3: [GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG],\n 6: [GL.COMPRESSED_RGB_ETC1_WEBGL],\n 7: [GL.COMPRESSED_RGB_S3TC_DXT1_EXT],\n 9: [GL.COMPRESSED_RGBA_S3TC_DXT3_EXT],\n 11: [GL.COMPRESSED_RGBA_S3TC_DXT5_EXT],\n 22: [GL.COMPRESSED_RGB8_ETC2],\n 23: [GL.COMPRESSED_RGBA8_ETC2_EAC],\n 24: [GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2],\n 25: [GL.COMPRESSED_R11_EAC],\n 26: [GL.COMPRESSED_RG11_EAC],\n 27: [GL.COMPRESSED_RGBA_ASTC_4X4_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR],\n 28: [GL.COMPRESSED_RGBA_ASTC_5X4_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR],\n 29: [GL.COMPRESSED_RGBA_ASTC_5X5_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR],\n 30: [GL.COMPRESSED_RGBA_ASTC_6X5_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR],\n 31: [GL.COMPRESSED_RGBA_ASTC_6X6_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR],\n 32: [GL.COMPRESSED_RGBA_ASTC_8X5_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR],\n 33: [GL.COMPRESSED_RGBA_ASTC_8X6_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR],\n 34: [GL.COMPRESSED_RGBA_ASTC_8X8_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR],\n 35: [GL.COMPRESSED_RGBA_ASTC_10X5_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR],\n 36: [GL.COMPRESSED_RGBA_ASTC_10X6_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR],\n 37: [GL.COMPRESSED_RGBA_ASTC_10X8_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR],\n 38: [GL.COMPRESSED_RGBA_ASTC_10X10_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR],\n 39: [GL.COMPRESSED_RGBA_ASTC_12X10_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR],\n 40: [GL.COMPRESSED_RGBA_ASTC_12X12_KHR, GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR]\n};\n\nconst PVR_SIZE_FUNCTIONS = {\n 0: pvrtc2bppSize,\n 1: pvrtc2bppSize,\n 2: pvrtc4bppSize,\n 3: pvrtc4bppSize,\n 6: dxtEtcSmallSize,\n 7: dxtEtcSmallSize,\n 9: dxtEtcAstcBigSize,\n 11: dxtEtcAstcBigSize,\n 22: dxtEtcSmallSize,\n 23: dxtEtcAstcBigSize,\n 24: dxtEtcSmallSize,\n 25: dxtEtcSmallSize,\n 26: dxtEtcAstcBigSize,\n 27: dxtEtcAstcBigSize,\n 28: atc5x4Size,\n 29: atc5x5Size,\n 30: atc6x5Size,\n 31: atc6x6Size,\n 32: atc8x5Size,\n 33: atc8x6Size,\n 34: atc8x8Size,\n 35: atc10x5Size,\n 36: atc10x6Size,\n 37: atc10x8Size,\n 38: atc10x10Size,\n 39: atc12x10Size,\n 40: atc12x12Size\n};\n\n/**\n * Check if data is in \"PVR\" format by its magic number\n * @param data - binary data of compressed texture\n * @returns true - data in \"PVR\" format, else - false\n */\nexport function isPVR(data: ArrayBuffer): boolean {\n const header = new Uint32Array(data, 0, PVR_CONSTANTS.HEADER_LENGTH);\n const version = header[PVR_CONSTANTS.MAGIC_NUMBER_INDEX];\n\n return version === PVR_CONSTANTS.MAGIC_NUMBER || version === PVR_CONSTANTS.MAGIC_NUMBER_EXTRA;\n}\n\n/**\n * Parse texture data as \"PVR\" format\n * @param data - binary data of compressed texture\n * @returns Array of the texture levels\n * @see http://cdn.imgtec.com/sdk-documentation/PVR+File+Format.Specification.pdf\n */\nexport function parsePVR(data: ArrayBuffer): TextureLevel[] {\n const header = new Uint32Array(data, 0, PVR_CONSTANTS.HEADER_LENGTH);\n\n const pvrFormat = header[PVR_CONSTANTS.PIXEL_FORMAT_INDEX];\n const colourSpace = header[PVR_CONSTANTS.COLOUR_SPACE_INDEX];\n const pixelFormats = PVR_PIXEL_FORMATS[pvrFormat] || [];\n const internalFormat = pixelFormats.length > 1 && colourSpace ? pixelFormats[1] : pixelFormats[0];\n\n const sizeFunction = PVR_SIZE_FUNCTIONS[pvrFormat];\n\n const mipMapLevels = header[PVR_CONSTANTS.MIPMAPCOUNT_INDEX];\n\n const width = header[PVR_CONSTANTS.WIDTH_INDEX];\n const height = header[PVR_CONSTANTS.HEIGHT_INDEX];\n\n const dataOffset = PVR_CONSTANTS.HEADER_SIZE + header[PVR_CONSTANTS.METADATA_SIZE_INDEX];\n\n const image = new Uint8Array(data, dataOffset);\n\n return extractMipmapImages(image, {\n mipMapLevels,\n width,\n height,\n sizeFunction,\n internalFormat\n });\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/\nfunction pvrtc2bppSize(width, height) {\n width = Math.max(width, 16);\n height = Math.max(height, 8);\n\n return (width * height) / 4;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/\nfunction pvrtc4bppSize(width, height) {\n width = Math.max(width, 8);\n height = Math.max(height, 8);\n\n return (width * height) / 2;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc/\n// Size for:\n// COMPRESSED_RGB_S3TC_DXT1_EXT\n// COMPRESSED_R11_EAC\n// COMPRESSED_SIGNED_R11_EAC\n// COMPRESSED_RGB8_ETC2\n// COMPRESSED_SRGB8_ETC2\n// COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2\n// COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2\nfunction dxtEtcSmallSize(width, height) {\n return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc/\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\n// Size for:\n// COMPRESSED_RGBA_S3TC_DXT3_EXT\n// COMPRESSED_RGBA_S3TC_DXT5_EXT\n// COMPRESSED_RG11_EAC\n// COMPRESSED_SIGNED_RG11_EAC\n// COMPRESSED_RGBA8_ETC2_EAC\n// COMPRESSED_SRGB8_ALPHA8_ETC2_EAC\n// COMPRESSED_RGBA_ASTC_4x4_KHR\nfunction dxtEtcAstcBigSize(width, height) {\n return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc5x4Size(width, height) {\n return Math.floor((width + 4) / 5) * Math.floor((height + 3) / 4) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc5x5Size(width, height) {\n return Math.floor((width + 4) / 5) * Math.floor((height + 4) / 5) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc6x5Size(width, height) {\n return Math.floor((width + 5) / 6) * Math.floor((height + 4) / 5) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc6x6Size(width, height) {\n return Math.floor((width + 5) / 6) * Math.floor((height + 5) / 6) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc8x5Size(width, height) {\n return Math.floor((width + 7) / 8) * Math.floor((height + 4) / 5) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc8x6Size(width, height) {\n return Math.floor((width + 7) / 8) * Math.floor((height + 5) / 6) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc8x8Size(width, height) {\n return Math.floor((width + 7) / 8) * Math.floor((height + 7) / 8) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc10x5Size(width, height) {\n return Math.floor((width + 9) / 10) * Math.floor((height + 4) / 5) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc10x6Size(width, height) {\n return Math.floor((width + 9) / 10) * Math.floor((height + 5) / 6) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc10x8Size(width, height) {\n return Math.floor((width + 9) / 10) * Math.floor((height + 7) / 8) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc10x10Size(width, height) {\n return Math.floor((width + 9) / 10) * Math.floor((height + 9) / 10) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc12x10Size(width, height) {\n return Math.floor((width + 11) / 12) * Math.floor((height + 9) / 10) * 16;\n}\n\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\nfunction atc12x12Size(width, height) {\n return Math.floor((width + 11) / 12) * Math.floor((height + 11) / 12) * 16;\n}\n","import {loadLibrary} from '@loaders.gl/worker-utils';\n\nlet loadBasisTranscoderPromise;\n\n/**\n * Loads wasm transcoder module\n * @param options\n * @returns {BasisFile} promise\n */\nexport async function loadBasisTrascoderModule(options) {\n const modules = options.modules || {};\n if (modules.basis) {\n return modules.basis;\n }\n\n loadBasisTranscoderPromise = loadBasisTranscoderPromise || loadBasisTrascoder(options);\n return await loadBasisTranscoderPromise;\n}\n\n/**\n * Loads wasm transcoder module\n * @param options\n * @returns {BasisFile} promise\n */\nasync function loadBasisTrascoder(options) {\n let BASIS = null;\n let wasmBinary = null;\n\n [BASIS, wasmBinary] = await Promise.all([\n await loadLibrary('basis_transcoder.js', 'textures', options),\n await loadLibrary('basis_transcoder.wasm', 'textures', options)\n ]);\n\n // Depends on how import happened...\n // @ts-ignore TS2339: Property does not exist on type\n BASIS = BASIS || globalThis.BASIS;\n return await initializeBasisTrascoderModule(BASIS, wasmBinary);\n}\n\n/**\n * Initialize wasm transcoder module\n * @param BasisModule - js part of the module\n * @param wasmBinary - wasm part of the module\n * @returns {BasisFile} promise\n */\nfunction initializeBasisTrascoderModule(BasisModule, wasmBinary) {\n const options: {wasmBinary?} = {};\n\n if (wasmBinary) {\n options.wasmBinary = wasmBinary;\n }\n\n return new Promise((resolve) => {\n // if you try to return BasisModule the browser crashes!\n BasisModule(options).then((module) => {\n const {BasisFile, initializeBasis} = module;\n initializeBasis();\n resolve({BasisFile});\n });\n });\n}\n\nlet loadBasisEncoderPromise;\n\n/**\n * Loads wasm encoder module\n * @param options\n * @returns {BasisFile, KTX2File} promise\n */\nexport async function loadBasisEncoderModule(options) {\n const modules = options.modules || {};\n if (modules.basisEncoder) {\n return modules.basisEncoder;\n }\n\n loadBasisEncoderPromise = loadBasisEncoderPromise || loadBasisEncoder(options);\n return await loadBasisEncoderPromise;\n}\n\n/**\n * Loads wasm encoder module\n * @param options\n * @returns {BasisFile, KTX2File} promise\n */\nasync function loadBasisEncoder(options) {\n let BASIS_ENCODER = null;\n let wasmBinary = null;\n\n [BASIS_ENCODER, wasmBinary] = await Promise.all([\n await loadLibrary('basis_encoder.js', 'textures', options),\n await loadLibrary('basis_encoder.wasm', 'textures', options)\n ]);\n\n // Depends on how import happened...\n // @ts-ignore TS2339: Property does not exist on type\n BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;\n return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);\n}\n\n/**\n * Initialize wasm transcoder module\n * @param BasisEncoderModule - js part of the module\n * @param wasmBinary - wasm part of the module\n * @returns {BasisFile, KTX2File} promise\n */\nfunction initializeBasisEncoderModule(BasisEncoderModule, wasmBinary) {\n const options: {wasmBinary?} = {};\n\n if (wasmBinary) {\n options.wasmBinary = wasmBinary;\n }\n\n return new Promise((resolve) => {\n // if you try to return BasisModule the browser crashes!\n BasisEncoderModule(options).then((module) => {\n const {BasisFile, KTX2File, initializeBasis} = module;\n initializeBasis();\n resolve({BasisFile, KTX2File});\n });\n });\n}\n","import type {TextureLevel} from '../../types';\nimport {isKTX, parseKTX} from './parse-ktx';\nimport {isDDS, parseDDS} from './parse-dds';\nimport {isPVR, parsePVR} from './parse-pvr';\n\n/**\n * Deduces format and parses compressed texture loaded in ArrayBuffer\n * @param data - binary data of compressed texture\n * @returns Array of the texture levels\n */\nexport function parseCompressedTexture(data: ArrayBuffer): TextureLevel[] {\n if (isKTX(data)) {\n // TODO: remove @ts-ignore when `parseKTX` output is normalized to loaders.gl texture format\n // @ts-ignore\n return parseKTX(data);\n }\n if (isDDS(data)) {\n return parseDDS(data);\n }\n if (isPVR(data)) {\n return parsePVR(data);\n }\n throw new Error('Texture container format not recognized');\n}\n","import type {GPUTextureFormat} from '../../types';\n\nconst BROWSER_PREFIXES = ['', 'WEBKIT_', 'MOZ_'];\n\nconst WEBGL_EXTENSIONS: {[key: string]: GPUTextureFormat} = {\n /* eslint-disable camelcase */\n WEBGL_compressed_texture_s3tc: 'dxt',\n WEBGL_compressed_texture_s3tc_srgb: 'dxt-srgb',\n WEBGL_compressed_texture_etc1: 'etc1',\n WEBGL_compressed_texture_etc: 'etc2',\n WEBGL_compressed_texture_pvrtc: 'pvrtc',\n WEBGL_compressed_texture_atc: 'atc',\n WEBGL_compressed_texture_astc: 'astc',\n EXT_texture_compression_rgtc: 'rgtc'\n /* eslint-enable camelcase */\n};\n\nlet formats: Set<GPUTextureFormat> | null = null;\n\n/**\n * Returns a list of formats.\n * Creates a temporary WebGLRenderingContext if none is provided.\n *\n * @param gl - Optional context.\n */\nexport function getSupportedGPUTextureFormats(gl?: WebGLRenderingContext): Set<string> {\n if (!formats) {\n gl = gl || getWebGLContext() || undefined;\n\n formats = new Set<GPUTextureFormat>();\n\n for (const prefix of BROWSER_PREFIXES) {\n for (const extension in WEBGL_EXTENSIONS) {\n if (gl && gl.getExtension(`${prefix}${extension}`)) {\n const gpuTextureFormat = WEBGL_EXTENSIONS[extension];\n formats.add(gpuTextureFormat);\n }\n }\n }\n }\n\n return formats;\n}\n\n/**\n * @returns {WebGLRenderingContext?}\n */\nfunction getWebGLContext() {\n try {\n const canvas = document.createElement('canvas');\n return canvas.getContext('webgl');\n } catch (error) {\n return null;\n }\n}\n","import {loadBasisEncoderModule, loadBasisTrascoderModule} from './basis-module-loader';\nimport {GL} from '../gl-constants';\nimport {getSupportedGPUTextureFormats} from '../..';\n\nconst OutputFormat = {\n etc1: {basisFormat: 0, compressed: true, format: GL.COMPRESSED_RGB_ETC1_WEBGL},\n etc2: {basisFormat: 1, compressed: true},\n bc1: {basisFormat: 2, compressed: true, format: GL.COMPRESSED_RGB_S3TC_DXT1_EXT},\n bc3: {basisFormat: 3, compressed: true, format: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT},\n bc4: {basisFormat: 4, compressed: true},\n bc5: {basisFormat: 5, compressed: true},\n 'bc7-m6-opaque-only': {basisFormat: 6, compressed: true},\n 'bc7-m5': {basisFormat: 7, compressed: true},\n 'pvrtc1-4-rgb': {basisFormat: 8, compressed: true, format: GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG},\n 'pvrtc1-4-rgba': {basisFormat: 9, compressed: true, format: GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG},\n 'astc-4x4': {basisFormat: 10, compressed: true, format: GL.COMPRESSED_RGBA_ASTC_4X4_KHR},\n 'atc-rgb': {basisFormat: 11, compressed: true},\n 'atc-rgba-interpolated-alpha': {basisFormat: 12, compressed: true},\n rgba32: {basisFormat: 13, compressed: false},\n rgb565: {basisFormat: 14, compressed: false},\n bgr565: {basisFormat: 15, compressed: false},\n rgba4444: {basisFormat: 16, compressed: false}\n};\n\n/**\n * parse data with a Binomial Basis_Universal module\n * @param {ArrayBuffer} data\n * @param {*} options\n * @returns compressed texture data\n */\nexport default async function parseBasis(data, options) {\n switch (options.basis.module) {\n case 'encoder':\n const fileConstructors = await loadBasisEncoderModule(options);\n switch (options.basis.decoderFormat) {\n case 'ktx2':\n return parseKTX2File(fileConstructors.KTX2File, data, options);\n case 'basis':\n default:\n return parseBasisFile(fileConstructors.BasisFile, data, options);\n }\n case 'transcoder':\n default:\n const {BasisFile} = await loadBasisTrascoderModule(options);\n return parseBasisFile(BasisFile, data, options);\n }\n}\n\n/**\n * Parse *.basis file data\n * @param {*} BasisFile - initialized transcoder module\n * @param {*} data\n * @param {*} options\n * @returns compressed texture data\n */\nfunction parseBasisFile(BasisFile, data, options) {\n const basisFile = new BasisFile(new Uint8Array(data));\n\n try {\n if (!basisFile.startTranscoding()) {\n return null;\n }\n\n const imageCount = basisFile.getNumImages();\n const images = [];\n\n for (let imageIndex = 0; imageIndex < imageCount; imageIndex++) {\n const levelsCount = basisFile.getNumLevels(imageIndex);\n const levels = [];\n\n for (let levelIndex = 0; levelIndex < levelsCount; levelIndex++) {\n levels.push(transcodeImage(basisFile, imageIndex, levelIndex, options));\n }\n\n images.push(levels);\n }\n\n return images;\n } finally {\n basisFile.close();\n basisFile.delete();\n }\n}\n\n/**\n * Parse the particular level image of a basis file\n * @param {*} basisFile\n * @param {*} imageIndex\n * @param {*} levelIndex\n * @param {*} options\n * @returns compressed texture data\n */\nfunction transcodeImage(basisFile, imageIndex, levelIndex, options) {\n const width = basisFile.getImageWidth(imageIndex, levelIndex);\n const height = basisFile.getImageHeight(imageIndex, levelIndex);\n\n // See https://github.com/BinomialLLC/basis_universal/pull/83\n const hasAlpha = basisFile.getHasAlpha(/* imageIndex, levelIndex */);\n\n // Check options for output format etc\n const {compressed, format, basisFormat} = getBasisOptions(options, hasAlpha);\n\n const decodedSize = basisFile.getImageTranscodedSizeInBytes(imageIndex, levelIndex, basisFormat);\n const decodedData = new Uint8Array(decodedSize);\n\n if (!basisFile.transcodeImage(decodedData, imageIndex, levelIndex, basisFormat, 0, 0)) {\n return null;\n }\n\n return {\n // standard loaders.gl image category payload\n width,\n height,\n data: decodedData,\n compressed,\n\n // Additional fields\n // Add levelSize field.\n hasAlpha,\n format\n };\n}\n\n/**\n * Parse *.ktx2 file data\n * @param {*} KTX2File\n * @param {*} data\n * @param {*} options\n * @returns compressed texture data\n */\nfunction parseKTX2File(KTX2File, data, options) {\n const ktx2File = new KTX2File(new Uint8Array(data));\n\n try {\n if (!ktx2File.startTranscoding()) {\n return null;\n }\n const levelsCount = ktx2File.getLevels();\n const levels = [];\n\n for (let levelIndex = 0; levelIndex < levelsCount; levelIndex++) {\n levels.push(transcodeKTX2Image(ktx2File, levelIndex, options));\n break; // texture app can only show one level for some reason\n }\n\n return levels;\n } finally {\n ktx2File.close();\n ktx2File.delete();\n }\n}\n\n/**\n * Parse the particular level image of a ktx2 file\n * @param {*} ktx2File\n * @param {*} levelIndex\n * @param {*} options\n * @returns\n */\nfunction transcodeKTX2Image(ktx2File, levelIndex, options) {\n const {alphaFlag, height, width} = ktx2File.getImageLevelInfo(levelIndex, 0, 0);\n\n // Check options for output format etc\n const {compressed, format, basisFormat} = getBasisOptions(options, alphaFlag);\n\n const decodedSize = ktx2File.getImageTranscodedSizeInBytes(\n levelIndex,\n 0 /* layerIndex */,\n 0 /* faceIndex */,\n basisFormat\n );\n const decodedData = new Uint8Array(decodedSize);\n\n if (\n !ktx2File.transcodeImage(\n decodedData,\n levelIndex,\n 0 /* layerIndex */,\n 0 /* faceIndex */,\n basisFormat,\n 0,\n -1 /* channel0 */,\n -1 /* channel1 */\n )\n ) {\n return null;\n }\n\n return {\n // standard loaders.gl image category payload\n width,\n height,\n data: decodedData,\n compressed,\n\n // Additional fields\n // Add levelSize field.\n alphaFlag,\n format\n };\n}\n\n/**\n * Get BasisFormat by loader format option\n * @param {*} options\n * @param {*} hasAlpha\n * @returns BasisFormat data\n */\nfunction getBasisOptions(options, hasAlpha) {\n let format = options && options.basis && options.basis.format;\n if (format === 'auto') {\n format = selectSupportedFormat();\n }\n if (typeof format === 'object') {\n format = hasAlpha ? format.alpha : format.noAlpha;\n }\n format = format.toLowerCase();\n return OutputFormat[format];\n}\n\n/**\n * Select transcode format from the list of supported formats\n * @returns key for OutputFormat map\n */\nfunction selectSupportedFormat() {\n const supportedFormats = getSupportedGPUTextureFormats();\n if (supportedFormats.has('astc')) {\n return 'astc-4x4';\n } else if (supportedFormats.has('dxt')) {\n return {\n alpha: 'bc3',\n noAlpha: 'bc1'\n };\n } else if (supportedFormats.has('pvrtc')) {\n return {\n alpha: 'pvrtc1-4-rgba',\n noAlpha: 'pvrtc1-4-rgb'\n };\n } else if (supportedFormats.has('etc1')) {\n return 'etc1';\n } else if (supportedFormats.has('etc2')) {\n return 'etc2';\n }\n return 'rgb565';\n}\n","import type {Loader, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {VERSION} from './lib/utils/version';\nimport {parseCompressedTexture} from './lib/parsers/parse-compressed-texture';\nimport parseBasis from './lib/parsers/parse-basis';\n\nexport type TextureLoaderOptions = {\n 'compressed-texture'?: {\n libraryPath?: string;\n useBasis?: boolean;\n };\n};\n\nconst DEFAULT_TEXTURE_LOADER_OPTIONS = {\n 'compressed-texture': {\n libraryPath: 'libs/',\n useBasis: false\n }\n};\n\n/**\n * Worker Loader for KTX, DDS, and PVR texture container formats\n */\nexport const CompressedTextureWorkerLoader = {\n name: 'Texture Containers',\n id: 'compressed-texture',\n module: 'textures',\n version: VERSION,\n worker: true,\n extensions: [\n 'ktx',\n 'ktx2',\n 'dds', // WEBGL_compressed_texture_s3tc, WEBGL_compressed_texture_atc\n 'pvr' // WEBGL_compressed_texture_pvrtc\n ],\n mimeTypes: [\n 'image/ktx2',\n 'image/ktx',\n 'image/vnd-ms.dds',\n 'image/x-dds',\n 'application/octet-stream'\n ],\n binary: true,\n options: DEFAULT_TEXTURE_LOADER_OPTIONS\n};\n\n/**\n * Loader for KTX, DDS, and PVR texture container formats\n */\nexport const CompressedTextureLoader = {\n ...CompressedTextureWorkerLoader,\n parse: async (arrayBuffer, options) => {\n if (options['compressed-texture'].useBasis) {\n options.basis = {\n format: {\n alpha: 'BC3',\n noAlpha: 'BC1'\n },\n ...options.basis,\n decoderFormat: 'ktx2',\n module: 'encoder'\n };\n return await parseBasis(arrayBuffer, options);\n }\n return parseCompressedTexture(arrayBuffer);\n }\n};\n\n// TYPE TESTS - TODO find a better way than exporting junk\nexport const _TypecheckCompressedTextureWorkerLoader: Loader = CompressedTextureWorkerLoader;\nexport const _TypecheckCompressedTextureLoader: LoaderWithParser = CompressedTextureLoader;\n","// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\n// __VERSION__ is injected by babel-plugin-version-inline\n// TODO: use 'latest' instead of 'beta' when 3.0.0 version is released as 'latest'\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'beta';\n","import type {Loader, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {VERSION} from './lib/utils/version';\nimport parseBasis from './lib/parsers/parse-basis';\n\n/**\n * Worker loader for Basis super compressed textures\n */\nexport const BasisWorkerLoader = {\n name: 'Basis',\n id: 'basis',\n module: 'textures',\n version: VERSION,\n worker: true,\n extensions: ['basis'],\n mimeTypes: ['application/octet-stream'],\n tests: ['sB'],\n binary: true,\n options: {\n basis: {\n format: 'auto', // gl context doesn't exist on a worker thread\n libraryPath: 'libs/',\n decoderFormat: 'basis', // 'basis' || 'ktx2'\n module: 'transcoder' // 'transcoder' || 'encoder'\n }\n }\n};\n\n/**\n * Loader for Basis super compressed textures\n */\nexport const BasisLoader = {\n ...BasisWorkerLoader,\n parse: parseBasis\n};\n\n// TYPE TESTS - TODO find a better way than exporting junk\nexport const _TypecheckBasisWorkerLoader: Loader = BasisWorkerLoader;\nexport const _TypecheckBasisLoader: LoaderWithParser = BasisLoader;\n","import {Tile} from '../../types';\n\n/**\n * Generates url with token if it is exists.\n * @param {String} url\n * @param {any} token\n * @returns {string}\n */\nexport function getUrlWithToken(url, token = null) {\n return token ? `${url}?token=${token}` : url;\n}\n\n/**\n * Generates attribute urls for tile.\n * @param tile\n * @returns list of attribute urls\n */\nexport function generateTileAttributeUrls(tile: Tile): string[] {\n const {url, attributeData} = tile;\n const attributeUrls: string[] = [];\n\n for (let index = 0; index < attributeData.length; index++) {\n const attributeUrl = attributeData[index].href.replace('./', '');\n attributeUrls.push(`${url}/${attributeUrl}`);\n }\n\n return attributeUrls;\n}\n\n/**\n * Generates attribute urls for tileset based on tileset and resource\n * @param {Object} tileset\n * @param {number} resource\n * @returns {Array}\n */\nexport function generateTilesetAttributeUrls(tileset, resource) {\n const attributeUrls: string[] = [];\n const {attributeStorageInfo, url} = tileset;\n\n for (let index = 0; index < attributeStorageInfo.length; index++) {\n const fileName = attributeStorageInfo[index].key;\n attributeUrls.push(`${url}/nodes/${resource}/attributes/${fileName}/0`);\n }\n\n return attributeUrls;\n}\n","export default {\n DEPTH_BUFFER_BIT: 0x00000100,\n STENCIL_BUFFER_BIT: 0x00000400,\n COLOR_BUFFER_BIT: 0x00004000,\n POINTS: 0x0000,\n LINES: 0x0001,\n LINE_LOOP: 0x0002,\n LINE_STRIP: 0x0003,\n TRIANGLES: 0x0004,\n TRIANGLE_STRIP: 0x0005,\n TRIANGLE_FAN: 0x0006,\n ZERO: 0,\n ONE: 1,\n SRC_COLOR: 0x0300,\n ONE_MINUS_SRC_COLOR: 0x0301,\n SRC_ALPHA: 0x0302,\n ONE_MINUS_SRC_ALPHA: 0x0303,\n DST_ALPHA: 0x0304,\n ONE_MINUS_DST_ALPHA: 0x0305,\n DST_COLOR: 0x0306,\n ONE_MINUS_DST_COLOR: 0x0307,\n SRC_ALPHA_SATURATE: 0x0308,\n CONSTANT_COLOR: 0x8001,\n ONE_MINUS_CONSTANT_COLOR: 0x8002,\n CONSTANT_ALPHA: 0x8003,\n ONE_MINUS_CONSTANT_ALPHA: 0x8004,\n FUNC_ADD: 0x8006,\n FUNC_SUBTRACT: 0x800a,\n FUNC_REVERSE_SUBTRACT: 0x800b,\n BLEND_EQUATION: 0x8009,\n BLEND_EQUATION_RGB: 0x8009,\n BLEND_EQUATION_ALPHA: 0x883d,\n BLEND_DST_RGB: 0x80c8,\n BLEND_SRC_RGB: 0x80c9,\n BLEND_DST_ALPHA: 0x80ca,\n BLEND_SRC_ALPHA: 0x80cb,\n BLEND_COLOR: 0x8005,\n ARRAY_BUFFER_BINDING: 0x8894,\n ELEMENT_ARRAY_BUFFER_BINDING: 0x8895,\n LINE_WIDTH: 0x0b21,\n ALIASED_POINT_SIZE_RANGE: 0x846d,\n ALIASED_LINE_WIDTH_RANGE: 0x846e,\n CULL_FACE_MODE: 0x0b45,\n FRONT_FACE: 0x0b46,\n DEPTH_RANGE: 0x0b70,\n DEPTH_WRITEMASK: 0x0b72,\n DEPTH_CLEAR_VALUE: 0x0b73,\n DEPTH_FUNC: 0x0b74,\n STENCIL_CLEAR_VALUE: 0x0b91,\n STENCIL_FUNC: 0x0b92,\n STENCIL_FAIL: 0x0b94,\n STENCIL_PASS_DEPTH_FAIL: 0x0b95,\n STENCIL_PASS_DEPTH_PASS: 0x0b96,\n STENCIL_REF: 0x0b97,\n STENCIL_VALUE_MASK: 0x0b93,\n STENCIL_WRITEMASK: 0x0b98,\n STENCIL_BACK_FUNC: 0x8800,\n STENCIL_BACK_FAIL: 0x8801,\n STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802,\n STENCIL_BACK_PASS_DEPTH_PASS: 0x8803,\n STENCIL_BACK_REF: 0x8ca3,\n STENCIL_BACK_VALUE_MASK: 0x8ca4,\n STENCIL_BACK_WRITEMASK: 0x8ca5,\n VIEWPORT: 0x0ba2,\n SCISSOR_BOX: 0x0c10,\n COLOR_CLEAR_VALUE: 0x0c22,\n COLOR_WRITEMASK: 0x0c23,\n UNPACK_ALIGNMENT: 0x0cf5,\n PACK_ALIGNMENT: 0x0d05,\n MAX_TEXTURE_SIZE: 0x0d33,\n MAX_VIEWPORT_DIMS: 0x0d3a,\n SUBPIXEL_BITS: 0x0d50,\n RED_BITS: 0x0d52,\n GREEN_BITS: 0x0d53,\n BLUE_BITS: 0x0d54,\n ALPHA_BITS: 0x0d55,\n DEPTH_BITS: 0x0d56,\n STENCIL_BITS: 0x0d57,\n POLYGON_OFFSET_UNITS: 0x2a00,\n POLYGON_OFFSET_FACTOR: 0x8038,\n TEXTURE_BINDING_2D: 0x8069,\n SAMPLE_BUFFERS: 0x80a8,\n SAMPLES: 0x80a9,\n SAMPLE_COVERAGE_VALUE: 0x80aa,\n SAMPLE_COVERAGE_INVERT: 0x80ab,\n COMPRESSED_TEXTURE_FORMATS: 0x86a3,\n VENDOR: 0x1f00,\n RENDERER: 0x1f01,\n VERSION: 0x1f02,\n IMPLEMENTATION_COLOR_READ_TYPE: 0x8b9a,\n IMPLEMENTATION_COLOR_READ_FORMAT: 0x8b9b,\n BROWSER_DEFAULT_WEBGL: 0x9244,\n STATIC_DRAW: 0x88e4,\n STREAM_DRAW: 0x88e0,\n DYNAMIC_DRAW: 0x88e8,\n ARRAY_BUFFER: 0x8892,\n ELEMENT_ARRAY_BUFFER: 0x8893,\n BUFFER_SIZE: 0x8764,\n BUFFER_USAGE: 0x8765,\n CURRENT_VERTEX_ATTRIB: 0x8626,\n VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622,\n VERTEX_ATTRIB_ARRAY_SIZE: 0x8623,\n VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624,\n VERTEX_ATTRIB_ARRAY_TYPE: 0x8625,\n VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886a,\n VERTEX_ATTRIB_ARRAY_POINTER: 0x8645,\n VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889f,\n CULL_FACE: 0x0b44,\n FRONT: 0x0404,\n BACK: 0x0405,\n FRONT_AND_BACK: 0x0408,\n BLEND: 0x0be2,\n DEPTH_TEST: 0x0b71,\n DITHER: 0x0bd0,\n POLYGON_OFFSET_FILL: 0x8037,\n SAMPLE_ALPHA_TO_COVERAGE: 0x809e,\n SAMPLE_COVERAGE: 0x80a0,\n SCISSOR_TEST: 0x0c11,\n STENCIL_TEST: 0x0b90,\n NO_ERROR: 0,\n INVALID_ENUM: 0x0500,\n INVALID_VALUE: 0x0501,\n INVALID_OPERATION: 0x0502,\n OUT_OF_MEMORY: 0x0505,\n CONTEXT_LOST_WEBGL: 0x9242,\n CW: 0x0900,\n CCW: 0x0901,\n DONT_CARE: 0x1100,\n FASTEST: 0x1101,\n NICEST: 0x1102,\n GENERATE_MIPMAP_HINT: 0x8192,\n BYTE: 0x1400,\n UNSIGNED_BYTE: 0x1401,\n SHORT: 0x1402,\n UNSIGNED_SHORT: 0x1403,\n INT: 0x1404,\n UNSIGNED_INT: 0x1405,\n FLOAT: 0x1406,\n DOUBLE: 0x140a,\n DEPTH_COMPONENT: 0x1902,\n ALPHA: 0x1906,\n RGB: 0x1907,\n RGBA: 0x1908,\n LUMINANCE: 0x1909,\n LUMINANCE_ALPHA: 0x190a,\n UNSIGNED_SHORT_4_4_4_4: 0x8033,\n UNSIGNED_SHORT_5_5_5_1: 0x8034,\n UNSIGNED_SHORT_5_6_5: 0x8363,\n FRAGMENT_SHADER: 0x8b30,\n VERTEX_SHADER: 0x8b31,\n COMPILE_STATUS: 0x8b81,\n DELETE_STATUS: 0x8b80,\n LINK_STATUS: 0x8b82,\n VALIDATE_STATUS: 0x8b83,\n ATTACHED_SHADERS: 0x8b85,\n ACTIVE_ATTRIBUTES: 0x8b89,\n ACTIVE_UNIFORMS: 0x8b86,\n MAX_VERTEX_ATTRIBS: 0x8869,\n MAX_VERTEX_UNIFORM_VECTORS: 0x8dfb,\n MAX_VARYING_VECTORS: 0x8dfc,\n MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8b4d,\n MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8b4c,\n MAX_TEXTURE_IMAGE_UNITS: 0x8872,\n MAX_FRAGMENT_UNIFORM_VECTORS: 0x8dfd,\n SHADER_TYPE: 0x8b4f,\n SHADING_LANGUAGE_VERSION: 0x8b8c,\n CURRENT_PROGRAM: 0x8b8d,\n NEVER: 0x0200,\n ALWAYS: 0x0207,\n LESS: 0x0201,\n EQUAL: 0x0202,\n LEQUAL: 0x0203,\n GREATER: 0x0204,\n GEQUAL: 0x0206,\n NOTEQUAL: 0x0205,\n KEEP: 0x1e00,\n REPLACE: 0x1e01,\n INCR: 0x1e02,\n DECR: 0x1e03,\n INVERT: 0x150a,\n INCR_WRAP: 0x8507,\n DECR_WRAP: 0x8508,\n NEAREST: 0x2600,\n LINEAR: 0x2601,\n NEAREST_MIPMAP_NEAREST: 0x2700,\n LINEAR_MIPMAP_NEAREST: 0x2701,\n NEAREST_MIPMAP_LINEAR: 0x2702,\n LINEAR_MIPMAP_LINEAR: 0x2703,\n TEXTURE_MAG_FILTER: 0x2800,\n TEXTURE_MIN_FILTER: 0x2801,\n TEXTURE_WRAP_S: 0x2802,\n TEXTURE_WRAP_T: 0x2803,\n TEXTURE_2D: 0x0de1,\n TEXTURE: 0x1702,\n TEXTURE_CUBE_MAP: 0x8513,\n TEXTURE_BINDING_CUBE_MAP: 0x8514,\n TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515,\n TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516,\n TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517,\n TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518,\n TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519,\n TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851a,\n MAX_CUBE_MAP_TEXTURE_SIZE: 0x851c,\n TEXTURE0: 0x84c0,\n ACTIVE_TEXTURE: 0x84e0,\n REPEAT: 0x2901,\n CLAMP_TO_EDGE: 0x812f,\n MIRRORED_REPEAT: 0x8370,\n TEXTURE_WIDTH: 0x1000,\n TEXTURE_HEIGHT: 0x1001,\n FLOAT_VEC2: 0x8b50,\n FLOAT_VEC3: 0x8b51,\n FLOAT_VEC4: 0x8b52,\n INT_VEC2: 0x8b53,\n INT_VEC3: 0x8b54,\n INT_VEC4: 0x8b55,\n BOOL: 0x8b56,\n BOOL_VEC2: 0x8b57,\n BOOL_VEC3: 0x8b58,\n BOOL_VEC4: 0x8b59,\n FLOAT_MAT2: 0x8b5a,\n FLOAT_MAT3: 0x8b5b,\n FLOAT_MAT4: 0x8b5c,\n SAMPLER_2D: 0x8b5e,\n SAMPLER_CUBE: 0x8b60,\n LOW_FLOAT: 0x8df0,\n MEDIUM_FLOAT: 0x8df1,\n HIGH_FLOAT: 0x8df2,\n LOW_INT: 0x8df3,\n MEDIUM_INT: 0x8df4,\n HIGH_INT: 0x8df5,\n FRAMEBUFFER: 0x8d40,\n RENDERBUFFER: 0x8d41,\n RGBA4: 0x8056,\n RGB5_A1: 0x8057,\n RGB565: 0x8d62,\n DEPTH_COMPONENT16: 0x81a5,\n STENCIL_INDEX: 0x1901,\n STENCIL_INDEX8: 0x8d48,\n DEPTH_STENCIL: 0x84f9,\n RENDERBUFFER_WIDTH: 0x8d42,\n RENDERBUFFER_HEIGHT: 0x8d43,\n RENDERBUFFER_INTERNAL_FORMAT: 0x8d44,\n RENDERBUFFER_RED_SIZE: 0x8d50,\n RENDERBUFFER_GREEN_SIZE: 0x8d51,\n RENDERBUFFER_BLUE_SIZE: 0x8d52,\n RENDERBUFFER_ALPHA_SIZE: 0x8d53,\n RENDERBUFFER_DEPTH_SIZE: 0x8d54,\n RENDERBUFFER_STENCIL_SIZE: 0x8d55,\n FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8cd0,\n FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8cd1,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8cd2,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8cd3,\n COLOR_ATTACHMENT0: 0x8ce0,\n DEPTH_ATTACHMENT: 0x8d00,\n STENCIL_ATTACHMENT: 0x8d20,\n DEPTH_STENCIL_ATTACHMENT: 0x821a,\n NONE: 0,\n FRAMEBUFFER_COMPLETE: 0x8cd5,\n FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8cd6,\n FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8cd7,\n FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8cd9,\n FRAMEBUFFER_UNSUPPORTED: 0x8cdd,\n FRAMEBUFFER_BINDING: 0x8ca6,\n RENDERBUFFER_BINDING: 0x8ca7,\n READ_FRAMEBUFFER: 0x8ca8,\n DRAW_FRAMEBUFFER: 0x8ca9,\n MAX_RENDERBUFFER_SIZE: 0x84e8,\n INVALID_FRAMEBUFFER_OPERATION: 0x0506,\n UNPACK_FLIP_Y_WEBGL: 0x9240,\n UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241,\n UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243,\n READ_BUFFER: 0x0c02,\n UNPACK_ROW_LENGTH: 0x0cf2,\n UNPACK_SKIP_ROWS: 0x0cf3,\n UNPACK_SKIP_PIXELS: 0x0cf4,\n PACK_ROW_LENGTH: 0x0d02,\n PACK_SKIP_ROWS: 0x0d03,\n PACK_SKIP_PIXELS: 0x0d04,\n TEXTURE_BINDING_3D: 0x806a,\n UNPACK_SKIP_IMAGES: 0x806d,\n UNPACK_IMAGE_HEIGHT: 0x806e,\n MAX_3D_TEXTURE_SIZE: 0x8073,\n MAX_ELEMENTS_VERTICES: 0x80e8,\n MAX_ELEMENTS_INDICES: 0x80e9,\n MAX_TEXTURE_LOD_BIAS: 0x84fd,\n MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8b49,\n MAX_VERTEX_UNIFORM_COMPONENTS: 0x8b4a,\n MAX_ARRAY_TEXTURE_LAYERS: 0x88ff,\n MIN_PROGRAM_TEXEL_OFFSET: 0x8904,\n MAX_PROGRAM_TEXEL_OFFSET: 0x8905,\n MAX_VARYING_COMPONENTS: 0x8b4b,\n FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8b8b,\n RASTERIZER_DISCARD: 0x8c89,\n VERTEX_ARRAY_BINDING: 0x85b5,\n MAX_VERTEX_OUTPUT_COMPONENTS: 0x9122,\n MAX_FRAGMENT_INPUT_COMPONENTS: 0x9125,\n MAX_SERVER_WAIT_TIMEOUT: 0x9111,\n MAX_ELEMENT_INDEX: 0x8d6b,\n RED: 0x1903,\n RGB8: 0x8051,\n RGBA8: 0x8058,\n RGB10_A2: 0x8059,\n TEXTURE_3D: 0x806f,\n TEXTURE_WRAP_R: 0x8072,\n TEXTURE_MIN_LOD: 0x813a,\n TEXTURE_MAX_LOD: 0x813b,\n TEXTURE_BASE_LEVEL: 0x813c,\n TEXTURE_MAX_LEVEL: 0x813d,\n TEXTURE_COMPARE_MODE: 0x884c,\n TEXTURE_COMPARE_FUNC: 0x884d,\n SRGB: 0x8c40,\n SRGB8: 0x8c41,\n SRGB8_ALPHA8: 0x8c43,\n COMPARE_REF_TO_TEXTURE: 0x884e,\n RGBA32F: 0x8814,\n RGB32F: 0x8815,\n RGBA16F: 0x881a,\n RGB16F: 0x881b,\n TEXTURE_2D_ARRAY: 0x8c1a,\n TEXTURE_BINDING_2D_ARRAY: 0x8c1d,\n R11F_G11F_B10F: 0x8c3a,\n RGB9_E5: 0x8c3d,\n RGBA32UI: 0x8d70,\n RGB32UI: 0x8d71,\n RGBA16UI: 0x8d76,\n RGB16UI: 0x8d77,\n RGBA8UI: 0x8d7c,\n RGB8UI: 0x8d7d,\n RGBA32I: 0x8d82,\n RGB32I: 0x8d83,\n RGBA16I: 0x8d88,\n RGB16I: 0x8d89,\n RGBA8I: 0x8d8e,\n RGB8I: 0x8d8f,\n RED_INTEGER: 0x8d94,\n RGB_INTEGER: 0x8d98,\n RGBA_INTEGER: 0x8d99,\n R8: 0x8229,\n RG8: 0x822b,\n R16F: 0x822d,\n R32F: 0x822e,\n RG16F: 0x822f,\n RG32F: 0x8230,\n R8I: 0x8231,\n R8UI: 0x8232,\n R16I: 0x8233,\n R16UI: 0x8234,\n R32I: 0x8235,\n R32UI: 0x8236,\n RG8I: 0x8237,\n RG8UI: 0x8238,\n RG16I: 0x8239,\n RG16UI: 0x823a,\n RG32I: 0x823b,\n RG32UI: 0x823c,\n R8_SNORM: 0x8f94,\n RG8_SNORM: 0x8f95,\n RGB8_SNORM: 0x8f96,\n RGBA8_SNORM: 0x8f97,\n RGB10_A2UI: 0x906f,\n TEXTURE_IMMUTABLE_FORMAT: 0x912f,\n TEXTURE_IMMUTABLE_LEVELS: 0x82df,\n UNSIGNED_INT_2_10_10_10_REV: 0x8368,\n UNSIGNED_INT_10F_11F_11F_REV: 0x8c3b,\n UNSIGNED_INT_5_9_9_9_REV: 0x8c3e,\n FLOAT_32_UNSIGNED_INT_24_8_REV: 0x8dad,\n UNSIGNED_INT_24_8: 0x84fa,\n HALF_FLOAT: 0x140b,\n RG: 0x8227,\n RG_INTEGER: 0x8228,\n INT_2_10_10_10_REV: 0x8d9f,\n CURRENT_QUERY: 0x8865,\n QUERY_RESULT: 0x8866,\n QUERY_RESULT_AVAILABLE: 0x8867,\n ANY_SAMPLES_PASSED: 0x8c2f,\n ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8d6a,\n MAX_DRAW_BUFFERS: 0x8824,\n DRAW_BUFFER0: 0x8825,\n DRAW_BUFFER1: 0x8826,\n DRAW_BUFFER2: 0x8827,\n DRAW_BUFFER3: 0x8828,\n DRAW_BUFFER4: 0x8829,\n DRAW_BUFFER5: 0x882a,\n DRAW_BUFFER6: 0x882b,\n DRAW_BUFFER7: 0x882c,\n DRAW_BUFFER8: 0x882d,\n DRAW_BUFFER9: 0x882e,\n DRAW_BUFFER10: 0x882f,\n DRAW_BUFFER11: 0x8830,\n DRAW_BUFFER12: 0x8831,\n DRAW_BUFFER13: 0x8832,\n DRAW_BUFFER14: 0x8833,\n DRAW_BUFFER15: 0x8834,\n MAX_COLOR_ATTACHMENTS: 0x8cdf,\n COLOR_ATTACHMENT1: 0x8ce1,\n COLOR_ATTACHMENT2: 0x8ce2,\n COLOR_ATTACHMENT3: 0x8ce3,\n COLOR_ATTACHMENT4: 0x8ce4,\n COLOR_ATTACHMENT5: 0x8ce5,\n COLOR_ATTACHMENT6: 0x8ce6,\n COLOR_ATTACHMENT7: 0x8ce7,\n COLOR_ATTACHMENT8: 0x8ce8,\n COLOR_ATTACHMENT9: 0x8ce9,\n COLOR_ATTACHMENT10: 0x8cea,\n COLOR_ATTACHMENT11: 0x8ceb,\n COLOR_ATTACHMENT12: 0x8cec,\n COLOR_ATTACHMENT13: 0x8ced,\n COLOR_ATTACHMENT14: 0x8cee,\n COLOR_ATTACHMENT15: 0x8cef,\n SAMPLER_3D: 0x8b5f,\n SAMPLER_2D_SHADOW: 0x8b62,\n SAMPLER_2D_ARRAY: 0x8dc1,\n SAMPLER_2D_ARRAY_SHADOW: 0x8dc4,\n SAMPLER_CUBE_SHADOW: 0x8dc5,\n INT_SAMPLER_2D: 0x8dca,\n INT_SAMPLER_3D: 0x8dcb,\n INT_SAMPLER_CUBE: 0x8dcc,\n INT_SAMPLER_2D_ARRAY: 0x8dcf,\n UNSIGNED_INT_SAMPLER_2D: 0x8dd2,\n UNSIGNED_INT_SAMPLER_3D: 0x8dd3,\n UNSIGNED_INT_SAMPLER_CUBE: 0x8dd4,\n UNSIGNED_INT_SAMPLER_2D_ARRAY: 0x8dd7,\n MAX_SAMPLES: 0x8d57,\n SAMPLER_BINDING: 0x8919,\n PIXEL_PACK_BUFFER: 0x88eb,\n PIXEL_UNPACK_BUFFER: 0x88ec,\n PIXEL_PACK_BUFFER_BINDING: 0x88ed,\n PIXEL_UNPACK_BUFFER_BINDING: 0x88ef,\n COPY_READ_BUFFER: 0x8f36,\n COPY_WRITE_BUFFER: 0x8f37,\n COPY_READ_BUFFER_BINDING: 0x8f36,\n COPY_WRITE_BUFFER_BINDING: 0x8f37,\n FLOAT_MAT2x3: 0x8b65,\n FLOAT_MAT2x4: 0x8b66,\n FLOAT_MAT3x2: 0x8b67,\n FLOAT_MAT3x4: 0x8b68,\n FLOAT_MAT4x2: 0x8b69,\n FLOAT_MAT4x3: 0x8b6a,\n UNSIGNED_INT_VEC2: 0x8dc6,\n UNSIGNED_INT_VEC3: 0x8dc7,\n UNSIGNED_INT_VEC4: 0x8dc8,\n UNSIGNED_NORMALIZED: 0x8c17,\n SIGNED_NORMALIZED: 0x8f9c,\n VERTEX_ATTRIB_ARRAY_INTEGER: 0x88fd,\n VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88fe,\n TRANSFORM_FEEDBACK_BUFFER_MODE: 0x8c7f,\n MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 0x8c80,\n TRANSFORM_FEEDBACK_VARYINGS: 0x8c83,\n TRANSFORM_FEEDBACK_BUFFER_START: 0x8c84,\n TRANSFORM_FEEDBACK_BUFFER_SIZE: 0x8c85,\n TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8c88,\n MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 0x8c8a,\n MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 0x8c8b,\n INTERLEAVED_ATTRIBS: 0x8c8c,\n SEPARATE_ATTRIBS: 0x8c8d,\n TRANSFORM_FEEDBACK_BUFFER: 0x8c8e,\n TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8c8f,\n TRANSFORM_FEEDBACK: 0x8e22,\n TRANSFORM_FEEDBACK_PAUSED: 0x8e23,\n TRANSFORM_FEEDBACK_ACTIVE: 0x8e24,\n TRANSFORM_FEEDBACK_BINDING: 0x8e25,\n FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 0x8210,\n FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 0x8211,\n FRAMEBUFFER_ATTACHMENT_RED_SIZE: 0x8212,\n FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 0x8213,\n FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 0x8214,\n FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 0x8215,\n FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 0x8216,\n FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 0x8217,\n FRAMEBUFFER_DEFAULT: 0x8218,\n DEPTH24_STENCIL8: 0x88f0,\n DRAW_FRAMEBUFFER_BINDING: 0x8ca6,\n READ_FRAMEBUFFER_BINDING: 0x8caa,\n RENDERBUFFER_SAMPLES: 0x8cab,\n FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 0x8cd4,\n FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 0x8d56,\n UNIFORM_BUFFER: 0x8a11,\n UNIFORM_BUFFER_BINDING: 0x8a28,\n UNIFORM_BUFFER_START: 0x8a29,\n UNIFORM_BUFFER_SIZE: 0x8a2a,\n MAX_VERTEX_UNIFORM_BLOCKS: 0x8a2b,\n MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8a2d,\n MAX_COMBINED_UNIFORM_BLOCKS: 0x8a2e,\n MAX_UNIFORM_BUFFER_BINDINGS: 0x8a2f,\n MAX_UNIFORM_BLOCK_SIZE: 0x8a30,\n MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 0x8a31,\n MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 0x8a33,\n UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8a34,\n ACTIVE_UNIFORM_BLOCKS: 0x8a36,\n UNIFORM_TYPE: 0x8a37,\n UNIFORM_SIZE: 0x8a38,\n UNIFORM_BLOCK_INDEX: 0x8a3a,\n UNIFORM_OFFSET: 0x8a3b,\n UNIFORM_ARRAY_STRIDE: 0x8a3c,\n UNIFORM_MATRIX_STRIDE: 0x8a3d,\n UNIFORM_IS_ROW_MAJOR: 0x8a3e,\n UNIFORM_BLOCK_BINDING: 0x8a3f,\n UNIFORM_BLOCK_DATA_SIZE: 0x8a40,\n UNIFORM_BLOCK_ACTIVE_UNIFORMS: 0x8a42,\n UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 0x8a43,\n UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 0x8a44,\n UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 0x8a46,\n OBJECT_TYPE: 0x9112,\n SYNC_CONDITION: 0x9113,\n SYNC_STATUS: 0x9114,\n SYNC_FLAGS: 0x9115,\n SYNC_FENCE: 0x9116,\n SYNC_GPU_COMMANDS_COMPLETE: 0x9117,\n UNSIGNALED: 0x9118,\n SIGNALED: 0x9119,\n ALREADY_SIGNALED: 0x911a,\n TIMEOUT_EXPIRED: 0x911b,\n CONDITION_SATISFIED: 0x911c,\n WAIT_FAILED: 0x911d,\n SYNC_FLUSH_COMMANDS_BIT: 0x00000001,\n COLOR: 0x1800,\n DEPTH: 0x1801,\n STENCIL: 0x1802,\n MIN: 0x8007,\n MAX: 0x8008,\n DEPTH_COMPONENT24: 0x81a6,\n STREAM_READ: 0x88e1,\n STREAM_COPY: 0x88e2,\n STATIC_READ: 0x88e5,\n STATIC_COPY: 0x88e6,\n DYNAMIC_READ: 0x88e9,\n DYNAMIC_COPY: 0x88ea,\n DEPTH_COMPONENT32F: 0x8cac,\n DEPTH32F_STENCIL8: 0x8cad,\n INVALID_INDEX: 0xffffffff,\n TIMEOUT_IGNORED: -1,\n MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 0x9247,\n VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0x88fe,\n UNMASKED_VENDOR_WEBGL: 0x9245,\n UNMASKED_RENDERER_WEBGL: 0x9246,\n MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84ff,\n TEXTURE_MAX_ANISOTROPY_EXT: 0x84fe,\n COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83f0,\n COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83f1,\n COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83f2,\n COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83f3,\n COMPRESSED_R11_EAC: 0x9270,\n COMPRESSED_SIGNED_R11_EAC: 0x9271,\n COMPRESSED_RG11_EAC: 0x9272,\n COMPRESSED_SIGNED_RG11_EAC: 0x9273,\n COMPRESSED_RGB8_ETC2: 0x9274,\n COMPRESSED_RGBA8_ETC2_EAC: 0x9275,\n COMPRESSED_SRGB8_ETC2: 0x9276,\n COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 0x9277,\n COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9278,\n COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9279,\n COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 0x8c00,\n COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 0x8c02,\n COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 0x8c01,\n COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 0x8c03,\n COMPRESSED_RGB_ETC1_WEBGL: 0x8d64,\n COMPRESSED_RGB_ATC_WEBGL: 0x8c92,\n COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: 0x8c92,\n COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: 0x87ee,\n UNSIGNED_INT_24_8_WEBGL: 0x84fa,\n HALF_FLOAT_OES: 0x8d61,\n RGBA32F_EXT: 0x8814,\n RGB32F_EXT: 0x8815,\n FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211,\n UNSIGNED_NORMALIZED_EXT: 0x8c17,\n MIN_EXT: 0x8007,\n MAX_EXT: 0x8008,\n SRGB_EXT: 0x8c40,\n SRGB_ALPHA_EXT: 0x8c42,\n SRGB8_ALPHA8_EXT: 0x8c43,\n FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: 0x8210,\n FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 0x8b8b,\n COLOR_ATTACHMENT0_WEBGL: 0x8ce0,\n COLOR_ATTACHMENT1_WEBGL: 0x8ce1,\n COLOR_ATTACHMENT2_WEBGL: 0x8ce2,\n COLOR_ATTACHMENT3_WEBGL: 0x8ce3,\n COLOR_ATTACHMENT4_WEBGL: 0x8ce4,\n COLOR_ATTACHMENT5_WEBGL: 0x8ce5,\n COLOR_ATTACHMENT6_WEBGL: 0x8ce6,\n COLOR_ATTACHMENT7_WEBGL: 0x8ce7,\n COLOR_ATTACHMENT8_WEBGL: 0x8ce8,\n COLOR_ATTACHMENT9_WEBGL: 0x8ce9,\n COLOR_ATTACHMENT10_WEBGL: 0x8cea,\n COLOR_ATTACHMENT11_WEBGL: 0x8ceb,\n COLOR_ATTACHMENT12_WEBGL: 0x8cec,\n COLOR_ATTACHMENT13_WEBGL: 0x8ced,\n COLOR_ATTACHMENT14_WEBGL: 0x8cee,\n COLOR_ATTACHMENT15_WEBGL: 0x8cef,\n DRAW_BUFFER0_WEBGL: 0x8825,\n DRAW_BUFFER1_WEBGL: 0x8826,\n DRAW_BUFFER2_WEBGL: 0x8827,\n DRAW_BUFFER3_WEBGL: 0x8828,\n DRAW_BUFFER4_WEBGL: 0x8829,\n DRAW_BUFFER5_WEBGL: 0x882a,\n DRAW_BUFFER6_WEBGL: 0x882b,\n DRAW_BUFFER7_WEBGL: 0x882c,\n DRAW_BUFFER8_WEBGL: 0x882d,\n DRAW_BUFFER9_WEBGL: 0x882e,\n DRAW_BUFFER10_WEBGL: 0x882f,\n DRAW_BUFFER11_WEBGL: 0x8830,\n DRAW_BUFFER12_WEBGL: 0x8831,\n DRAW_BUFFER13_WEBGL: 0x8832,\n DRAW_BUFFER14_WEBGL: 0x8833,\n DRAW_BUFFER15_WEBGL: 0x8834,\n MAX_COLOR_ATTACHMENTS_WEBGL: 0x8cdf,\n MAX_DRAW_BUFFERS_WEBGL: 0x8824,\n VERTEX_ARRAY_BINDING_OES: 0x85b5,\n QUERY_COUNTER_BITS_EXT: 0x8864,\n CURRENT_QUERY_EXT: 0x8865,\n QUERY_RESULT_EXT: 0x8866,\n QUERY_RESULT_AVAILABLE_EXT: 0x8867,\n TIME_ELAPSED_EXT: 0x88bf,\n TIMESTAMP_EXT: 0x8e28,\n GPU_DISJOINT_EXT: 0x8fbb\n};\n//# sourceMappingURL=index.js.map","import GL from '@luma.gl/constants';\n\nexport const TYPE_ARRAY_MAP = {\n UInt8: Uint8Array,\n UInt16: Uint16Array,\n UInt32: Uint32Array,\n Float32: Float32Array,\n UInt64: Float64Array\n};\n\nexport const GL_TYPE_MAP = {\n UInt8: GL.UNSIGNED_BYTE,\n UInt16: GL.UNSIGNED_INT,\n Float32: GL.FLOAT,\n UInt32: GL.UNSIGNED_INT,\n UInt64: GL.DOUBLE\n};\n\nexport const I3S_NAMED_VERTEX_ATTRIBUTES = {\n position: 'position',\n normal: 'normal',\n uv0: 'uv0',\n color: 'color',\n region: 'region'\n};\n\nexport const I3S_NAMED_GEOMETRY_ATTRIBUTES = {\n vertexAttributes: 'vertexAttributes',\n featureAttributeOrder: 'featureAttributeOrder',\n featureAttributes: 'featureAttributes'\n};\n\nexport const I3S_NAMED_HEADER_ATTRIBUTES = {\n header: 'header',\n vertexCount: 'vertexCount',\n featureCount: 'featureCount'\n};\n\nexport const SIZEOF = {\n UInt8: 1,\n UInt16: 2,\n UInt32: 4,\n Float32: 4,\n UInt64: 8\n};\n\nexport const STRING_ATTRIBUTE_TYPE = 'String';\nexport const OBJECT_ID_ATTRIBUTE_TYPE = 'Oid32';\nexport const FLOAT_64_TYPE = 'Float64';\n","import type {TypedArray} from '@loaders.gl/schema';\nimport {load, parse} from '@loaders.gl/core';\nimport {Vector3, Matrix4} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\n\nimport type {LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';\nimport {ImageLoader} from '@loaders.gl/images';\nimport {DracoLoader} from '@loaders.gl/draco';\nimport {BasisLoader, CompressedTextureLoader} from '@loaders.gl/textures';\n\nimport {Tileset, Tile} from '../../types';\nimport {getUrlWithToken} from '../utils/url-utils';\n\nimport {\n GL_TYPE_MAP,\n TYPE_ARRAY_MAP,\n SIZEOF,\n I3S_NAMED_HEADER_ATTRIBUTES,\n I3S_NAMED_VERTEX_ATTRIBUTES,\n I3S_NAMED_GEOMETRY_ATTRIBUTES\n} from './constants';\n\nconst scratchVector = new Vector3([0, 0, 0]);\n\nconst FORMAT_LOADER_MAP = {\n jpeg: ImageLoader,\n png: ImageLoader,\n 'ktx-etc2': CompressedTextureLoader,\n dds: CompressedTextureLoader,\n ktx2: BasisLoader\n};\n\nconst I3S_ATTRIBUTE_TYPE = 'i3s-attribute-type';\n\nexport async function parseI3STileContent(\n arrayBuffer: ArrayBuffer,\n tile: Tile,\n tileset: Tileset,\n options?: LoaderOptions,\n context?: LoaderContext\n) {\n tile.content = tile.content || {};\n tile.content.featureIds = tile.content.featureIds || null;\n\n // construct featureData from defaultGeometrySchema;\n tile.content.featureData = constructFeatureDataStruct(tile, tileset);\n tile.content.attributes = {};\n\n if (tile.textureUrl) {\n const url = getUrlWithToken(tile.textureUrl, options?.i3s?.token);\n const loader = FORMAT_LOADER_MAP[tile.textureFormat] || ImageLoader;\n // @ts-ignore context must be defined\n const response = await fetch(url);\n const arrayBuffer = await response.arrayBuffer();\n\n if (loader === ImageLoader) {\n const options = {...tile.textureLoaderOptions, image: {type: 'data'}};\n // @ts-ignore context must be defined\n // Image constructor is not supported in worker thread.\n // Do parsing image data on the main thread by using context to avoid worker issues.\n tile.content.texture = await context.parse(arrayBuffer, options);\n } else if (loader === CompressedTextureLoader || loader === BasisLoader) {\n // @ts-ignore context must be defined\n const texture = await load(arrayBuffer, loader, tile.textureLoaderOptions);\n tile.content.texture = {\n compressed: true,\n mipmaps: false,\n width: texture[0].width,\n height: texture[0].height,\n data: texture\n };\n }\n }\n\n tile.content.material = makePbrMaterial(tile.materialDefinition, tile.content.texture);\n if (tile.content.material) {\n tile.content.texture = null;\n }\n\n return await parseI3SNodeGeometry(arrayBuffer, tile, context);\n}\n\n/* eslint-disable max-statements */\nasync function parseI3SNodeGeometry(\n arrayBuffer: ArrayBuffer,\n tile: Tile = {},\n context?: LoaderContext\n) {\n if (!tile.content) {\n return tile;\n }\n\n const content = tile.content;\n let attributes;\n let vertexCount;\n let byteOffset = 0;\n let featureCount = 0;\n\n if (tile.isDracoGeometry) {\n const decompressedGeometry = await parse(arrayBuffer, DracoLoader, {\n draco: {\n attributeNameEntry: I3S_ATTRIBUTE_TYPE\n }\n });\n\n vertexCount = decompressedGeometry.header.vertexCount;\n const indices = decompressedGeometry.indices.value;\n const {\n POSITION,\n NORMAL,\n COLOR_0,\n TEXCOORD_0,\n ['feature-index']: featureIndex,\n ['uv-region']: uvRegion\n } = decompressedGeometry.attributes;\n\n attributes = {\n position: POSITION,\n normal: NORMAL,\n color: COLOR_0,\n uv0: TEXCOORD_0,\n uvRegion,\n id: featureIndex,\n indices\n };\n\n updateAttributesMetadata(attributes, decompressedGeometry);\n\n const featureIds = getFeatureIdsFromFeatureIndexMetadata(featureIndex);\n\n if (featureIds) {\n flattenFeatureIdsByFeatureIndices(attributes, featureIds);\n }\n } else {\n const {vertexAttributes, attributesOrder, featureAttributes, featureAttributeOrder} =\n content.featureData;\n // First 8 bytes reserved for header (vertexCount and featureCount)\n const headers = parseHeaders(content, arrayBuffer);\n byteOffset = headers.byteOffset;\n vertexCount = headers.vertexCount;\n featureCount = headers.featureCount;\n // Getting vertex attributes such as positions, normals, colors, etc...\n const {attributes: normalizedVertexAttributes, byteOffset: offset} = normalizeAttributes(\n arrayBuffer,\n byteOffset,\n vertexAttributes,\n vertexCount,\n attributesOrder\n );\n\n // Getting feature attributes such as featureIds and faceRange\n const {attributes: normalizedFeatureAttributes} = normalizeAttributes(\n arrayBuffer,\n offset,\n featureAttributes,\n featureCount,\n featureAttributeOrder\n );\n\n flattenFeatureIdsByFaceRanges(normalizedFeatureAttributes);\n attributes = concatAttributes(normalizedVertexAttributes, normalizedFeatureAttributes);\n }\n\n const {enuMatrix, cartographicOrigin, cartesianOrigin} = parsePositions(\n attributes.position,\n tile\n );\n\n const matrix = new Matrix4().multiplyRight(enuMatrix);\n\n content.attributes = {\n positions: attributes.position,\n normals: attributes.normal,\n colors: normalizeAttribute(attributes.color), // Normalize from UInt8\n texCoords: attributes.uv0,\n uvRegions: normalizeAttribute(attributes.uvRegion) // Normalize from UInt16\n };\n content.indices = attributes.indices || null;\n\n if (attributes.id && attributes.id.value) {\n tile.content.featureIds = attributes.id.value;\n }\n\n // Remove undefined attributes\n for (const attributeIndex in content.attributes) {\n if (!content.attributes[attributeIndex]) {\n delete content.attributes[attributeIndex];\n }\n }\n\n content.vertexCount = vertexCount;\n content.cartographicCenter = cartographicOrigin;\n content.cartesianOrigin = cartesianOrigin;\n content.modelMatrix = matrix.invert();\n content.byteLength = arrayBuffer.byteLength;\n\n return tile;\n}\n\n/**\n * Update attributes with metadata from decompressed geometry.\n * @param decompressedGeometry\n * @param attributes\n */\nfunction updateAttributesMetadata(attributes, decompressedGeometry) {\n for (const key in decompressedGeometry.loaderData.attributes) {\n const dracoAttribute = decompressedGeometry.loaderData.attributes[key];\n\n switch (dracoAttribute.name) {\n case 'POSITION':\n attributes.position.metadata = dracoAttribute.metadata;\n break;\n case 'feature-index':\n attributes.id.metadata = dracoAttribute.metadata;\n break;\n default:\n break;\n }\n }\n}\n\n/**\n * Do concatenation of attribute objects.\n * Done as separate fucntion to avoid ts errors.\n * @param {Object} normalizedVertexAttributes\n * @param {Object} normalizedFeatureAttributes\n * @returns {object} - result of attributes concatenation.\n */\nfunction concatAttributes(normalizedVertexAttributes, normalizedFeatureAttributes) {\n return {...normalizedVertexAttributes, ...normalizedFeatureAttributes};\n}\n\n/**\n * Normalize attribute to range [0..1] . Eg. convert colors buffer from [255,255,255,255] to [1,1,1,1]\n * @param {Object} attribute - geometry attribute\n * @returns {Object} - geometry attribute in right format\n */\nfunction normalizeAttribute(attribute) {\n if (!attribute) {\n return attribute;\n }\n attribute.normalized = true;\n return attribute;\n}\n\nfunction constructFeatureDataStruct(tile, tileset) {\n // seed featureData from defaultGeometrySchema\n const defaultGeometrySchema = tileset.store.defaultGeometrySchema;\n const featureData = defaultGeometrySchema;\n // populate the vertex attributes value types and values per element\n for (const geometryAttribute in I3S_NAMED_GEOMETRY_ATTRIBUTES) {\n for (const namedAttribute in I3S_NAMED_VERTEX_ATTRIBUTES) {\n const attribute = defaultGeometrySchema[geometryAttribute][namedAttribute];\n if (attribute) {\n const {byteOffset = 0, count = 0, valueType, valuesPerElement} = attribute;\n\n featureData[geometryAttribute][namedAttribute] = {\n valueType,\n valuesPerElement,\n byteOffset,\n count\n };\n }\n }\n }\n\n featureData.attributesOrder = defaultGeometrySchema.ordering;\n return featureData;\n}\n\nfunction parseHeaders(content, buffer) {\n let byteOffset = 0;\n // First 8 bytes reserved for header (vertexCount and featurecount)\n let vertexCount = 0;\n let featureCount = 0;\n const headers = content.featureData[I3S_NAMED_HEADER_ATTRIBUTES.header];\n for (const header in headers) {\n const {property, type} = headers[header];\n const TypedArrayTypeHeader = TYPE_ARRAY_MAP[type];\n if (property === I3S_NAMED_HEADER_ATTRIBUTES.vertexCount) {\n vertexCount = new TypedArrayTypeHeader(buffer, 0, 4)[0];\n byteOffset += SIZEOF[type];\n }\n if (property === I3S_NAMED_HEADER_ATTRIBUTES.featureCount) {\n featureCount = new TypedArrayTypeHeader(buffer, 4, 4)[0];\n byteOffset += SIZEOF[type];\n }\n }\n return {\n vertexCount,\n featureCount,\n byteOffset\n };\n}\n\n/* eslint-enable max-statements */\n\nfunction normalizeAttributes(\n arrayBuffer,\n byteOffset,\n vertexAttributes,\n vertexCount,\n attributesOrder\n) {\n const attributes = {};\n\n // the order of attributes depend on the order being added to the vertexAttributes object\n for (const attribute of attributesOrder) {\n if (vertexAttributes[attribute]) {\n const {valueType, valuesPerElement} = vertexAttributes[attribute];\n // update count and byteOffset count by calculating from defaultGeometrySchema + binnary content\n const count = vertexCount;\n // protect from arrayBuffer read overunns by NOT assuming node has regions always even though its declared in defaultGeometrySchema.\n // In i3s 1.6: client is required to decide that based on ./shared resource of the node (materialDefinitions.[Mat_id].params.vertexRegions == true)\n // In i3s 1.7 the property has been rolled into the 3d scene layer json/node pages.\n // Code below does not account when the bytelength is actually bigger than\n // the calculated value (b\\c the tile potentially could have mesh segmentation information).\n // In those cases tiles without regions could fail or have garbage values.\n if (byteOffset + count * valuesPerElement > arrayBuffer.byteLength) {\n break;\n }\n const buffer = arrayBuffer.slice(byteOffset);\n let value: number[] | TypedArray = [];\n\n if (valueType === 'UInt64') {\n value = parseUint64Values(buffer, count * valuesPerElement, SIZEOF[valueType]);\n } else {\n const TypedArrayType = TYPE_ARRAY_MAP[valueType];\n value = new TypedArrayType(buffer, 0, count * valuesPerElement);\n }\n\n attributes[attribute] = {\n value,\n type: GL_TYPE_MAP[valueType],\n size: valuesPerElement\n };\n\n switch (attribute) {\n case 'color':\n // @ts-ignore\n attributes.color.normalized = true;\n break;\n case 'position':\n case 'region':\n case 'normal':\n default:\n }\n\n byteOffset = byteOffset + count * valuesPerElement * SIZEOF[valueType];\n }\n }\n\n return {attributes, byteOffset};\n}\n\n/**\n * Parse buffer to return array of uint64 values\n *\n * @param buffer\n * @param elementsCount\n * @returns 64-bit array of values until precision is lost after Number.MAX_SAFE_INTEGER\n */\nfunction parseUint64Values(\n buffer: ArrayBuffer,\n elementsCount: number,\n attributeSize: number\n): number[] {\n const values: number[] = [];\n const dataView = new DataView(buffer);\n let offset = 0;\n\n for (let index = 0; index < elementsCount; index++) {\n // split 64-bit number into two 32-bit parts\n const left = dataView.getUint32(offset, true);\n const right = dataView.getUint32(offset + 4, true);\n // combine the two 32-bit values\n const value = left + 2 ** 32 * right;\n\n values.push(value);\n offset += attributeSize;\n }\n\n return values;\n}\n\nfunction parsePositions(attribute, tile) {\n const mbs = tile.mbs;\n const value = attribute.value;\n const metadata = attribute.metadata;\n const enuMatrix = new Matrix4();\n const cartographicOrigin = new Vector3(mbs[0], mbs[1], mbs[2]);\n const cartesianOrigin = new Vector3();\n Ellipsoid.WGS84.cartographicToCartesian(cartographicOrigin, cartesianOrigin);\n Ellipsoid.WGS84.eastNorthUpToFixedFrame(cartesianOrigin, enuMatrix);\n attribute.value = offsetsToCartesians(value, metadata, cartographicOrigin);\n\n return {\n enuMatrix,\n fixedFrameToENUMatrix: enuMatrix.invert(),\n cartographicOrigin,\n cartesianOrigin\n };\n}\n\n/**\n * Converts position coordinates to absolute cartesian coordinates\n * @param {Float32Array} vertices - \"position\" attribute data\n * @param {Object} metadata - When the geometry is DRACO compressed, contain position attribute's metadata\n * https://github.com/Esri/i3s-spec/blob/master/docs/1.7/compressedAttributes.cmn.md\n * @param {Vector3} cartographicOrigin - Cartographic origin coordinates\n * @returns {Float64Array} - converted \"position\" data\n */\nfunction offsetsToCartesians(vertices, metadata = {}, cartographicOrigin) {\n const positions = new Float64Array(vertices.length);\n const scaleX = (metadata['i3s-scale_x'] && metadata['i3s-scale_x'].double) || 1;\n const scaleY = (metadata['i3s-scale_y'] && metadata['i3s-scale_y'].double) || 1;\n for (let i = 0; i < positions.length; i += 3) {\n positions[i] = vertices[i] * scaleX + cartographicOrigin.x;\n positions[i + 1] = vertices[i + 1] * scaleY + cartographicOrigin.y;\n positions[i + 2] = vertices[i + 2] + cartographicOrigin.z;\n }\n\n for (let i = 0; i < positions.length; i += 3) {\n // @ts-ignore\n Ellipsoid.WGS84.cartographicToCartesian(positions.subarray(i, i + 3), scratchVector);\n positions[i] = scratchVector.x;\n positions[i + 1] = scratchVector.y;\n positions[i + 2] = scratchVector.z;\n }\n\n return positions;\n}\n\n/**\n * Makes a glTF-compatible PBR material from an I3S material definition\n * @param {object} materialDefinition - i3s material definition\n * https://github.com/Esri/i3s-spec/blob/master/docs/1.7/materialDefinitions.cmn.md\n * @param {object} texture - texture image\n * @returns {object}\n */\nfunction makePbrMaterial(materialDefinition, texture) {\n let pbrMaterial;\n if (materialDefinition) {\n pbrMaterial = {\n ...materialDefinition,\n pbrMetallicRoughness: materialDefinition.pbrMetallicRoughness\n ? {...materialDefinition.pbrMetallicRoughness}\n : {baseColorFactor: [255, 255, 255, 255]}\n };\n } else {\n pbrMaterial = {\n pbrMetallicRoughness: {}\n };\n if (texture) {\n pbrMaterial.pbrMetallicRoughness.baseColorTexture = {texCoord: 0};\n } else {\n pbrMaterial.pbrMetallicRoughness.baseColorFactor = [255, 255, 255, 255];\n }\n }\n\n // Set default 0.25 per spec https://github.com/Esri/i3s-spec/blob/master/docs/1.7/materialDefinitions.cmn.md\n pbrMaterial.alphaCutoff = pbrMaterial.alphaCutoff || 0.25;\n\n if (pbrMaterial.alphaMode) {\n // I3S contain alphaMode in lowerCase\n pbrMaterial.alphaMode = pbrMaterial.alphaMode.toUpperCase();\n }\n\n // Convert colors from [255,255,255,255] to [1,1,1,1]\n if (pbrMaterial.emissiveFactor) {\n pbrMaterial.emissiveFactor = convertColorFormat(pbrMaterial.emissiveFactor);\n }\n if (pbrMaterial.pbrMetallicRoughness && pbrMaterial.pbrMetallicRoughness.baseColorFactor) {\n pbrMaterial.pbrMetallicRoughness.baseColorFactor = convertColorFormat(\n pbrMaterial.pbrMetallicRoughness.baseColorFactor\n );\n }\n\n setMaterialTexture(pbrMaterial, texture);\n\n return pbrMaterial;\n}\n\n/**\n * Convert color from [255,255,255,255] to [1,1,1,1]\n * @param {Array} colorFactor - color array\n * @returns {Array} - new color array\n */\nfunction convertColorFormat(colorFactor) {\n const normalizedColor = [...colorFactor];\n for (let index = 0; index < colorFactor.length; index++) {\n normalizedColor[index] = colorFactor[index] / 255;\n }\n return normalizedColor;\n}\n\n/**\n * Set texture in PBR material\n * @param {object} material - i3s material definition\n * @param {object} image - texture image\n * @returns {void}\n */\nfunction setMaterialTexture(material, image) {\n const texture = {source: {image}};\n // I3SLoader now support loading only one texture. This elseif sequence will assign this texture to one of\n // properties defined in materialDefinition\n if (material.pbrMetallicRoughness && material.pbrMetallicRoughness.baseColorTexture) {\n material.pbrMetallicRoughness.baseColorTexture = {\n ...material.pbrMetallicRoughness.baseColorTexture,\n texture\n };\n } else if (material.emissiveTexture) {\n material.emissiveTexture = {...material.emissiveTexture, texture};\n } else if (\n material.pbrMetallicRoughness &&\n material.pbrMetallicRoughness.metallicRoughnessTexture\n ) {\n material.pbrMetallicRoughness.metallicRoughnessTexture = {\n ...material.pbrMetallicRoughness.metallicRoughnessTexture,\n texture\n };\n } else if (material.normalTexture) {\n material.normalTexture = {...material.normalTexture, texture};\n } else if (material.occlusionTexture) {\n material.occlusionTexture = {...material.occlusionTexture, texture};\n }\n}\n\n/**\n * Flatten feature ids using face ranges\n * @param {object} normalizedFeatureAttributes\n * @returns {void}\n */\nfunction flattenFeatureIdsByFaceRanges(normalizedFeatureAttributes) {\n const {id, faceRange} = normalizedFeatureAttributes;\n\n if (!id || !faceRange) {\n return;\n }\n\n const featureIds = id.value;\n const range = faceRange.value;\n const featureIdsLength = range[range.length - 1] + 1;\n const orderedFeatureIndices = new Uint32Array(featureIdsLength * 3);\n\n let featureIndex = 0;\n let startIndex = 0;\n\n for (let index = 1; index < range.length; index += 2) {\n const fillId = Number(featureIds[featureIndex]);\n const endValue = range[index];\n const prevValue = range[index - 1];\n const trianglesCount = endValue - prevValue + 1;\n const endIndex = startIndex + trianglesCount * 3;\n\n orderedFeatureIndices.fill(fillId, startIndex, endIndex);\n\n featureIndex++;\n startIndex = endIndex;\n }\n\n normalizedFeatureAttributes.id.value = orderedFeatureIndices;\n}\n\n/**\n * Flatten feature ids using featureIndices\n * @param {object} attributes\n * @param {any} featureIds\n * @returns {void}\n */\nfunction flattenFeatureIdsByFeatureIndices(attributes, featureIds) {\n const featureIndices = attributes.id.value;\n const result = new Float32Array(featureIndices.length);\n\n for (let index = 0; index < featureIndices.length; index++) {\n result[index] = featureIds[featureIndices[index]];\n }\n\n attributes.id.value = result;\n}\n\n/**\n * Flatten feature ids using featureIndices\n * @param {object} featureIndex\n * @returns {Int32Array}\n */\nfunction getFeatureIdsFromFeatureIndexMetadata(featureIndex) {\n return (\n featureIndex &&\n featureIndex.metadata &&\n featureIndex.metadata['i3s-feature-ids'] &&\n featureIndex.metadata['i3s-feature-ids'].intArray\n );\n}\n","import type {LoaderWithParser, LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';\nimport {parseI3STileContent} from './lib/parsers/parse-i3s-tile-content';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\n\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'beta';\n/**\n * Loader for I3S - Indexed 3D Scene Layer\n */\nexport const I3SContentLoader: LoaderWithParser = {\n name: 'I3S Content (Indexed Scene Layers)',\n id: 'i3s-content',\n module: 'i3s',\n worker: true,\n version: VERSION,\n mimeTypes: ['application/octet-stream'],\n parse,\n extensions: ['bin'],\n options: {\n 'i3s-content': {}\n }\n};\n\nasync function parse(data, options?: LoaderOptions, context?: LoaderContext) {\n const {tile, tileset} = options?.i3s || {};\n await parseI3STileContent(data, tile, tileset, options, context);\n return tile.content;\n}\n"],"sourceRoot":""}
|