@carto/api-client 0.5.20 → 0.5.21

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/thenby/thenBy.module.js","../src/client.ts","../src/constants.ts","../src/utils/makeIntervalComplete.ts","../src/filters/FilterTypes.ts","../src/filters/Filter.ts","../node_modules/robust-predicates/esm/util.js","../node_modules/robust-predicates/esm/orient2d.js","../node_modules/robust-predicates/esm/orient3d.js","../node_modules/robust-predicates/esm/incircle.js","../node_modules/robust-predicates/esm/insphere.js","../node_modules/point-in-polygon-hao/dist/esm/index.js","../node_modules/@turf/helpers/index.ts","../node_modules/@turf/invariant/index.ts","../node_modules/@turf/boolean-point-in-polygon/index.ts","../node_modules/sweepline-intersections/dist/sweeplineIntersections.esm.js","../node_modules/@turf/line-intersect/index.ts","../node_modules/@turf/line-intersect/lib/sweepline-intersections-export.ts","../node_modules/@turf/meta/index.js","../node_modules/@turf/polygon-to-line/index.ts","../node_modules/@turf/boolean-disjoint/index.ts","../node_modules/@turf/boolean-intersects/index.ts","../src/filters/geosjonFeatures.ts","../node_modules/@math.gl/core/src/lib/common.ts","../node_modules/@math.gl/web-mercator/src/assert.ts","../node_modules/@math.gl/web-mercator/src/web-mercator-utils.ts","../node_modules/@math.gl/web-mercator/src/get-bounds.ts","../src/utils/transformTileCoordsToWGS84.ts","../node_modules/@turf/bbox-polygon/index.ts","../node_modules/@turf/bbox/index.ts","../node_modules/@turf/boolean-point-on-line/index.ts","../node_modules/@turf/boolean-within/index.ts","../node_modules/bignumber.js/bignumber.mjs","../node_modules/splaytree-ts/src/index.ts","../node_modules/polyclip-ts/src/geom-in.ts","../node_modules/polyclip-ts/src/constant.ts","../node_modules/polyclip-ts/src/compare.ts","../node_modules/polyclip-ts/src/orient.ts","../node_modules/polyclip-ts/src/snap.ts","../node_modules/polyclip-ts/src/identity.ts","../node_modules/polyclip-ts/src/precision.ts","../node_modules/polyclip-ts/src/bbox.ts","../node_modules/polyclip-ts/src/operation.ts","../node_modules/polyclip-ts/src/vector.ts","../node_modules/polyclip-ts/src/sweep-event.ts","../node_modules/polyclip-ts/src/geom-out.ts","../node_modules/polyclip-ts/src/sweep-line.ts","../node_modules/polyclip-ts/src/segment.ts","../node_modules/polyclip-ts/src/index.ts","../node_modules/@turf/intersect/index.ts","../src/utils/transformToTileCoords.ts","../src/filters/tileIntersection.ts","../node_modules/@turf/bbox-clip/index.ts","../node_modules/@turf/bbox-clip/lib/lineclip.ts","../src/filters/tileFeaturesGeometries.ts","../src/filters/tileFeaturesSpatialIndex.ts","../src/constants-internal.ts","../src/filters/tileFeaturesRaster.ts","../src/types.ts","../src/utils.ts","../src/filters/tileFeatures.ts","../src/deck/get-data-filter-extension-props.ts","../src/api/carto-api-error.ts","../src/api/endpoints.ts","../src/api/request-with-parameters.ts","../src/sources/base-source.ts","../src/sources/boundary-query-source.ts","../src/sources/boundary-table-source.ts","../src/widget-sources/widget-source.ts","../src/models/common.ts","../src/models/model.ts","../src/filters.ts","../src/widget-sources/constants.ts","../src/widget-sources/widget-remote-source.ts","../src/widget-sources/widget-query-source.ts","../src/operations/aggregation.ts","../src/operations/applySorting.ts","../src/operations/groupBy.ts","../src/utils/dateUtils.ts","../src/operations/groupByDate.ts","../src/operations/histogram.ts","../src/operations/scatterPlot.ts","../node_modules/geojson-equality-ts/index.ts","../node_modules/@turf/clean-coords/index.ts","../node_modules/@turf/boolean-equal/index.ts","../src/widget-sources/widget-tileset-source-impl.ts","../src/widget-sources/widget-tileset-source.ts","../src/widget-sources/widget-raster-source.ts","../src/widget-sources/widget-table-source.ts","../src/sources/h3-query-source.ts","../src/sources/h3-table-source.ts","../src/utils/getTileFormat.ts","../src/sources/h3-tileset-source.ts","../src/sources/quadbin-query-source.ts","../src/sources/quadbin-table-source.ts","../src/sources/quadbin-tileset-source.ts","../src/sources/raster-source.ts","../src/sources/trajectory-query-source.ts","../src/sources/trajectory-table-source.ts","../src/sources/vector-query-source.ts","../src/sources/vector-table-source.ts","../src/sources/vector-tileset-source.ts","../src/sources/constants.ts","../src/sources/index.ts","../src/api/query.ts","../src/fetch-map/basemap-styles.ts","../src/fetch-map/vec-expr-evaluator.ts","../node_modules/d3-array/src/ascending.js","../node_modules/d3-array/src/extent.js","../node_modules/internmap/src/index.js","../node_modules/d3-array/src/identity.js","../node_modules/d3-array/src/group.js","../node_modules/d3-array/src/permute.js","../node_modules/d3-array/src/sort.js","../node_modules/d3-array/src/groupSort.js","../node_modules/d3-color/src/define.js","../node_modules/d3-color/src/color.js","../src/fetch-map/layer-map.ts","../src/fetch-map/utils.ts","../src/fetch-map/raster-layer.ts","../src/fetch-map/parse-map.ts","../src/fetch-map/basemap.ts","../src/fetch-map/source.ts","../src/fetch-map/fetch-map.ts","../node_modules/@turf/union/index.ts","../src/geo.ts","../src/spatial-index.ts","../src/utils/CellSet.ts"],"sourcesContent":["/***\n Copyright 2013 Teun Duynstee\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nmodule.exports = (function() {\n\n function identity(v){return v;}\n\n function ignoreCase(v){return typeof(v)===\"string\" ? v.toLowerCase() : v;}\n\n function makeCompareFunction(f, opt){\n opt = typeof(opt)===\"object\" ? opt : {direction:opt};\n \n if(typeof(f)!=\"function\"){\n var prop = f;\n // make unary function\n f = function(v1){return !!v1[prop] ? v1[prop] : \"\";}\n }\n if(f.length === 1) {\n // f is a unary function mapping a single item to its sort score\n var uf = f;\n var preprocess = opt.ignoreCase?ignoreCase:identity;\n var cmp = opt.cmp || function(v1,v2) {return v1 < v2 ? -1 : v1 > v2 ? 1 : 0;}\n f = function(v1,v2) {return cmp(preprocess(uf(v1)), preprocess(uf(v2)));}\n }\n const descTokens = {\"-1\":'', desc:''};\n if(opt.direction in descTokens) return function(v1,v2){return -f(v1,v2)};\n return f;\n }\n\n /* adds a secondary compare function to the target function (`this` context)\n which is applied in case the first one returns 0 (equal)\n returns a new compare function, which has a `thenBy` method as well */\n function tb(func, opt) {\n /* should get value false for the first call. This can be done by calling the \n exported function, or the firstBy property on it (for es6 module compatibility)\n */\n var x = (typeof(this) == \"function\" && !this.firstBy) ? this : false;\n var y = makeCompareFunction(func, opt);\n var f = x ? function(a, b) {\n return x(a,b) || y(a,b);\n }\n : y;\n f.thenBy = tb;\n return f;\n }\n tb.firstBy = tb;\n return tb;\n})();\n","/**\n * @internal\n * @privateRemarks Source: @carto/react-core, @carto/constants, @deck.gl/carto\n */\nlet client = 'deck-gl-carto';\n\n/**\n * Returns current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function getClient() {\n return client;\n}\n\n/**\n * Sets current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function setClient(c: string) {\n client = c;\n}\n","/**\n * Defines a comparator used when matching a column's values against given filter values.\n *\n * Example:\n *\n * ```javascript\n * import { FilterType } from '@carto/api-client';\n * const filters = {\n * column_name: { [FilterType.IN]: { values: ['a', 'b', 'c'] } }\n * };\n * ```\n *\n * @privateRemarks Source: @carto/react-api, @deck.gl/carto\n */\nexport enum FilterType {\n IN = 'in',\n /** [a, b] both are included. */\n BETWEEN = 'between',\n /** [a, b) a is included, b is not. */\n CLOSED_OPEN = 'closed_open',\n TIME = 'time',\n STRING_SEARCH = 'stringSearch',\n}\n\n/** @privateRemarks Source: @carto/constants */\nexport enum ApiVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n}\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_API_BASE_URL = 'https://gcp-us-east1.api.carto.com';\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum TileFormat {\n MVT = 'mvt',\n JSON = 'json',\n GEOJSON = 'geojson',\n BINARY = 'binary',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum SpatialIndex {\n H3 = 'h3',\n QUADBIN = 'quadbin',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum Provider {\n BIGQUERY = 'bigquery',\n REDSHIFT = 'redshift',\n POSTGRES = 'postgres',\n SNOWFLAKE = 'snowflake',\n DATABRICKS = 'databricks',\n DATABRICKS_REST = 'databricksRest',\n}\n\nexport const SpatialIndexColumn = Object.freeze({\n [SpatialIndex.H3]: ['h3', 'hex', 'h3id', 'hex_id', 'h3hex'],\n [SpatialIndex.QUADBIN]: ['quadbin'],\n});\n\n/**\n * Enum like container for all types of aggregations available for widgets.\n */\nexport const AggregationTypes = {\n Count: 'count' as const,\n Avg: 'avg' as const,\n Min: 'min' as const,\n Max: 'max' as const,\n Sum: 'sum' as const,\n Custom: 'custom' as const,\n} as const;\n","import type {FilterInterval, FilterIntervalComplete} from '../types.js';\n\nexport function makeIntervalComplete(\n intervals: FilterInterval[]\n): FilterIntervalComplete[] {\n return intervals.map((val) => {\n if (val[0] === undefined || val[0] === null) {\n return [Number.MIN_SAFE_INTEGER, val[1]];\n }\n\n if (val[1] === undefined || val[1] === null) {\n return [val[0], Number.MAX_SAFE_INTEGER];\n }\n\n return val;\n }) as FilterIntervalComplete[];\n}\n","import {FilterType} from '../constants.js';\nimport type {FilterInterval, StringSearchOptions} from '../types.js';\nimport {makeIntervalComplete} from '../utils/makeIntervalComplete.js';\n\nexport type FilterFunction = (\n filterValues: unknown[],\n featureValue: unknown,\n params?: Record<string, unknown>\n) => boolean;\n\nexport const filterFunctions: Record<FilterType, FilterFunction> = {\n [FilterType.IN]: filterIn,\n [FilterType.BETWEEN]: filterBetween,\n [FilterType.TIME]: filterTime,\n [FilterType.CLOSED_OPEN]: filterClosedOpen,\n [FilterType.STRING_SEARCH]: filterStringSearch,\n};\n\nfunction filterIn(filterValues: unknown[], featureValue: unknown): boolean {\n return filterValues.includes(featureValue);\n}\n\n// FilterTypes.BETWEEN\nfunction filterBetween(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) <= upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as FilterInterval[]).some(\n checkRange\n );\n}\n\nfunction filterTime(filterValues: unknown[], featureValue: unknown) {\n const featureValueAsTimestamp = new Date(featureValue as number).getTime();\n if (isFinite(featureValueAsTimestamp)) {\n return filterBetween(filterValues, featureValueAsTimestamp);\n } else {\n throw new Error(`Column used to filter by time isn't well formatted.`);\n }\n}\n\n// FilterTypes.CLOSED_OPEN\nfunction filterClosedOpen(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) < upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as [number, number][]).some(\n checkRange\n );\n}\n\n// FilterTypes.STRING_SEARCH\nfunction filterStringSearch(\n filterValues: unknown[],\n featureValue: unknown,\n params: StringSearchOptions = {}\n): boolean {\n const normalizedFeatureValue = normalize(featureValue, params);\n const stringRegExp = params.useRegExp\n ? filterValues\n : filterValues.map((filterValue) => {\n let stringRegExp = escapeRegExp(normalize(filterValue, params));\n\n if (params.mustStart) stringRegExp = `^${stringRegExp}`;\n if (params.mustEnd) stringRegExp = `${stringRegExp}$`;\n\n return stringRegExp;\n });\n\n const regex = new RegExp(\n stringRegExp.join('|'),\n params.caseSensitive ? 'g' : 'gi'\n );\n return !!normalizedFeatureValue.match(regex);\n}\n\n// Aux\nconst specialCharRegExp = /[.*+?^${}()|[\\]\\\\]/g;\nconst normalizeRegExp = /\\p{Diacritic}/gu;\n\nfunction escapeRegExp(value: string) {\n return value.replace(specialCharRegExp, '\\\\$&');\n}\n\nfunction normalize(data: unknown, params: StringSearchOptions) {\n let normalizedData = String(data);\n if (!params.keepSpecialCharacters)\n normalizedData = normalizedData\n .normalize('NFD')\n .replace(normalizeRegExp, '');\n\n return normalizedData;\n}\n","import {filterFunctions} from './FilterTypes.js';\nimport type {Filter, FilterLogicalOperator, Filters} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {FilterType} from '../constants.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {BinaryFeature} from '@loaders.gl/schema';\n\nconst LOGICAL_OPERATOR_METHODS: Record<\n FilterLogicalOperator,\n 'every' | 'some'\n> = {\n and: 'every',\n or: 'some',\n};\n\nfunction passesFilter(\n columns: string[],\n filters: Filters,\n feature: FeatureData,\n filtersLogicalOperator: FilterLogicalOperator\n): boolean {\n const method = LOGICAL_OPERATOR_METHODS[filtersLogicalOperator];\n return columns[method]((column) => {\n const columnFilters = filters[column];\n const columnFilterTypes = Object.keys(columnFilters) as FilterType[];\n\n if (!feature || feature[column] === null || feature[column] === undefined) {\n return false;\n }\n\n return columnFilterTypes.every((filter) => {\n const filterFunction = filterFunctions[filter];\n\n if (!filterFunction) {\n throw new Error(`\"${filter}\" filter is not implemented.`);\n }\n\n return filterFunction(\n columnFilters[filter]!.values,\n feature[column],\n (columnFilters[filter] as Filter[FilterType.STRING_SEARCH])!.params\n );\n });\n });\n}\n\n/**\n * @internal\n * @privateRemarks Exported for use in @deck.gl/carto's getDataFilterExtensionProps.\n */\nexport function _buildFeatureFilter({\n filters = {},\n type = 'boolean',\n filtersLogicalOperator = 'and',\n}: {\n filters?: Filters;\n type?: 'number' | 'boolean';\n filtersLogicalOperator?: FilterLogicalOperator;\n}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => (type === 'number' ? 1 : true);\n }\n\n return (feature: Feature | FeatureData) => {\n const f = feature.properties || feature;\n const featurePassesFilter = passesFilter(\n columns,\n filters,\n f as FeatureData,\n filtersLogicalOperator\n );\n\n return type === 'number'\n ? Number(featurePassesFilter)\n : featurePassesFilter;\n };\n}\n\n/**\n * Apply certain filters to a collection of features.\n * @internal\n */\nexport function applyFilters(\n features: FeatureData[],\n filters: Filters,\n filtersLogicalOperator: FilterLogicalOperator\n) {\n return Object.keys(filters).length\n ? features.filter(_buildFeatureFilter({filters, filtersLogicalOperator}))\n : features;\n}\n\n/**\n * Binary.\n * @internal\n */\nexport function buildBinaryFeatureFilter({filters = {}}: {filters: Filters}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => 1;\n }\n\n return (featureIdIdx: number, binaryData: BinaryFeature) =>\n passesFilterUsingBinary(columns, filters, featureIdIdx, binaryData);\n}\n\nfunction getValueFromNumericProps(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n return binaryData.numericProps?.[column]?.value[featureIdIdx];\n}\n\nfunction getValueFromProperties(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n const propertyIdx = binaryData.featureIds.value[featureIdIdx];\n return (binaryData.properties[propertyIdx] as Record<string, unknown>)?.[\n column\n ];\n}\n\nconst GET_VALUE_BY_BINARY_PROP = {\n properties: getValueFromProperties,\n numericProps: getValueFromNumericProps,\n};\n\nfunction getBinaryPropertyByFilterValues(filterValues: unknown[]) {\n return typeof filterValues.flat()[0] === 'string'\n ? 'properties'\n : 'numericProps';\n}\n\nfunction getFeatureValue(\n featureIdIdx: number,\n binaryData: any,\n filter: {type: FilterType; column: string; values: unknown[]}\n) {\n const {column, values} = filter;\n const binaryProp = getBinaryPropertyByFilterValues(values);\n const getFeatureValueFn = GET_VALUE_BY_BINARY_PROP[binaryProp];\n return getFeatureValueFn(featureIdIdx, binaryData, {column});\n}\n\nfunction passesFilterUsingBinary(\n columns: string[],\n filters: Filters,\n featureIdIdx: number,\n binaryData: BinaryFeature\n) {\n return columns.every((column) => {\n const columnFilters = filters[column];\n\n return Object.entries(columnFilters).every(([type, {values}]) => {\n const filterFn = filterFunctions[type as FilterType];\n if (!filterFn) {\n throw new Error(`\"${type}\" filter is not implemented.`);\n }\n\n if (!values) return 0;\n\n const featureValue = getFeatureValue(featureIdIdx, binaryData, {\n type: type as FilterType,\n column,\n values,\n });\n\n if (featureValue === undefined || featureValue === null) return 0;\n\n return filterFn(values, featureValue);\n });\n });\n}\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(8);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n } else {\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n } else {\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n } else {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n }\n }\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {\n const aex = pax - pex;\n const bex = pbx - pex;\n const cex = pcx - pex;\n const dex = pdx - pex;\n const aey = pay - pey;\n const bey = pby - pey;\n const cey = pcy - pey;\n const dey = pdy - pey;\n const aez = paz - pez;\n const bez = pbz - pez;\n const cez = pcz - pez;\n const dez = pdz - pez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import { orient2d } from 'robust-predicates';\n\nfunction pointInPolygon(p, polygon) {\n var i;\n var ii;\n var k = 0;\n var f;\n var u1;\n var v1;\n var u2;\n var v2;\n var currentP;\n var nextP;\n\n var x = p[0];\n var y = p[1];\n\n var numContours = polygon.length;\n for (i = 0; i < numContours; i++) {\n ii = 0;\n var contour = polygon[i];\n var contourLen = contour.length - 1;\n\n currentP = contour[0];\n if (currentP[0] !== contour[contourLen][0] &&\n currentP[1] !== contour[contourLen][1]) {\n throw new Error('First and last coordinates in a ring must be the same')\n }\n\n u1 = currentP[0] - x;\n v1 = currentP[1] - y;\n\n for (ii; ii < contourLen; ii++) {\n nextP = contour[ii + 1];\n\n u2 = nextP[0] - x;\n v2 = nextP[1] - y;\n\n if (v1 === 0 && v2 === 0) {\n if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }\n } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {\n f = orient2d(u1, u2, v1, v2, 0, 0);\n if (f === 0) { return 0 }\n if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }\n }\n currentP = nextP;\n v1 = v2;\n u1 = u2;\n }\n }\n\n if (k % 2 === 0) { return false }\n return true\n}\n\nexport { pointInPolygon as default };\n","import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in kilometers. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n","import {\n Feature,\n FeatureCollection,\n Geometry,\n LineString,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { isNumber } from \"@turf/helpers\";\n\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @function\n * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nfunction getCoord(coord: Feature<Point> | Point | number[]): number[] {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n\n if (!Array.isArray(coord)) {\n if (\n coord.type === \"Feature\" &&\n coord.geometry !== null &&\n coord.geometry.type === \"Point\"\n ) {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (\n Array.isArray(coord) &&\n coord.length >= 2 &&\n !Array.isArray(coord[0]) &&\n !Array.isArray(coord[1])\n ) {\n return [...coord];\n }\n\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\n\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array\n *\n * @function\n * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array\n * @returns {Array<any>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coords = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nfunction getCoords<\n G extends\n | Point\n | LineString\n | Polygon\n | MultiPoint\n | MultiLineString\n | MultiPolygon,\n>(coords: any[] | Feature<G> | G): any[] {\n if (Array.isArray(coords)) {\n return coords;\n }\n\n // Feature\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n // Geometry\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\n\n/**\n * Checks if coordinates contains a number\n *\n * @function\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nfunction containsNumber(coordinates: any[]): boolean {\n if (\n coordinates.length > 1 &&\n isNumber(coordinates[0]) &&\n isNumber(coordinates[1])\n ) {\n return true;\n }\n\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\n\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @function\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction geojsonType(value: any, type: string, name: string): void {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n value.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nfunction featureOf(feature: Feature<any>, type: string, name: string): void {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction collectionOf(\n featureCollection: FeatureCollection<any>,\n type: string,\n name: string\n) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n }\n}\n\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nfunction getGeom<G extends Geometry>(geojson: Feature<G> | G): G {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\n\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name=\"geojson\"] name of the variable to display in error message (unused)\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nfunction getType(\n geojson: Feature<any> | FeatureCollection<any> | Geometry,\n _name?: string\n): string {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\n\nexport {\n getCoord,\n getCoords,\n containsNumber,\n geojsonType,\n featureOf,\n collectionOf,\n getGeom,\n getType,\n};\n// No default export!\n","import pip from \"point-in-polygon-hao\";\nimport {\n BBox,\n Feature,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getGeom } from \"@turf/invariant\";\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point\n * resides inside the polygon. The polygon can be convex or concave. The function accounts for holes.\n *\n * @function\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if\n * the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n * [-81, 41],\n * [-81, 47],\n * [-72, 47],\n * [-72, 41],\n * [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n point: Coord,\n polygon: Feature<G, P> | G,\n options: {\n ignoreBoundary?: boolean;\n } = {}\n) {\n // validation\n if (!point) {\n throw new Error(\"point is required\");\n }\n if (!polygon) {\n throw new Error(\"polygon is required\");\n }\n\n const pt = getCoord(point);\n const geom = getGeom(polygon);\n const type = geom.type;\n const bbox = polygon.bbox;\n let polys: any[] = geom.coordinates;\n\n // Quick elimination if point is not inside bbox\n if (bbox && inBBox(pt, bbox) === false) {\n return false;\n }\n\n if (type === \"Polygon\") {\n polys = [polys];\n }\n let result = false;\n for (var i = 0; i < polys.length; ++i) {\n const polyResult = pip(pt, polys[i]);\n if (polyResult === 0) return options.ignoreBoundary ? false : true;\n else if (polyResult) result = true;\n }\n\n return result;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt: number[], bbox: BBox) {\n return (\n bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1]\n );\n}\n\nexport { booleanPointInPolygon };\nexport default booleanPointInPolygon;\n","class TinyQueue {\n constructor(data = [], compare = defaultCompare) {\n this.data = data;\n this.length = this.data.length;\n this.compare = compare;\n\n if (this.length > 0) {\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n }\n }\n\n push(item) {\n this.data.push(item);\n this.length++;\n this._up(this.length - 1);\n }\n\n pop() {\n if (this.length === 0) return undefined;\n\n const top = this.data[0];\n const bottom = this.data.pop();\n this.length--;\n\n if (this.length > 0) {\n this.data[0] = bottom;\n this._down(0);\n }\n\n return top;\n }\n\n peek() {\n return this.data[0];\n }\n\n _up(pos) {\n const {data, compare} = this;\n const item = data[pos];\n\n while (pos > 0) {\n const parent = (pos - 1) >> 1;\n const current = data[parent];\n if (compare(item, current) >= 0) break;\n data[pos] = current;\n pos = parent;\n }\n\n data[pos] = item;\n }\n\n _down(pos) {\n const {data, compare} = this;\n const halfLength = this.length >> 1;\n const item = data[pos];\n\n while (pos < halfLength) {\n let left = (pos << 1) + 1;\n let best = data[left];\n const right = left + 1;\n\n if (right < this.length && compare(data[right], best) < 0) {\n left = right;\n best = data[right];\n }\n if (compare(best, item) >= 0) break;\n\n data[pos] = best;\n pos = left;\n }\n\n data[pos] = item;\n }\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction checkWhichEventIsLeft (e1, e2) {\n if (e1.p.x > e2.p.x) return 1\n if (e1.p.x < e2.p.x) return -1\n\n if (e1.p.y !== e2.p.y) return e1.p.y > e2.p.y ? 1 : -1\n return 1\n}\n\nfunction checkWhichSegmentHasRightEndpointFirst (seg1, seg2) {\n if (seg1.rightSweepEvent.p.x > seg2.rightSweepEvent.p.x) return 1\n if (seg1.rightSweepEvent.p.x < seg2.rightSweepEvent.p.x) return -1\n\n if (seg1.rightSweepEvent.p.y !== seg2.rightSweepEvent.p.y) return seg1.rightSweepEvent.p.y < seg2.rightSweepEvent.p.y ? 1 : -1\n return 1\n}\n\nclass Event {\n\n constructor (p, featureId, ringId, eventId) {\n this.p = {\n x: p[0],\n y: p[1]\n };\n this.featureId = featureId;\n this.ringId = ringId;\n this.eventId = eventId;\n\n this.otherEvent = null;\n this.isLeftEndpoint = null;\n }\n\n isSamePoint (eventToCheck) {\n return this.p.x === eventToCheck.p.x && this.p.y === eventToCheck.p.y\n }\n}\n\nfunction fillEventQueue (geojson, eventQueue) {\n if (geojson.type === 'FeatureCollection') {\n const features = geojson.features;\n for (let i = 0; i < features.length; i++) {\n processFeature(features[i], eventQueue);\n }\n } else {\n processFeature(geojson, eventQueue);\n }\n}\n\nlet featureId = 0;\nlet ringId = 0;\nlet eventId = 0;\nfunction processFeature (featureOrGeometry, eventQueue) {\n const geom = featureOrGeometry.type === 'Feature' ? featureOrGeometry.geometry : featureOrGeometry;\n let coords = geom.coordinates;\n // standardise the input\n if (geom.type === 'Polygon' || geom.type === 'MultiLineString') coords = [coords];\n if (geom.type === 'LineString') coords = [[coords]];\n\n for (let i = 0; i < coords.length; i++) {\n for (let ii = 0; ii < coords[i].length; ii++) {\n let currentP = coords[i][ii][0];\n let nextP = null;\n ringId = ringId + 1;\n for (let iii = 0; iii < coords[i][ii].length - 1; iii++) {\n nextP = coords[i][ii][iii + 1];\n\n const e1 = new Event(currentP, featureId, ringId, eventId);\n const e2 = new Event(nextP, featureId, ringId, eventId + 1);\n\n e1.otherEvent = e2;\n e2.otherEvent = e1;\n\n if (checkWhichEventIsLeft(e1, e2) > 0) {\n e2.isLeftEndpoint = true;\n e1.isLeftEndpoint = false;\n } else {\n e1.isLeftEndpoint = true;\n e2.isLeftEndpoint = false;\n }\n eventQueue.push(e1);\n eventQueue.push(e2);\n\n currentP = nextP;\n eventId = eventId + 1;\n }\n }\n }\n featureId = featureId + 1;\n}\n\nclass Segment {\n\n constructor (event) {\n this.leftSweepEvent = event;\n this.rightSweepEvent = event.otherEvent;\n }\n}\n\nfunction testSegmentIntersect (seg1, seg2) {\n if (seg1 === null || seg2 === null) return false\n\n if (seg1.leftSweepEvent.ringId === seg2.leftSweepEvent.ringId &&\n (seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.rightSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.rightSweepEvent))) return false\n\n const x1 = seg1.leftSweepEvent.p.x;\n const y1 = seg1.leftSweepEvent.p.y;\n const x2 = seg1.rightSweepEvent.p.x;\n const y2 = seg1.rightSweepEvent.p.y;\n const x3 = seg2.leftSweepEvent.p.x;\n const y3 = seg2.leftSweepEvent.p.y;\n const x4 = seg2.rightSweepEvent.p.x;\n const y4 = seg2.rightSweepEvent.p.y;\n\n const denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));\n const numeA = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));\n const numeB = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));\n\n if (denom === 0) {\n if (numeA === 0 && numeB === 0) return false\n return false\n }\n\n const uA = numeA / denom;\n const uB = numeB / denom;\n\n if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) {\n const x = x1 + (uA * (x2 - x1));\n const y = y1 + (uA * (y2 - y1));\n return [x, y]\n }\n return false\n}\n\n// import {debugEventAndSegments, debugRemovingSegment} from './debug'\n\nfunction runCheck (eventQueue, ignoreSelfIntersections) {\n ignoreSelfIntersections = ignoreSelfIntersections ? ignoreSelfIntersections : false;\n\n const intersectionPoints = [];\n const outQueue = new TinyQueue([], checkWhichSegmentHasRightEndpointFirst);\n\n while (eventQueue.length) {\n const event = eventQueue.pop();\n if (event.isLeftEndpoint) {\n // debugEventAndSegments(event.p, outQueue.data)\n const segment = new Segment(event);\n for (let i = 0; i < outQueue.data.length; i++) {\n const otherSeg = outQueue.data[i];\n if (ignoreSelfIntersections) {\n if (otherSeg.leftSweepEvent.featureId === event.featureId) continue\n }\n const intersection = testSegmentIntersect(segment, otherSeg);\n if (intersection !== false) intersectionPoints.push(intersection);\n }\n outQueue.push(segment);\n } else if (event.isLeftEndpoint === false) {\n outQueue.pop();\n // const seg = outQueue.pop()\n // debugRemovingSegment(event.p, seg)\n }\n }\n return intersectionPoints\n}\n\nfunction sweeplineIntersections (geojson, ignoreSelfIntersections) {\n const eventQueue = new TinyQueue([], checkWhichEventIsLeft);\n fillEventQueue(geojson, eventQueue);\n return runCheck(eventQueue, ignoreSelfIntersections)\n}\n\nexport default sweeplineIntersections;\n","import { feature, featureCollection, point } from \"@turf/helpers\";\nimport {\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport type { Intersection } from \"sweepline-intersections\";\nimport { sweeplineIntersections as findIntersections } from \"./lib/sweepline-intersections-export.js\";\n\n/**\n * Takes any LineString or Polygon GeoJSON and returns the intersecting point(s).\n *\n * @function\n * @param {GeoJSON} line1 any LineString or Polygon\n * @param {GeoJSON} line2 any LineString or Polygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.removeDuplicates=true] remove duplicate intersections\n * @param {boolean} [options.ignoreSelfIntersections=true] ignores self-intersections on input features\n * @returns {FeatureCollection<Point>} point(s) that intersect both\n * @example\n * var line1 = turf.lineString([[126, -11], [129, -21]]);\n * var line2 = turf.lineString([[123, -18], [131, -14]]);\n * var intersects = turf.lineIntersect(line1, line2);\n *\n * //addToMap\n * var addToMap = [line1, line2, intersects]\n */\nfunction lineIntersect<\n G1 extends LineString | MultiLineString | Polygon | MultiPolygon,\n G2 extends LineString | MultiLineString | Polygon | MultiPolygon,\n>(\n line1: FeatureCollection<G1> | Feature<G1> | G1,\n line2: FeatureCollection<G2> | Feature<G2> | G2,\n options: {\n removeDuplicates?: boolean;\n ignoreSelfIntersections?: boolean;\n } = {}\n): FeatureCollection<Point> {\n const { removeDuplicates = true, ignoreSelfIntersections = true } = options;\n let features: Feature<G1 | G2>[] = [];\n if (line1.type === \"FeatureCollection\")\n features = features.concat(line1.features);\n else if (line1.type === \"Feature\") features.push(line1);\n else if (\n line1.type === \"LineString\" ||\n line1.type === \"Polygon\" ||\n line1.type === \"MultiLineString\" ||\n line1.type === \"MultiPolygon\"\n ) {\n features.push(feature(line1));\n }\n\n if (line2.type === \"FeatureCollection\")\n features = features.concat(line2.features);\n else if (line2.type === \"Feature\") features.push(line2);\n else if (\n line2.type === \"LineString\" ||\n line2.type === \"Polygon\" ||\n line2.type === \"MultiLineString\" ||\n line2.type === \"MultiPolygon\"\n ) {\n features.push(feature(line2));\n }\n\n const intersections = findIntersections(\n featureCollection(features),\n ignoreSelfIntersections\n );\n\n let results: Intersection[] = [];\n if (removeDuplicates) {\n const unique: Record<string, boolean> = {};\n intersections.forEach((intersection) => {\n const key = intersection.join(\",\");\n if (!unique[key]) {\n unique[key] = true;\n results.push(intersection);\n }\n });\n } else {\n results = intersections;\n }\n return featureCollection(results.map((r) => point(r)));\n}\n\nexport { lineIntersect };\nexport default lineIntersect;\n","// Get around problems with moduleResolution node16 and some older libraries.\n// Manifests as \"This expression is not callable ... has no call signatures\"\n// https://stackoverflow.com/a/74709714\n\nimport lib from \"sweepline-intersections\";\n\nexport const sweeplineIntersections = lib as unknown as typeof lib.default;\n","import { feature, point, lineString, isObject } from \"@turf/helpers\";\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordEachCallback} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[featureIndex].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[geomIndex]\n : geometryMaybeCollection;\n\n // Handles null Geometry -- Skips this geometry\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n\n wrapShrink =\n excludeWrapCoord &&\n (geomType === \"Polygon\" || geomType === \"MultiPolygon\")\n ? 1\n : 0;\n\n switch (geomType) {\n case null:\n break;\n case \"Point\":\n if (\n callback(\n coords,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (\n callback(\n coords[j],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (\n callback(\n coords[j][k],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (\n callback(\n coords[j][k][l],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n geometryIndex++;\n }\n multiFeatureIndex++;\n }\n break;\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++)\n if (\n coordEach(geometry.geometries[j], callback, excludeWrapCoord) ===\n false\n )\n return false;\n break;\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordReduceCallback} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(\n geojson,\n function (\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) {\n if (coordIndex === 0 && initialValue === undefined)\n previousValue = currentCoord;\n else\n previousValue = callback(\n previousValue,\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n },\n excludeWrapCoord\n );\n return previousValue;\n}\n\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {propEachCallback} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\nfunction propEach(geojson, callback) {\n var i;\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n break;\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {propReduceCallback} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentProperties;\n else\n previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature<any>} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureEachCallback} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentFeature;\n else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @returns {Array<Array<number>>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry|GeometryObject|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomEachCallback} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[i].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n featureProperties = isFeatureCollection\n ? geojson.features[i].properties\n : isFeature\n ? geojson.properties\n : {};\n featureBBox = isFeatureCollection\n ? geojson.features[i].bbox\n : isFeature\n ? geojson.bbox\n : undefined;\n featureId = isFeatureCollection\n ? geojson.features[i].id\n : isFeature\n ? geojson.id\n : undefined;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[g]\n : geometryMaybeCollection;\n\n // Handle null Geometry\n if (geometry === null) {\n if (\n callback(\n null,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n continue;\n }\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\": {\n if (\n callback(\n geometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n break;\n }\n case \"GeometryCollection\": {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (\n callback(\n geometry.geometries[j],\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n }\n break;\n }\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n // Only increase `featureIndex` per each feature\n featureIndex++;\n }\n}\n\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomReduceCallback} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(\n geojson,\n function (\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentGeometry;\n else\n previousValue = callback(\n previousValue,\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenEachCallback} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (\n callback(\n feature(geometry, properties, { bbox: bbox, id: id }),\n featureIndex,\n 0\n ) === false\n )\n return false;\n return;\n }\n\n var geomType;\n\n // Callback for multi-geometry\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (\n var multiFeatureIndex = 0;\n multiFeatureIndex < geometry.coordinates.length;\n multiFeatureIndex++\n ) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate,\n };\n if (\n callback(feature(geom, properties), featureIndex, multiFeatureIndex) ===\n false\n )\n return false;\n }\n });\n}\n\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(\n geojson,\n function (currentFeature, featureIndex, multiFeatureIndex) {\n if (\n featureIndex === 0 &&\n multiFeatureIndex === 0 &&\n initialValue === undefined\n )\n previousValue = currentFeature;\n else\n previousValue = callback(\n previousValue,\n currentFeature,\n featureIndex,\n multiFeatureIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {AllGeoJSON} geojson any GeoJSON\n * @param {segmentEachCallback} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0;\n\n // Exclude null Geometries\n if (!feature.geometry) return;\n // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return;\n\n // Generate 2-vertex line segments\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (\n coordEach(\n feature,\n function (\n currentCoord,\n coordIndex,\n featureIndexCoord,\n multiPartIndexCoord,\n geometryIndex\n ) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (\n previousCoords === undefined ||\n featureIndex > previousFeatureIndex ||\n multiPartIndexCoord > previousMultiIndex ||\n geometryIndex > prevGeomIndex\n ) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n var currentSegment = lineString(\n [previousCoords, currentCoord],\n feature.properties\n );\n if (\n callback(\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) === false\n )\n return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }\n ) === false\n )\n return false;\n });\n}\n\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {segmentReduceCallback} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(\n geojson,\n function (\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) {\n if (started === false && initialValue === undefined)\n previousValue = currentSegment;\n else\n previousValue = callback(\n previousValue,\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n );\n started = true;\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {void}\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {lineEachCallback} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @returns {void}\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false)\n return false;\n break;\n case \"Polygon\":\n for (\n var geometryIndex = 0;\n geometryIndex < coords.length;\n geometryIndex++\n ) {\n if (\n callback(\n lineString(coords[geometryIndex], feature.properties),\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n }\n break;\n }\n });\n}\n\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(\n geojson,\n function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentLine;\n else\n previousValue = callback(\n previousValue,\n currentLine,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature<LineString<[[10, 10], [50, 30]]>>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature<LineString<[[-10, -10], [-50, -30]]>>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature<LineString<[[-50, -30], [-30, -40]]>>\n */\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find SegmentIndex\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString(\n [coords[segmentIndex], coords[segmentIndex + 1]],\n properties,\n options\n );\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[geometryIndex][segmentIndex],\n coords[geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][segmentIndex],\n coords[multiFeatureIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex =\n coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][geometryIndex][segmentIndex],\n coords[multiFeatureIndex][geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature<Point<[10, 10]>>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature<Point<[-10, -10]>>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature<Point<[-30, -40]>>\n */\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find Coord Index\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n case \"MultiPoint\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0)\n coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0)\n coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0)\n coordIndex =\n coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(\n coords[multiFeatureIndex][geometryIndex][coordIndex],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\nexport {\n coordReduce,\n coordEach,\n propEach,\n propReduce,\n featureReduce,\n featureEach,\n coordAll,\n geomReduce,\n geomEach,\n flattenReduce,\n flattenEach,\n segmentReduce,\n segmentEach,\n lineReduce,\n lineEach,\n findSegment,\n findPoint,\n};\n","import { featureCollection, lineString, multiLineString } from \"@turf/helpers\";\nimport {\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Converts a {@link Polygon} to {@link LineString|(Multi)LineString} or {@link MultiPolygon} to a\n * {@link FeatureCollection} of {@link LineString|(Multi)LineString}.\n *\n * @function\n * @param {Feature<Polygon|MultiPolygon>} poly Feature to convert\n * @param {Object} [options={}] Optional parameters\n * @param {Object} [options.properties={}] translates GeoJSON properties to Feature\n * @returns {FeatureCollection|Feature<LineString|MultiLinestring>} converted (Multi)Polygon to (Multi)LineString\n * @example\n * var poly = turf.polygon([[[125, -30], [145, -30], [145, -20], [125, -20], [125, -30]]]);\n *\n * var line = turf.polygonToLine(poly);\n *\n * //addToMap\n * var addToMap = [line];\n */\nfunction polygonToLine<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n poly: Feature<G, P> | G,\n options: { properties?: any } = {}\n):\n | Feature<LineString | MultiLineString, P>\n | FeatureCollection<LineString | MultiLineString, P> {\n const geom: any = getGeom(poly);\n if (!options.properties && poly.type === \"Feature\") {\n options.properties = poly.properties;\n }\n switch (geom.type) {\n case \"Polygon\":\n return singlePolygonToLine(geom, options);\n case \"MultiPolygon\":\n return multiPolygonToLine(geom, options);\n default:\n throw new Error(\"invalid poly\");\n }\n}\n\n/**\n * @private\n */\nfunction singlePolygonToLine<\n G extends Polygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n poly: Feature<G, P> | G,\n options: { properties?: any } = {}\n): Feature<LineString | MultiLineString, P> {\n const geom = getGeom(poly);\n const coords: any[] = geom.coordinates;\n const properties: any = options.properties\n ? options.properties\n : poly.type === \"Feature\"\n ? poly.properties\n : {};\n\n return coordsToLine(coords, properties);\n}\n\n/**\n * @private\n */\nfunction multiPolygonToLine<\n G extends MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n multiPoly: Feature<G, P> | G,\n options: { properties?: P } = {}\n): FeatureCollection<LineString | MultiLineString, P> {\n const geom = getGeom(multiPoly);\n const coords: any[] = geom.coordinates;\n const properties: any = options.properties\n ? options.properties\n : multiPoly.type === \"Feature\"\n ? multiPoly.properties\n : {};\n\n const lines: Array<Feature<LineString | MultiLineString, P>> = [];\n coords.forEach((coord) => {\n lines.push(coordsToLine(coord, properties));\n });\n return featureCollection(lines);\n}\n\n/**\n * @private\n */\nfunction coordsToLine<P extends GeoJsonProperties = GeoJsonProperties>(\n coords: number[][][],\n properties: P\n): Feature<LineString | MultiLineString, P> {\n if (coords.length > 1) {\n return multiLineString(coords, properties);\n }\n return lineString(coords[0], properties);\n}\n\nexport { polygonToLine, coordsToLine, multiPolygonToLine, singlePolygonToLine };\nexport default polygonToLine;\n","import {\n Feature,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from \"geojson\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport { flattenEach } from \"@turf/meta\";\nimport { polygonToLine } from \"@turf/polygon-to-line\";\n\n/**\n * Boolean-disjoint returns (TRUE) if the intersection of the two geometries is an empty set.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreSelfIntersections=true] ignore self-intersections on input features\n * @returns {boolean} true if the intersection is an empty set, false otherwise\n * @example\n * var point = turf.point([2, 2]);\n * var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);\n *\n * turf.booleanDisjoint(line, point);\n * //=true\n */\nfunction booleanDisjoint(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n {\n ignoreSelfIntersections = true,\n }: {\n ignoreSelfIntersections?: boolean;\n } = { ignoreSelfIntersections: true }\n): boolean {\n let bool = true;\n flattenEach(feature1, (flatten1) => {\n flattenEach(feature2, (flatten2) => {\n if (bool === false) {\n return false;\n }\n bool = disjoint(\n flatten1.geometry,\n flatten2.geometry,\n ignoreSelfIntersections\n );\n });\n });\n return bool;\n}\n\n/**\n * Disjoint operation for simple Geometries (Point/LineString/Polygon)\n *\n * @private\n * @param {Geometry<any>} geom1 GeoJSON Geometry\n * @param {Geometry<any>} geom2 GeoJSON Geometry\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if disjoint, false otherwise\n */\nfunction disjoint(geom1: any, geom2: any, ignoreSelfIntersections: boolean) {\n switch (geom1.type) {\n case \"Point\":\n switch (geom2.type) {\n case \"Point\":\n return !compareCoords(geom1.coordinates, geom2.coordinates);\n case \"LineString\":\n return !isPointOnLine(geom2, geom1);\n case \"Polygon\":\n return !booleanPointInPolygon(geom1, geom2);\n }\n /* istanbul ignore next */\n break;\n case \"LineString\":\n switch (geom2.type) {\n case \"Point\":\n return !isPointOnLine(geom1, geom2);\n case \"LineString\":\n return !isLineOnLine(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isLineInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n /* istanbul ignore next */\n break;\n case \"Polygon\":\n switch (geom2.type) {\n case \"Point\":\n return !booleanPointInPolygon(geom2, geom1);\n case \"LineString\":\n return !isLineInPoly(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isPolyInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n }\n return false;\n}\n\n// http://stackoverflow.com/a/11908158/1979085\nfunction isPointOnLine(lineString: LineString, pt: Point) {\n for (let i = 0; i < lineString.coordinates.length - 1; i++) {\n if (\n isPointOnLineSegment(\n lineString.coordinates[i],\n lineString.coordinates[i + 1],\n pt.coordinates\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLineOnLine(\n lineString1: LineString,\n lineString2: LineString,\n ignoreSelfIntersections: boolean\n) {\n const doLinesIntersect = lineIntersect(lineString1, lineString2, {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isLineInPoly(\n polygon: Polygon,\n lineString: LineString,\n ignoreSelfIntersections: boolean\n) {\n for (const coord of lineString.coordinates) {\n if (booleanPointInPolygon(coord, polygon)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(lineString, polygonToLine(polygon), {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Is Polygon (geom1) in Polygon (geom2)\n * Only takes into account outer rings\n * See http://stackoverflow.com/a/4833823/1979085\n *\n * @private\n * @param {Geometry|Feature<Polygon>} feature1 Polygon1\n * @param {Geometry|Feature<Polygon>} feature2 Polygon2\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if geom1 is in geom2, false otherwise\n */\nfunction isPolyInPoly(\n feature1: Polygon,\n feature2: Polygon,\n ignoreSelfIntersections: boolean\n) {\n for (const coord1 of feature1.coordinates[0]) {\n if (booleanPointInPolygon(coord1, feature2)) {\n return true;\n }\n }\n for (const coord2 of feature2.coordinates[0]) {\n if (booleanPointInPolygon(coord2, feature1)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(\n polygonToLine(feature1),\n polygonToLine(feature2),\n { ignoreSelfIntersections }\n );\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isPointOnLineSegment(\n lineSegmentStart: Position,\n lineSegmentEnd: Position,\n pt: Position\n) {\n const dxc = pt[0] - lineSegmentStart[0];\n const dyc = pt[1] - lineSegmentStart[1];\n const dxl = lineSegmentEnd[0] - lineSegmentStart[0];\n const dyl = lineSegmentEnd[1] - lineSegmentStart[1];\n const cross = dxc * dyl - dyc * dxl;\n if (cross !== 0) {\n return false;\n }\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n if (dxl > 0) {\n return lineSegmentStart[0] <= pt[0] && pt[0] <= lineSegmentEnd[0];\n } else {\n return lineSegmentEnd[0] <= pt[0] && pt[0] <= lineSegmentStart[0];\n }\n } else if (dyl > 0) {\n return lineSegmentStart[1] <= pt[1] && pt[1] <= lineSegmentEnd[1];\n } else {\n return lineSegmentEnd[1] <= pt[1] && pt[1] <= lineSegmentStart[1];\n }\n}\n\n/**\n * compareCoords\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {boolean} true if coord pairs match, false otherwise\n */\nfunction compareCoords(pair1: Position, pair2: Position) {\n return pair1[0] === pair2[0] && pair1[1] === pair2[1];\n}\n\nexport { booleanDisjoint };\nexport default booleanDisjoint;\n","import { Feature, Geometry } from \"geojson\";\nimport { booleanDisjoint } from \"@turf/boolean-disjoint\";\nimport { flattenEach } from \"@turf/meta\";\n\n/**\n * Boolean-intersects returns (TRUE) if the intersection of the two geometries is NOT an empty set.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreSelfIntersections=true] ignore self-intersections on input features\n * @returns {boolean} true if geometries intersect, false otherwise\n * @example\n * var point1 = turf.point([2, 2]);\n * var point2 = turf.point([1, 2]);\n * var line = turf.lineString([[1, 1], [1, 3], [1, 4]]);\n *\n * turf.booleanIntersects(line, point1);\n * //=false\n *\n * turf.booleanIntersects(line, point2);\n * //=true\n *\n * //addToMap\n * var addToMap = [point1, point2, line];\n * point1.properties['marker-color'] = '#f00'\n * point2.properties['marker-color'] = '#0f0'\n */\nfunction booleanIntersects(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n {\n ignoreSelfIntersections = true,\n }: {\n ignoreSelfIntersections?: boolean;\n } = {}\n) {\n let bool = false;\n flattenEach(feature1, (flatten1) => {\n flattenEach(feature2, (flatten2) => {\n if (bool === true) {\n return true;\n }\n bool = !booleanDisjoint(flatten1.geometry, flatten2.geometry, {\n ignoreSelfIntersections,\n });\n });\n });\n return bool;\n}\n\nexport { booleanIntersects };\nexport default booleanIntersects;\n","import intersects from '@turf/boolean-intersects';\nimport type {FeatureCollection} from 'geojson';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialFilter} from '../types.js';\n\nexport function geojsonFeatures({\n geojson,\n spatialFilter,\n uniqueIdProperty,\n}: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n uniqueIdProperty?: string;\n}): FeatureData[] {\n let uniqueIdx = 0;\n const map = new Map();\n\n if (!spatialFilter) {\n return [];\n }\n\n for (const feature of geojson.features) {\n const uniqueId = uniqueIdProperty\n ? feature.properties![uniqueIdProperty]\n : ++uniqueIdx;\n if (!map.has(uniqueId) && intersects(spatialFilter, feature)) {\n map.set(uniqueId, feature.properties);\n }\n }\n\n return Array.from(map.values());\n}\n","// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */ // radians and degrees are common variable names\n\nimport type {NumericArray} from '@math.gl/types';\n\nimport type {MathArray} from '../classes/base/math-array';\n\nconst RADIANS_TO_DEGREES = (1 / Math.PI) * 180;\nconst DEGREES_TO_RADIANS = (1 / 180) * Math.PI;\n\nexport type ConfigurationOptions = {\n EPSILON: number;\n debug?: boolean;\n precision: number;\n printTypes?: boolean;\n printDegrees?: boolean;\n printRowMajor?: boolean;\n _cartographicRadians?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required<ConfigurationOptions> = {\n EPSILON: 1e-12,\n debug: false,\n precision: 4,\n printTypes: false,\n printDegrees: false,\n printRowMajor: true,\n _cartographicRadians: false\n};\n\n// We use a global field to store the config\ndeclare global {\n // eslint-disable-next-line no-var\n var mathgl: {\n config: Required<ConfigurationOptions>;\n };\n}\n\n// Configuration is truly global as of v3.6 to ensure single config even if multiple copies of math.gl\n// Multiple copies of config can be quite tricky to debug...\nglobalThis.mathgl = globalThis.mathgl || {config: {...DEFAULT_CONFIG}};\n\nexport const config = globalThis.mathgl.config;\n\nexport function configure(options: Partial<ConfigurationOptions>): ConfigurationOptions {\n // Only copy existing keys\n Object.assign(config, options);\n return config;\n}\n\n/**\n * Formats a value into a string\n * @param value\n * @param param1\n * @returns\n */\nexport function formatValue(\n value: number,\n {precision = config.precision}: {precision?: number} = {}\n): string {\n value = round(value);\n // get rid of trailing zeros\n return `${parseFloat(value.toPrecision(precision))}`;\n}\n\n/**\n * Check if value is an \"array\"\n * Returns `true` if value is either an array or a typed array\n * Note: returns `false` for `ArrayBuffer` and `DataView` instances\n * @note isTypedArray and isNumericArray are often more useful in TypeScript\n */\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value) || (ArrayBuffer.isView(value) && !(value instanceof DataView));\n}\n\nexport function clone(array: NumericArray | MathArray): NumericArray {\n return 'clone' in array ? array.clone() : array.slice();\n}\n\nexport function toRadians(degrees: number): number;\nexport function toRadians(degrees: NumericArray): NumericArray;\n\nexport function toRadians(degrees: number | NumericArray): number | NumericArray {\n return radians(degrees as NumericArray);\n}\n\nexport function toDegrees(degrees: number): number;\nexport function toDegrees(degrees: NumericArray): NumericArray;\n\nexport function toDegrees(radians: number | NumericArray): number | NumericArray {\n return degrees(radians as NumericArray);\n}\n\n// GLSL math function equivalents - Works on both single values and vectors\n\n/**\n * \"GLSL equivalent\" radians: Works on single values and vectors\n */\nexport function radians(degrees: number): number;\nexport function radians(degrees: NumericArray, result?: NumericArray): NumericArray;\n\nexport function radians(\n degrees: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(degrees, (degrees) => degrees * DEGREES_TO_RADIANS, result);\n}\n\n/**\n * \"GLSL equivalent\" degrees: Works on single values and vectors\n */\nexport function degrees(radians: number): number;\nexport function degrees(radians: NumericArray, result?: NumericArray): NumericArray;\n\nexport function degrees(\n radians: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(radians, (radians) => radians * RADIANS_TO_DEGREES, result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.sin`: Works on single values and vectors\n * @deprecated\n */\nexport function sin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.sin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.cos`: Works on single values and vectors\n * @deprecated\n */\nexport function cos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.cos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.tan`: Works on single values and vectors\n * @deprecated\n */\nexport function tan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.tan(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.asin`: Works on single values and vectors\n * @deprecated\n */\nexport function asin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.asin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.acos`: Works on single values and vectors\n * @deprecated\n */\nexport function acos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.acos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.atan`: Works on single values and vectors\n * @deprecated\n */\nexport function atan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.atan(angle), result);\n}\n\n/**\n * GLSL style value clamping: Works on single values and vectors\n */\nexport function clamp(value: number, min: number, max: number): number;\nexport function clamp(value: NumericArray, min: number, max: number): NumericArray;\n\nexport function clamp(\n value: number | NumericArray,\n min: number,\n max: number\n): number | NumericArray {\n return map(value, (value) => Math.max(min, Math.min(max, value)));\n}\n\n/**\n * Interpolate between two numbers or two arrays\n */\nexport function lerp(a: number, b: number, t: number): number;\nexport function lerp(a: NumericArray, b: NumericArray, t: number): NumericArray;\n\nexport function lerp(\n a: number | NumericArray,\n b: number | NumericArray,\n t: number\n): number | NumericArray {\n if (isArray(a)) {\n return (a as NumericArray).map((ai: number, i: number) => lerp(ai, (b as NumericArray)[i], t));\n }\n return t * (b as number) + (1 - t) * (a as number);\n}\n\n/* eslint-disable */\n\n/**\n * Compares any two math objects, using `equals` method if available.\n * @param a\n * @param b\n * @param epsilon\n * @returns\n */\nexport function equals(a: any, b: any, epsilon?: number): boolean {\n const oldEpsilon = config.EPSILON;\n if (epsilon) {\n config.EPSILON = epsilon;\n }\n try {\n if (a === b) {\n return true;\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n // eslint-disable-next-line max-depth\n if (!equals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n if (a && a.equals) {\n return a.equals(b);\n }\n if (b && b.equals) {\n return b.equals(a);\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n }\n return false;\n } finally {\n config.EPSILON = oldEpsilon;\n }\n}\n\nexport function exactEquals(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n if (a && typeof a === 'object' && b && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n if (a.exactEquals) {\n return a.exactEquals(b);\n }\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (!exactEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\n/* eslint-enable */\n\nexport function withEpsilon<T>(epsilon: number, func: () => T): T {\n const oldPrecision = config.EPSILON;\n config.EPSILON = epsilon;\n let value: T;\n try {\n value = func();\n } finally {\n config.EPSILON = oldPrecision;\n }\n return value;\n}\n\n// HELPERS\n\nfunction round(value: number): number {\n return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\n// If the array has a clone function, calls it, otherwise returns a copy\nfunction duplicateArray(array: NumericArray): NumericArray {\n // @ts-expect-error We check for math.gl class methods\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return array.clone ? (array.clone() as NumericArray) : (new Array(array.length) as number[]);\n}\n\n// If the argument value is an array, applies the func element wise,\n// otherwise applies func to the argument value\nfunction map(\n value: number | NumericArray,\n func: (x: number, index?: number, resultArray?: NumericArray) => number,\n result?: NumericArray\n): number | NumericArray {\n if (isArray(value)) {\n const array = value as NumericArray;\n result = result || duplicateArray(array);\n for (let i = 0; i < result.length && i < array.length; ++i) {\n const val = typeof value === 'number' ? value : value[i];\n result[i] = func(val, i, result);\n }\n return result;\n }\n return func(value as number);\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: unknown, message?: string): void {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n","// TODO - THE UTILITIES IN THIS FILE SHOULD BE IMPORTED FROM WEB-MERCATOR-VIEWPORT MODULE\n\nimport {createMat4, transformVector, clamp, log2} from './math-utils';\n\nimport {mat4, vec2, vec3} from '@math.gl/core';\nimport {assert} from './assert';\n\n// CONSTANTS\nconst PI = Math.PI;\nconst PI_4 = PI / 4;\nconst DEGREES_TO_RADIANS = PI / 180;\nconst RADIANS_TO_DEGREES = 180 / PI;\nconst TILE_SIZE = 512;\n// Average circumference (40075 km equatorial, 40007 km meridional)\nconst EARTH_CIRCUMFERENCE = 40.03e6;\n// Latitude that makes a square world, 2 * atan(E ** PI) - PI / 2\nexport const MAX_LATITUDE = 85.051129;\n\n// Mapbox default altitude\nexport const DEFAULT_ALTITUDE = 1.5;\n\nexport type DistanceScales = {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n unitsPerMeter2?: number[];\n unitsPerDegree: number[];\n degreesPerUnit: number[];\n unitsPerDegree2?: number[];\n};\n\n/**\n * PROJECTION MATRIX PARAMETERS\n *\n * TODO how to document mebers\n * @param fov in radians. fov is variable, depends on pitch and altitude\n * @param aspect width/height\n * @param focalDistance distance at which visual scale factor is 1\n * @param near near clipping plane\n * @param far far clipping plane\n */\ntype ProjectionParameters = {\n fov: number;\n aspect: number;\n focalDistance: number;\n near: number;\n far: number;\n};\n\n/** Logarithimic zoom to linear scale **/\nexport function zoomToScale(zoom: number): number {\n return Math.pow(2, zoom);\n}\n\n/** Linear scale to logarithimic zoom **/\nexport function scaleToZoom(scale: number): number {\n return log2(scale);\n}\n\n/**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n *\n * @param lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return [x,y] coordinates.\n */\nexport function lngLatToWorld(lngLat: number[]): [number, number] {\n const [lng, lat] = lngLat;\n assert(Number.isFinite(lng));\n assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n\n const lambda2 = lng * DEGREES_TO_RADIANS;\n const phi2 = lat * DEGREES_TO_RADIANS;\n const x = (TILE_SIZE * (lambda2 + PI)) / (2 * PI);\n const y = (TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5)))) / (2 * PI);\n return [x, y];\n}\n\n/**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n *\n * @param xy - array with [x,y] members\n * representing point on projected map plane\n * @return - array with [x,y] of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\nexport function worldToLngLat(xy: number[]): [number, number] {\n const [x, y] = xy;\n const lambda2 = (x / TILE_SIZE) * (2 * PI) - PI;\n const phi2 = 2 * (Math.atan(Math.exp((y / TILE_SIZE) * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\n\n/**\n * Returns the zoom level that gives a 1 meter pixel at a certain latitude\n * 1 = C*cos(y)/2^z/TILE_SIZE = C*cos(y)/2^(z+9)\n */\nexport function getMeterZoom(options: {latitude: number}): number {\n const {latitude} = options;\n assert(Number.isFinite(latitude));\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\n\n/**\n * Calculate the conversion from meter to common units at a given latitude\n * This is a cheaper version of `getDistanceScales`\n * @param latitude center latitude in degrees\n * @returns common units per meter\n */\nexport function unitsPerMeter(latitude: number): number {\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return TILE_SIZE / EARTH_CIRCUMFERENCE / latCosine;\n}\n\n/**\n * Calculate distance scales in meters around current lat/lon, both for\n * degrees and pixels.\n * In mercator projection mode, the distance scales vary significantly\n * with latitude.\n */\nexport function getDistanceScales(options: {\n latitude: number;\n longitude: number;\n highPrecision?: boolean;\n}): DistanceScales {\n const {latitude, longitude, highPrecision = false} = options;\n assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n\n const worldSize = TILE_SIZE;\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n\n /**\n * Number of pixels occupied by one degree longitude around current lat/lon:\n unitsPerDegreeX = d(lngLatToWorld([lng, lat])[0])/d(lng)\n = scale * TILE_SIZE * DEGREES_TO_RADIANS / (2 * PI)\n unitsPerDegreeY = d(lngLatToWorld([lng, lat])[1])/d(lat)\n = -scale * TILE_SIZE * DEGREES_TO_RADIANS / cos(lat * DEGREES_TO_RADIANS) / (2 * PI)\n */\n const unitsPerDegreeX = worldSize / 360;\n const unitsPerDegreeY = unitsPerDegreeX / latCosine;\n\n /**\n * Number of pixels occupied by one meter around current lat/lon:\n */\n const altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n\n /**\n * LngLat: longitude -> east and latitude -> north (bottom left)\n * UTM meter offset: x -> east and y -> north (bottom left)\n * World space: x -> east and y -> south (top left)\n *\n * Y needs to be flipped when converting delta degree/meter to delta pixels\n */\n const result: DistanceScales = {\n unitsPerMeter: [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter],\n metersPerUnit: [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter],\n\n unitsPerDegree: [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter],\n degreesPerUnit: [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter]\n };\n\n /**\n * Taylor series 2nd order for 1/latCosine\n f'(a) * (x - a)\n = d(1/cos(lat * DEGREES_TO_RADIANS))/d(lat) * dLat\n = DEGREES_TO_RADIANS * tan(lat * DEGREES_TO_RADIANS) / cos(lat * DEGREES_TO_RADIANS) * dLat\n */\n if (highPrecision) {\n const latCosine2 = (DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS)) / latCosine;\n const unitsPerDegreeY2 = (unitsPerDegreeX * latCosine2) / 2;\n const altUnitsPerDegree2 = (worldSize / EARTH_CIRCUMFERENCE) * latCosine2;\n const altUnitsPerMeter2 = (altUnitsPerDegree2 / unitsPerDegreeY) * altUnitsPerMeter;\n\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n // Main results, used for converting meters to latlng deltas and scaling offsets\n return result;\n}\n\n/**\n * Offset a lng/lat position by meterOffset (northing, easting)\n */\nexport function addMetersToLngLat(lngLatZ: number[], xyz: number[]): number[] {\n const [longitude, latitude, z0] = lngLatZ;\n const [x, y, z] = xyz;\n\n // eslint-disable-next-line no-shadow\n const {unitsPerMeter, unitsPerMeter2} = getDistanceScales({\n longitude,\n latitude,\n highPrecision: true\n });\n\n const worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n\n const newLngLat = worldToLngLat(worldspace);\n const newZ = (z0 || 0) + (z || 0);\n\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\n\n/**\n *\n * view and projection matrix creation is intentionally kept compatible with\n * mapbox-gl's implementation to ensure that seamless interoperation\n * with mapbox and react-map-gl. See: https://github.com/mapbox/mapbox-gl-js\n */\nexport function getViewMatrix(options: {\n // Viewport props\n height: number;\n pitch: number;\n bearing: number;\n altitude: number;\n // Pre-calculated parameters\n scale: number;\n center?: number[];\n}): number[] {\n const {\n // Viewport props\n height,\n pitch,\n bearing,\n altitude,\n // Pre-calculated parameters\n scale,\n center\n } = options;\n // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES\n // Note that mercator world coordinates typically need to be flipped\n //\n // Note: As usual, matrix operation orders should be read in reverse\n // since vectors will be multiplied from the right during transformation\n const vm = createMat4();\n\n // Move camera to altitude (along the pitch & bearing direction)\n mat4.translate(vm, vm, [0, 0, -altitude]);\n\n // Rotate by bearing, and then by pitch (which tilts the view)\n mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n\n const relativeScale = scale / height;\n mat4.scale(vm, vm, [relativeScale, relativeScale, relativeScale]);\n\n if (center) {\n mat4.translate(vm, vm, vec3.negate([], center));\n }\n\n return vm;\n}\n\n/**\n * Calculates mapbox compatible projection matrix from parameters\n *\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns project parameters object\n */\nexport function getProjectionParameters(options: {\n width: number;\n height: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n pitch?: number;\n nearZMultiplier?: number;\n farZMultiplier?: number;\n}): ProjectionParameters {\n const {\n width,\n height,\n altitude,\n pitch = 0,\n offset,\n center,\n scale,\n nearZMultiplier = 1,\n farZMultiplier = 1\n } = options;\n let {fovy = altitudeToFovy(DEFAULT_ALTITUDE)} = options;\n\n // For back-compatibility allow field of view to be\n // derived from altitude\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n const fovRadians = fovy * DEGREES_TO_RADIANS;\n const pitchRadians = pitch * DEGREES_TO_RADIANS;\n\n // Distance from camera to the target\n const focalDistance = fovyToAltitude(fovy);\n\n let cameraToSeaLevelDistance = focalDistance;\n\n if (center) {\n cameraToSeaLevelDistance += (center[2] * scale) / Math.cos(pitchRadians) / height;\n }\n\n const fovAboveCenter = fovRadians * (0.5 + (offset ? offset[1] : 0) / height);\n\n // Find the distance from the center point to the center top\n // in focal distance units using law of sines.\n const topHalfSurfaceDistance =\n (Math.sin(fovAboveCenter) * cameraToSeaLevelDistance) /\n Math.sin(clamp(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));\n\n // Calculate z distance of the farthest fragment that should be rendered.\n const furthestDistance =\n Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;\n // Matches mapbox limit\n const horizonDistance = cameraToSeaLevelDistance * 10;\n\n // Calculate z value of the farthest fragment that should be rendered.\n const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);\n\n return {\n fov: fovRadians,\n aspect: width / height,\n focalDistance,\n near: nearZMultiplier,\n far: farZ\n };\n}\n\n/**\n * CALCULATE PROJECTION MATRIX: PROJECTS FROM CAMERA (VIEW) SPACE TO CLIPSPACE\n *\n * To match mapbox's z buffer:\n * - \\<= 0.28: nearZMultiplier: 0.1, farZmultiplier: 1\n * - \\>= 0.29: nearZMultiplier: 1 / height, farZMultiplier: 1.01\n *\n * @param options Viewport options\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns 4x4 projection matrix\n */\nexport function getProjectionMatrix(options: {\n width: number;\n height: number;\n pitch: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n nearZMultiplier: number;\n farZMultiplier: number;\n}): number[] {\n const {fov, aspect, near, far} = getProjectionParameters(options);\n\n const projectionMatrix = mat4.perspective(\n [] as number[],\n fov, // fov in radians\n aspect, // aspect ratio\n near, // near plane\n far // far plane\n );\n\n return projectionMatrix;\n}\n\n/**\n *\n * Convert an altitude to field of view such that the\n * focal distance is equal to the altitude\n *\n * @param altitude - altitude of camera in screen units\n * @return fovy field of view in degrees\n */\nexport function altitudeToFovy(altitude: number): number {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\n\n/**\n *\n * Convert an field of view such that the\n * focal distance is equal to the altitude\n *\n * @param fovy - field of view in degrees\n * @return altitude altitude of camera in screen units\n */\nexport function fovyToAltitude(fovy: number): number {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\n\n/**\n * Project flat coordinates to pixels on screen.\n *\n * @param xyz - flat coordinate on 512*512 Mercator Zoom 0 tile\n * @param pixelProjectionMatrix - projection matrix 4x4\n * @return [x, y, depth] pixel coordinate on screen.\n */\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[];\n\n// Project flat coordinates to pixels on screen.\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[] {\n const [x, y, z = 0] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\n\n/**\n * Unproject pixels on screen to flat coordinates.\n *\n * @param xyz - pixel coordinate on screen.\n * @param pixelUnprojectionMatrix - unprojection matrix 4x4\n * @param targetZ - if pixel coordinate does not have a 3rd component (depth),\n * targetZ is used as the elevation plane to unproject onto\n * @return [x, y, Z] flat coordinates on 512*512 Mercator Zoom 0 tile.\n */\nexport function pixelsToWorld(\n xyz: number[],\n pixelUnprojectionMatrix: number[],\n targetZ: number = 0\n): number[] {\n const [x, y, z] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n // Has depth component\n const coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that line with z=0\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n\n const z0 = coord0[2];\n const z1 = coord1[2];\n\n const t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2.lerp([] as number[], coord0, coord1, t);\n}\n","/* eslint-disable camelcase */\nimport {vec2} from '@math.gl/core';\nimport type {WebMercatorViewport} from './web-mercator-viewport';\nimport {worldToLngLat} from './web-mercator-utils';\nimport {transformVector} from './math-utils';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\n/*\n * Returns the quad at the intersection of the frustum and the given z plane\n * @param {WebMercatorViewport} viewport\n * @param {Number} z - elevation in meters\n */\nexport function getBounds(viewport: WebMercatorViewport, z: number = 0): number[][] {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {width, height, unproject} = viewport;\n const unprojectOps = {targetZ: z};\n const bottomLeft = unproject([0, height], unprojectOps);\n const bottomRight = unproject([width, height], unprojectOps);\n let topLeft: number[];\n let topRight: number[];\n\n const halfFov = viewport.fovy\n ? 0.5 * viewport.fovy * DEGREES_TO_RADIANS\n : Math.atan(0.5 / viewport.altitude);\n const angleToGround = (90 - viewport.pitch) * DEGREES_TO_RADIANS;\n // The top plane is parallel to the ground if halfFov == angleToGround\n if (halfFov > angleToGround - 0.01) {\n // intersect with the far plane\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n // intersect with the top plane\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\n/*\n * Find a point on the far clipping plane of the viewport\n * @param {WebMercatorViewport} viewport\n * @param {Number} x - projected x in screen space\n * @param {Number} targetZ - the elevation of the point in meters\n */\nfunction unprojectOnFarPlane(viewport: WebMercatorViewport, x: number, targetZ: number): number[] {\n const {pixelUnprojectionMatrix} = viewport;\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n\n const z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n const t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n const coord = vec2.lerp([], coord0, coord1, t);\n\n const result = worldToLngLat(coord);\n result.push(targetZ);\n return result;\n}\n","import {lerp} from '@math.gl/core';\nimport {lngLatToWorld, worldToLngLat} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform tile coords to WGS84 coordinates.\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformTileCoordsToWGS84<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = lngLatToWorld([west, north]);\n const se = lngLatToWorld([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = lerp(nw[0], se[0], pointX);\n const y = lerp(nw[1], se[1], pointY);\n\n return worldToLngLat([x, y]);\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(g, bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n","import { BBox, Feature, Polygon, GeoJsonProperties } from \"geojson\";\nimport { polygon, Id } from \"@turf/helpers\";\n\n/**\n * Takes a bbox and returns an equivalent {@link Polygon|polygon}.\n *\n * @function\n * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @param {Object} [options={}] Optional parameters\n * @param {GeoJsonProperties} [options.properties={}] Translate properties to Polygon\n * @param {string|number} [options.id={}] Translate Id to Polygon\n * @returns {Feature<Polygon>} a Polygon representation of the bounding box\n * @example\n * var bbox = [0, 0, 10, 10];\n *\n * var poly = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [poly]\n */\nfunction bboxPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n bbox: BBox,\n options: {\n properties?: P;\n id?: Id;\n } = {}\n): Feature<Polygon, P> {\n // Convert BBox positions to Numbers\n // No performance loss for including Number()\n // https://github.com/Turfjs/turf/issues/1119\n const west = Number(bbox[0]);\n const south = Number(bbox[1]);\n const east = Number(bbox[2]);\n const north = Number(bbox[3]);\n\n if (bbox.length === 6) {\n throw new Error(\n \"@turf/bbox-polygon does not support BBox with 6 positions\"\n );\n }\n\n const lowLeft = [west, south];\n const topLeft = [west, north];\n const topRight = [east, north];\n const lowRight = [east, south];\n\n return polygon(\n [[lowLeft, lowRight, topRight, topLeft, lowLeft]],\n options.properties,\n { bbox, id: options.id }\n );\n}\n\nexport { bboxPolygon };\nexport default bboxPolygon;\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n geojson: AllGeoJSON,\n options: {\n recompute?: boolean;\n } = {}\n): BBox {\n if (geojson.bbox != null && true !== options.recompute) {\n return geojson.bbox;\n }\n const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, (coord) => {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nexport { bbox };\nexport default bbox;\n","import { Feature, LineString } from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getCoords } from \"@turf/invariant\";\n\n/**\n * Returns true if a point is on a line. Accepts a optional parameter to ignore the\n * start and end vertices of the linestring.\n *\n * @function\n * @param {Coord} pt GeoJSON Point\n * @param {Feature<LineString>} line GeoJSON LineString\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreEndVertices=false] whether to ignore the start and end vertices.\n * @param {number} [options.epsilon] Fractional number to compare with the cross product result. Useful for dealing with floating points such as lng/lat points\n * @returns {boolean} true/false\n * @example\n * var pt = turf.point([0, 0]);\n * var line = turf.lineString([[-1, -1],[1, 1],[1.5, 2.2]]);\n * var isPointOnLine = turf.booleanPointOnLine(pt, line);\n * //=true\n */\nfunction booleanPointOnLine(\n pt: Coord,\n line: Feature<LineString> | LineString,\n options: {\n ignoreEndVertices?: boolean;\n epsilon?: number;\n } = {}\n): boolean {\n // Normalize inputs\n const ptCoords = getCoord(pt);\n const lineCoords = getCoords(line);\n\n // Main\n for (let i = 0; i < lineCoords.length - 1; i++) {\n let ignoreBoundary: boolean | string = false;\n if (options.ignoreEndVertices) {\n if (i === 0) {\n ignoreBoundary = \"start\";\n }\n if (i === lineCoords.length - 2) {\n ignoreBoundary = \"end\";\n }\n if (i === 0 && i + 1 === lineCoords.length - 1) {\n ignoreBoundary = \"both\";\n }\n }\n if (\n isPointOnLineSegment(\n lineCoords[i],\n lineCoords[i + 1],\n ptCoords,\n ignoreBoundary,\n typeof options.epsilon === \"undefined\" ? null : options.epsilon\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\n// See http://stackoverflow.com/a/4833823/1979085\n// See https://stackoverflow.com/a/328122/1048847\n/**\n * @private\n * @param {Position} lineSegmentStart coord pair of start of line\n * @param {Position} lineSegmentEnd coord pair of end of line\n * @param {Position} pt coord pair of point to check\n * @param {boolean|string} excludeBoundary whether the point is allowed to fall on the line ends.\n * @param {number} epsilon Fractional number to compare with the cross product result. Useful for dealing with floating points such as lng/lat points\n * If true which end to ignore.\n * @returns {boolean} true/false\n */\nfunction isPointOnLineSegment(\n lineSegmentStart: number[],\n lineSegmentEnd: number[],\n pt: number[],\n excludeBoundary: string | boolean,\n epsilon: number | null\n): boolean {\n const x = pt[0];\n const y = pt[1];\n const x1 = lineSegmentStart[0];\n const y1 = lineSegmentStart[1];\n const x2 = lineSegmentEnd[0];\n const y2 = lineSegmentEnd[1];\n const dxc = pt[0] - x1;\n const dyc = pt[1] - y1;\n const dxl = x2 - x1;\n const dyl = y2 - y1;\n const cross = dxc * dyl - dyc * dxl;\n if (epsilon !== null) {\n if (Math.abs(cross) > epsilon) {\n return false;\n }\n } else if (cross !== 0) {\n return false;\n }\n\n // Special cases for zero length lines\n // https://github.com/Turfjs/turf/issues/2750\n if (Math.abs(dxl) === Math.abs(dyl) && Math.abs(dxl) === 0) {\n // Zero length line.\n if (excludeBoundary) {\n // To be on a zero length line pt has to be on the start (and end), BUT we\n // are excluding start and end from possible matches.\n return false;\n }\n if (pt[0] === lineSegmentStart[0] && pt[1] === lineSegmentStart[1]) {\n // If point is same as start (and end) it's on the line segment\n return true;\n } else {\n // Otherwise point is somewhere else\n return false;\n }\n }\n\n if (!excludeBoundary) {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 <= x && x <= x2 : x2 <= x && x <= x1;\n }\n return dyl > 0 ? y1 <= y && y <= y2 : y2 <= y && y <= y1;\n } else if (excludeBoundary === \"start\") {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 < x && x <= x2 : x2 <= x && x < x1;\n }\n return dyl > 0 ? y1 < y && y <= y2 : y2 <= y && y < y1;\n } else if (excludeBoundary === \"end\") {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 <= x && x < x2 : x2 < x && x <= x1;\n }\n return dyl > 0 ? y1 <= y && y < y2 : y2 < y && y <= y1;\n } else if (excludeBoundary === \"both\") {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 < x && x < x2 : x2 < x && x < x1;\n }\n return dyl > 0 ? y1 < y && y < y2 : y2 < y && y < y1;\n }\n return false;\n}\n\nexport { booleanPointOnLine };\nexport default booleanPointOnLine;\n","import {\n BBox,\n Feature,\n Geometry,\n LineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { bbox as calcBbox } from \"@turf/bbox\";\nimport { booleanPointOnLine } from \"@turf/boolean-point-on-line\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Boolean-within returns true if the first geometry is completely within the second geometry.\n * The interiors of both geometries must intersect and, the interior and boundary of the primary (geometry a)\n * must not intersect the exterior of the secondary (geometry b).\n * Boolean-within returns the exact opposite result of the `@turf/boolean-contains`.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @returns {boolean} true/false\n * @example\n * var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);\n * var point = turf.point([1, 2]);\n *\n * turf.booleanWithin(point, line);\n * //=true\n */\nfunction booleanWithin(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry\n): boolean {\n var geom1 = getGeom(feature1);\n var geom2 = getGeom(feature2);\n var type1 = geom1.type;\n var type2 = geom2.type;\n\n switch (type1) {\n case \"Point\":\n switch (type2) {\n case \"MultiPoint\":\n return isPointInMultiPoint(geom1, geom2);\n case \"LineString\":\n return booleanPointOnLine(geom1, geom2, { ignoreEndVertices: true });\n case \"Polygon\":\n case \"MultiPolygon\":\n return booleanPointInPolygon(geom1, geom2, { ignoreBoundary: true });\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n case \"MultiPoint\":\n switch (type2) {\n case \"MultiPoint\":\n return isMultiPointInMultiPoint(geom1, geom2);\n case \"LineString\":\n return isMultiPointOnLine(geom1, geom2);\n case \"Polygon\":\n case \"MultiPolygon\":\n return isMultiPointInPoly(geom1, geom2);\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n case \"LineString\":\n switch (type2) {\n case \"LineString\":\n return isLineOnLine(geom1, geom2);\n case \"Polygon\":\n case \"MultiPolygon\":\n return isLineInPoly(geom1, geom2);\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n case \"Polygon\":\n switch (type2) {\n case \"Polygon\":\n case \"MultiPolygon\":\n return isPolyInPoly(geom1, geom2);\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n default:\n throw new Error(\"feature1 \" + type1 + \" geometry not supported\");\n }\n}\n\nfunction isPointInMultiPoint(point: Point, multiPoint: MultiPoint) {\n var i;\n var output = false;\n for (i = 0; i < multiPoint.coordinates.length; i++) {\n if (compareCoords(multiPoint.coordinates[i], point.coordinates)) {\n output = true;\n break;\n }\n }\n return output;\n}\n\nfunction isMultiPointInMultiPoint(\n multiPoint1: MultiPoint,\n multiPoint2: MultiPoint\n) {\n for (var i = 0; i < multiPoint1.coordinates.length; i++) {\n var anyMatch = false;\n for (var i2 = 0; i2 < multiPoint2.coordinates.length; i2++) {\n if (\n compareCoords(multiPoint1.coordinates[i], multiPoint2.coordinates[i2])\n ) {\n anyMatch = true;\n }\n }\n if (!anyMatch) {\n return false;\n }\n }\n return true;\n}\n\nfunction isMultiPointOnLine(multiPoint: MultiPoint, lineString: LineString) {\n var foundInsidePoint = false;\n\n for (var i = 0; i < multiPoint.coordinates.length; i++) {\n if (!booleanPointOnLine(multiPoint.coordinates[i], lineString)) {\n return false;\n }\n if (!foundInsidePoint) {\n foundInsidePoint = booleanPointOnLine(\n multiPoint.coordinates[i],\n lineString,\n { ignoreEndVertices: true }\n );\n }\n }\n return foundInsidePoint;\n}\n\nfunction isMultiPointInPoly(multiPoint: MultiPoint, polygon: Polygon) {\n var output = true;\n var oneInside = false;\n var isInside = false;\n for (var i = 0; i < multiPoint.coordinates.length; i++) {\n isInside = booleanPointInPolygon(multiPoint.coordinates[i], polygon);\n if (!isInside) {\n output = false;\n break;\n }\n if (!oneInside) {\n isInside = booleanPointInPolygon(multiPoint.coordinates[i], polygon, {\n ignoreBoundary: true,\n });\n }\n }\n return output && isInside;\n}\n\nfunction isLineOnLine(lineString1: LineString, lineString2: LineString) {\n for (var i = 0; i < lineString1.coordinates.length; i++) {\n if (!booleanPointOnLine(lineString1.coordinates[i], lineString2)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isLineInPoly(linestring: LineString, polygon: Polygon) {\n var polyBbox = calcBbox(polygon);\n var lineBbox = calcBbox(linestring);\n if (!doBBoxOverlap(polyBbox, lineBbox)) {\n return false;\n }\n var foundInsidePoint = false;\n\n for (var i = 0; i < linestring.coordinates.length; i++) {\n if (!booleanPointInPolygon(linestring.coordinates[i], polygon)) {\n return false;\n }\n if (!foundInsidePoint) {\n foundInsidePoint = booleanPointInPolygon(\n linestring.coordinates[i],\n polygon,\n { ignoreBoundary: true }\n );\n }\n if (!foundInsidePoint && i < linestring.coordinates.length - 1) {\n var midpoint = getMidpoint(\n linestring.coordinates[i],\n linestring.coordinates[i + 1]\n );\n foundInsidePoint = booleanPointInPolygon(midpoint, polygon, {\n ignoreBoundary: true,\n });\n }\n }\n return foundInsidePoint;\n}\n\n/**\n * Is Polygon2 in Polygon1\n * Only takes into account outer rings\n *\n * @private\n * @param {Polygon} geometry1\n * @param {Polygon|MultiPolygon} geometry2\n * @returns {boolean} true/false\n */\nfunction isPolyInPoly(geometry1: Polygon, geometry2: Polygon | MultiPolygon) {\n var poly1Bbox = calcBbox(geometry1);\n var poly2Bbox = calcBbox(geometry2);\n if (!doBBoxOverlap(poly2Bbox, poly1Bbox)) {\n return false;\n }\n for (var i = 0; i < geometry1.coordinates[0].length; i++) {\n if (!booleanPointInPolygon(geometry1.coordinates[0][i], geometry2)) {\n return false;\n }\n }\n return true;\n}\n\nfunction doBBoxOverlap(bbox1: BBox, bbox2: BBox) {\n if (bbox1[0] > bbox2[0]) return false;\n if (bbox1[2] < bbox2[2]) return false;\n if (bbox1[1] > bbox2[1]) return false;\n if (bbox1[3] < bbox2[3]) return false;\n return true;\n}\n\n/**\n * compareCoords\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {boolean} true/false if coord pairs match\n */\nfunction compareCoords(pair1: number[], pair2: number[]) {\n return pair1[0] === pair2[0] && pair1[1] === pair2[1];\n}\n\n/**\n * getMidpoint\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {Position} midpoint of pair1 and pair2\n */\nfunction getMidpoint(pair1: number[], pair2: number[]) {\n return [(pair1[0] + pair2[0]) / 2, (pair1[1] + pair2[1]) / 2];\n}\n\nexport { booleanWithin };\nexport default booleanWithin;\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // THe index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne;\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","type Comparator<T> = (a: T, b: T) => number;\ntype Predicate<T> = (value: T) => boolean;\n\nclass SplayTreeNode<K, Node extends SplayTreeNode<K, Node>> {\n readonly key: K;\n\n left: Node | null = null;\n right: Node | null = null;\n\n constructor(key: K) {\n this.key = key;\n }\n}\n\nclass SplayTreeSetNode<K> extends SplayTreeNode<K, SplayTreeSetNode<K>> {\n constructor(key: K) {\n super(key);\n }\n}\n\nclass SplayTreeMapNode<K, V> extends SplayTreeNode<K, SplayTreeMapNode<K, V>> {\n readonly value: V;\n\n constructor(key: K, value: V) {\n super(key);\n this.value = value;\n }\n\n replaceValue(value: V) {\n const node = new SplayTreeMapNode(this.key, value);\n node.left = this.left;\n node.right = this.right;\n return node;\n }\n}\n\nabstract class SplayTree<K, Node extends SplayTreeNode<K, Node>> {\n protected abstract root: Node | null;\n\n public size = 0;\n\n protected modificationCount = 0;\n\n protected splayCount = 0;\n\n protected abstract compare: Comparator<K>;\n\n protected abstract validKey: Predicate<unknown>;\n\n protected splay(key: K) {\n const root = this.root;\n if (root == null) {\n this.compare(key, key);\n return -1;\n }\n\n let right: Node | null = null;\n let newTreeRight: Node | null = null;\n let left: Node | null = null;\n let newTreeLeft: Node | null = null;\n let current = root;\n const compare = this.compare;\n let comp: number;\n while (true) {\n comp = compare(current.key, key);\n if (comp > 0) {\n let currentLeft = current.left;\n if (currentLeft == null) break;\n comp = compare(currentLeft.key, key);\n if (comp > 0) {\n current.left = currentLeft.right;\n currentLeft.right = current;\n current = currentLeft;\n currentLeft = current.left;\n if (currentLeft == null) break;\n }\n if (right == null) {\n newTreeRight = current;\n } else {\n right.left = current;\n }\n right = current;\n current = currentLeft;\n } else if (comp < 0) {\n let currentRight = current.right;\n if (currentRight == null) break;\n comp = compare(currentRight.key, key);\n if (comp < 0) {\n current.right = currentRight.left;\n currentRight.left = current;\n current = currentRight;\n currentRight = current.right;\n if (currentRight == null) break;\n }\n if (left == null) {\n newTreeLeft = current;\n } else {\n left.right = current;\n }\n left = current;\n current = currentRight;\n } else {\n break;\n }\n }\n if (left != null) {\n left.right = current.left;\n current.left = newTreeLeft;\n }\n if (right != null) {\n right.left = current.right;\n current.right = newTreeRight;\n }\n if (this.root !== current) {\n this.root = current;\n this.splayCount++;\n }\n return comp;\n }\n\n protected splayMin(node: Node) {\n let current = node;\n let nextLeft = current.left;\n while (nextLeft != null) {\n const left = nextLeft;\n current.left = left.right;\n left.right = current;\n current = left;\n nextLeft = current.left;\n }\n return current;\n }\n\n protected splayMax(node: Node) {\n let current = node;\n let nextRight = current.right;\n while (nextRight != null) {\n const right = nextRight;\n current.right = right.left;\n right.left = current;\n current = right;\n nextRight = current.right;\n }\n return current;\n }\n\n protected _delete(key: K) {\n if (this.root == null) return null;\n const comp = this.splay(key);\n if (comp != 0) return null;\n let root = this.root;\n const result = root;\n const left = root.left;\n this.size--;\n if (left == null) {\n this.root = root.right;\n } else {\n const right = root.right;\n root = this.splayMax(left);\n\n root.right = right;\n this.root = root;\n }\n this.modificationCount++;\n return result;\n }\n\n protected addNewRoot(node: Node, comp: number) {\n this.size++;\n this.modificationCount++;\n const root = this.root;\n if (root == null) {\n this.root = node;\n return;\n }\n if (comp < 0) {\n node.left = root;\n node.right = root.right;\n root.right = null;\n } else {\n node.right = root;\n node.left = root.left;\n root.left = null;\n }\n this.root = node;\n }\n\n protected _first() {\n const root = this.root;\n if (root == null) return null;\n this.root = this.splayMin(root);\n return this.root;\n }\n\n protected _last() {\n const root = this.root;\n if (root == null) return null;\n this.root = this.splayMax(root);\n return this.root;\n }\n\n public clear() {\n this.root = null;\n this.size = 0;\n this.modificationCount++;\n }\n\n public has(key: unknown) {\n return this.validKey(key) && this.splay(key as K) == 0;\n }\n\n protected defaultCompare(): Comparator<K> {\n return (a: K, b: K) => a < b ? -1 : a > b ? 1 : 0;\n }\n\n protected wrap(): SplayTreeWrapper<K, Node> {\n return {\n getRoot: () => { return this.root },\n setRoot: (root) => { this.root = root },\n getSize: () => { return this.size },\n getModificationCount: () => { return this.modificationCount },\n getSplayCount: () => { return this.splayCount },\n setSplayCount: (count) => { this.splayCount = count },\n splay: (key) => { return this.splay(key) },\n has: (key) => { return this.has(key) },\n };\n }\n}\n\nexport class SplayTreeMap<K, V> extends SplayTree<K, SplayTreeMapNode<K, V>> implements Iterable<[K, V]>, Map<K, V> {\n protected root: SplayTreeMapNode<K, V> | null = null;\n\n protected compare: Comparator<K>;\n protected validKey: Predicate<unknown>;\n\n constructor(compare?: Comparator<K>, isValidKey?: Predicate<unknown>) {\n super();\n this.compare = compare ?? this.defaultCompare();\n this.validKey = isValidKey ?? ((a: unknown) => a != null && a != undefined);\n }\n\n delete(key: unknown) {\n if (!this.validKey(key)) return false;\n return this._delete(key as K) != null;\n }\n\n forEach(f: (value: V, key: K, map: Map<K, V>) => void) {\n const nodes: Iterator<[K, V]> = new SplayTreeMapEntryIterableIterator<K, V>(this.wrap());\n let result: IteratorResult<[K, V]>;\n while (result = nodes.next(), !result.done) {\n f(result.value[1], result.value[0], this);\n }\n }\n\n get(key: unknown): V | undefined {\n if (!this.validKey(key)) return undefined;\n if (this.root != null) {\n const comp = this.splay(key as K);\n if (comp == 0) {\n return this.root!.value;\n }\n }\n return undefined;\n }\n\n hasValue(value: unknown) {\n const initialSplayCount = this.splayCount;\n const visit = (node: SplayTreeMapNode<K, V> | null) => {\n while (node != null) {\n if (node.value == value) return true;\n if (initialSplayCount != this.splayCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (node.right != null && visit(node.right)) {\n return true;\n }\n node = node.left;\n }\n return false;\n }\n\n return visit(this.root);\n }\n\n set(key: K, value: V) {\n const comp = this.splay(key);\n if (comp == 0) {\n this.root = this.root!.replaceValue(value);\n this.splayCount += 1;\n return this;\n }\n this.addNewRoot(new SplayTreeMapNode(key, value), comp);\n return this;\n }\n\n setAll(other: Map<K, V>) {\n other.forEach((value: V, key: K) => {\n this.set(key, value);\n });\n }\n\n setIfAbsent(key: K, ifAbsent: () => V) {\n let comp = this.splay(key);\n if (comp == 0) {\n return this.root!.value;\n }\n const modificationCount = this.modificationCount;\n const splayCount = this.splayCount;\n const value = ifAbsent();\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (splayCount != this.splayCount) {\n comp = this.splay(key);\n }\n this.addNewRoot(new SplayTreeMapNode(key, value), comp);\n return value;\n }\n\n isEmpty() {\n return this.root == null;\n }\n\n isNotEmpty() {\n return !this.isEmpty();\n }\n\n firstKey() {\n if (this.root == null) return null;\n return this._first()!.key;\n }\n\n lastKey() {\n if (this.root == null) return null;\n return this._last()!.key;\n }\n\n lastKeyBefore(key: K) {\n if (key == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(key);\n if (comp < 0) return this.root!.key;\n let node: SplayTreeMapNode<K, V> | null = this.root!.left;\n if (node == null) return null;\n let nodeRight = node.right;\n while (nodeRight != null) {\n node = nodeRight;\n nodeRight = node.right;\n }\n return node!.key;\n }\n\n firstKeyAfter(key: K) {\n if (key == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(key);\n if (comp > 0) return this.root!.key;\n let node: SplayTreeMapNode<K, V> | null = this.root!.right;\n if (node == null) return null;\n let nodeLeft = node.left;\n while (nodeLeft != null) {\n node = nodeLeft;\n nodeLeft = node.left;\n }\n return node!.key;\n }\n\n update(key: K, update: (value: V) => V, ifAbsent?: () => V) {\n let comp = this.splay(key);\n if (comp == 0) {\n const modificationCount = this.modificationCount;\n const splayCount = this.splayCount;\n const newValue = update(this.root!.value);\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (splayCount != this.splayCount) {\n this.splay(key);\n }\n this.root = this.root!.replaceValue(newValue);\n this.splayCount += 1;\n return newValue;\n }\n if (ifAbsent != null) {\n const modificationCount = this.modificationCount;\n const splayCount = this.splayCount;\n const newValue = ifAbsent();\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (splayCount != this.splayCount) {\n comp = this.splay(key);\n }\n this.addNewRoot(new SplayTreeMapNode(key, newValue), comp);\n return newValue;\n }\n throw \"Invalid argument (key): Key not in map.\"\n }\n\n updateAll(update: (key: K, value: V) => V) {\n const root = this.root;\n if (root == null) return;\n const iterator = new SplayTreeMapEntryIterableIterator(this.wrap());\n let node: IteratorResult<[K, V]>;\n while (node = iterator.next(), !node.done) {\n const newValue = update(...node.value);\n iterator.replaceValue(newValue);\n }\n }\n\n keys(): IterableIterator<K> {\n return new SplayTreeKeyIterableIterator<K, SplayTreeMapNode<K, V>>(this.wrap());\n }\n\n values(): IterableIterator<V> {\n return new SplayTreeValueIterableIterator<K, V>(this.wrap());\n }\n\n entries(): IterableIterator<[K, V]> {\n return this[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[K, V]> {\n return new SplayTreeMapEntryIterableIterator<K, V>(this.wrap());\n }\n\n [Symbol.toStringTag] = '[object Map]'\n}\n\nexport class SplayTreeSet<E> extends SplayTree<E, SplayTreeSetNode<E>> implements Iterable<E>, Set<E> {\n protected root: SplayTreeSetNode<E> | null = null;\n\n protected compare: Comparator<E>;\n protected validKey: Predicate<unknown>;\n\n constructor(compare?: Comparator<E>, isValidKey?: Predicate<unknown>) {\n super();\n this.compare = compare ?? this.defaultCompare();\n this.validKey = isValidKey ?? ((v: unknown) => v != null && v != undefined );\n }\n\n delete(element: unknown) {\n if (!this.validKey(element)) return false;\n return this._delete(element as E) != null;\n }\n\n deleteAll(elements: Iterable<unknown>) {\n for (const element of elements) {\n this.delete(element);\n }\n }\n\n forEach(f: (element: E, element2: E, set: Set<E>) => void) {\n const nodes: Iterator<E> = this[Symbol.iterator]();\n let result: IteratorResult<E>;\n while (result = nodes.next(), !result.done) {\n f(result.value, result.value, this);\n }\n }\n\n add(element: E) {\n const compare = this.splay(element);\n if (compare != 0) this.addNewRoot(new SplayTreeSetNode(element), compare);\n return this;\n }\n\n addAndReturn(element: E) {\n const compare = this.splay(element);\n if (compare != 0) this.addNewRoot(new SplayTreeSetNode(element), compare);\n return this.root!.key;\n }\n\n addAll(elements: Iterable<E>) {\n for (const element of elements) {\n this.add(element);\n }\n }\n\n isEmpty() {\n return this.root == null;\n }\n\n isNotEmpty() {\n return this.root != null;\n }\n\n single() {\n if (this.size == 0) throw \"Bad state: No element\";\n if (this.size > 1) throw \"Bad state: Too many element\";\n return this.root!.key;\n }\n\n first() {\n if (this.size == 0) throw \"Bad state: No element\";\n return this._first()!.key;\n }\n\n last() {\n if (this.size == 0) throw \"Bad state: No element\";\n return this._last()!.key;\n }\n\n lastBefore(element: E) {\n if (element == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(element);\n if (comp < 0) return this.root!.key;\n let node: SplayTreeSetNode<E> | null = this.root!.left;\n if (node == null) return null;\n let nodeRight = node.right;\n while (nodeRight != null) {\n node = nodeRight;\n nodeRight = node.right;\n }\n return node!.key;\n }\n\n firstAfter(element: E) {\n if (element == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(element);\n if (comp > 0) return this.root!.key;\n let node: SplayTreeSetNode<E> | null = this.root!.right;\n if (node == null) return null;\n let nodeLeft = node.left;\n while (nodeLeft != null) {\n node = nodeLeft;\n nodeLeft = node.left;\n }\n return node!.key;\n }\n\n retainAll(elements: Iterable<unknown>) {\n const retainSet = new SplayTreeSet<E>(this.compare, this.validKey);\n const modificationCount = this.modificationCount;\n for (const object of elements) {\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (this.validKey(object) && this.splay(object as E) == 0) {\n retainSet.add(this.root!.key);\n }\n }\n if (retainSet.size != this.size) {\n this.root = retainSet.root;\n this.size = retainSet.size;\n this.modificationCount++;\n }\n }\n\n lookup(object: unknown): E | null {\n if (!this.validKey(object)) return null;\n const comp = this.splay(object as E);\n if (comp != 0) return null;\n return this.root!.key;\n }\n\n intersection(other: Set<unknown>): Set<E> {\n const result = new SplayTreeSet<E>(this.compare, this.validKey);\n for (const element of this) {\n if (other.has(element)) result.add(element);\n }\n return result;\n }\n\n difference(other: Set<unknown>): Set<E> {\n const result = new SplayTreeSet<E>(this.compare, this.validKey);\n for (const element of this) {\n if (!other.has(element)) result.add(element);\n }\n return result;\n }\n\n union(other: Set<E>): Set<E> {\n const u = this.clone();\n u.addAll(other);\n return u;\n }\n\n protected clone() {\n const set = new SplayTreeSet<E>(this.compare, this.validKey);\n set.size = this.size;\n set.root = this.copyNode<SplayTreeSetNode<E>>(this.root);\n return set;\n }\n\n protected copyNode<Node extends SplayTreeNode<E, Node>>(node: Node | null) {\n if (node == null) return null;\n function copyChildren(node: Node, dest: SplayTreeSetNode<E>) {\n let left: Node | null;\n let right: Node | null;\n do {\n left = node.left;\n right = node.right;\n if (left != null) {\n const newLeft = new SplayTreeSetNode<E>(left.key);\n dest.left = newLeft;\n copyChildren(left, newLeft);\n }\n if (right != null) {\n const newRight = new SplayTreeSetNode<E>(right.key);\n dest.right = newRight;\n node = right;\n dest = newRight;\n }\n } while (right != null);\n }\n\n const result = new SplayTreeSetNode<E>(node.key);\n copyChildren(node, result);\n return result;\n }\n\n toSet(): Set<E> {\n return this.clone();\n }\n\n entries(): IterableIterator<[E, E]> {\n return new SplayTreeSetEntryIterableIterator<E, SplayTreeSetNode<E>>(this.wrap());\n }\n\n keys(): IterableIterator<E> {\n return this[Symbol.iterator]();\n }\n \n values(): IterableIterator<E> {\n return this[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<E> {\n return new SplayTreeKeyIterableIterator<E, SplayTreeSetNode<E>>(this.wrap());\n }\n\n [Symbol.toStringTag] = '[object Set]'\n}\n\ninterface SplayTreeWrapper<K, Node extends SplayTreeNode<K, Node>> {\n getRoot: () => Node | null;\n setRoot: (root: Node | null) => void;\n getSize: () => number;\n getModificationCount: () => number;\n getSplayCount: () => number;\n setSplayCount: (count: number) => void;\n splay: (key: K) => number;\n has: (key: unknown) => boolean;\n}\n\ntype SplayTreeMapWrapper<K, V> = SplayTreeWrapper<K, SplayTreeMapNode<K, V>>;\n\nabstract class SplayTreeIterableIterator<K, Node extends SplayTreeNode<K, Node>, T> implements IterableIterator<T> {\n protected readonly tree: SplayTreeWrapper<K, Node>;\n\n protected readonly path = new Array<Node>();\n\n protected modificationCount: number | null = null;\n\n protected splayCount: number;\n\n constructor(tree: SplayTreeWrapper<K, Node>) {\n this.tree = tree;\n this.splayCount = tree.getSplayCount();\n }\n\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n\n next(): IteratorResult<T, null> {\n if (this.moveNext()) return { done: false, value: this.current()! }\n return { done: true, value: null }\n }\n\n protected current() {\n if (!this.path.length) return null;\n const node = this.path[this.path.length - 1];\n return this.getValue(node);\n }\n\n protected rebuildPath(key: K) {\n this.path.splice(0, this.path.length)\n this.tree.splay(key);\n this.path.push(this.tree.getRoot()!);\n this.splayCount = this.tree.getSplayCount();\n }\n\n protected findLeftMostDescendent(node: Node | null) {\n while (node != null) {\n this.path.push(node);\n node = node.left;\n }\n }\n\n protected moveNext() {\n if (this.modificationCount != this.tree.getModificationCount()) {\n if (this.modificationCount == null) {\n this.modificationCount = this.tree.getModificationCount();\n let node = this.tree.getRoot();\n while (node != null) {\n this.path.push(node);\n node = node.left;\n }\n return this.path.length > 0;\n }\n throw \"Concurrent modification during iteration.\";\n }\n if (!this.path.length) return false;\n if (this.splayCount != this.tree.getSplayCount()) {\n this.rebuildPath(this.path[this.path.length - 1].key);\n }\n let node = this.path[this.path.length - 1];\n let next = node.right;\n if (next != null) {\n while (next != null) {\n this.path.push(next);\n next = next.left;\n }\n return true;\n }\n this.path.pop();\n while (this.path.length && this.path[this.path.length - 1].right === node) {\n node = this.path.pop()!;\n }\n return this.path.length > 0;\n }\n\n protected abstract getValue(node: Node): T\n}\n\nclass SplayTreeKeyIterableIterator<K, Node extends SplayTreeNode<K, Node>> extends SplayTreeIterableIterator<K, Node, K> {\n\n protected getValue(node: Node) {\n return node.key;\n }\n}\n\nclass SplayTreeSetEntryIterableIterator<K, Node extends SplayTreeNode<K, Node>> extends SplayTreeIterableIterator<K, Node, [K, K]> {\n\n protected getValue(node: Node): [K, K] {\n return [node.key, node.key];\n }\n}\n\nclass SplayTreeValueIterableIterator<K, V> extends SplayTreeIterableIterator<K, SplayTreeMapNode<K, V>, V> {\n\n constructor(map: SplayTreeMapWrapper<K, V>) {\n super(map);\n }\n\n protected getValue(node: SplayTreeMapNode<K, V>) {\n return node.value;\n }\n}\n\nclass SplayTreeMapEntryIterableIterator<K, V> extends SplayTreeIterableIterator<K, SplayTreeMapNode<K, V>, [K, V]> {\n\n constructor(map: SplayTreeMapWrapper<K, V>) {\n super(map);\n }\n\n protected getValue(node: SplayTreeMapNode<K, V>): [K, V] {\n return [node.key, node.value];\n }\n\n replaceValue(value: V) {\n if (this.modificationCount != this.tree.getModificationCount()) {\n throw \"Concurrent modification during iteration.\";\n }\n if (this.splayCount != this.tree.getSplayCount()) {\n this.rebuildPath(this.path[this.path.length - 1].key);\n }\n const last = this.path.pop()!;\n const newLast = last.replaceValue(value);\n if (!this.path.length) {\n this.tree.setRoot(newLast);\n } else {\n const parent = this.path[this.path.length - 1];\n if (last === parent.left) {\n parent.left = newLast;\n } else {\n parent.right = newLast;\n }\n }\n this.path.push(newLast);\n const count = this.tree.getSplayCount() + 1;\n this.tree.setSplayCount(count);\n this.splayCount = count;\n }\n}","import BigNumber from \"bignumber.js\";\nimport { Bbox } from \"./bbox.js\";\nimport { precision } from \"./precision.js\";\nimport Segment from \"./segment.js\";\nimport { Point } from \"./sweep-event.js\";\n\nexport type Ring = [number, number][]\nexport type Poly = Ring[]\nexport type MultiPoly = Poly[]\nexport type Geom = Poly | MultiPoly\n\nexport class RingIn {\n poly: PolyIn\n isExterior: boolean\n segments: Segment[]\n bbox: Bbox\n\n constructor(geomRing: Ring, poly: PolyIn, isExterior: boolean) {\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n this.poly = poly\n this.isExterior = isExterior\n this.segments = []\n\n if (\n typeof geomRing[0][0] !== \"number\" ||\n typeof geomRing[0][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n const firstPoint = precision.snap({ x: new BigNumber(geomRing[0][0]), y: new BigNumber(geomRing[0][1]) }) as Point\n this.bbox = {\n ll: { x: firstPoint.x, y: firstPoint.y },\n ur: { x: firstPoint.x, y: firstPoint.y },\n }\n\n let prevPoint = firstPoint\n for (let i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (\n typeof geomRing[i][0] !== \"number\" ||\n typeof geomRing[i][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n const point = precision.snap({ x: new BigNumber(geomRing[i][0]), y: new BigNumber(geomRing[i][1]) }) as Point\n // skip repeated points\n if (point.x.eq(prevPoint.x) && point.y.eq(prevPoint.y)) continue\n this.segments.push(Segment.fromRing(prevPoint, point, this))\n if (point.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = point.x\n if (point.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = point.y\n if (point.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = point.x\n if (point.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = point.y\n prevPoint = point\n }\n // add segment from last to first if last is not the same as first\n if (!firstPoint.x.eq(prevPoint.x) || !firstPoint.y.eq(prevPoint.y)) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this))\n }\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.segments.length; i < iMax; i++) {\n const segment = this.segments[i]\n sweepEvents.push(segment.leftSE)\n sweepEvents.push(segment.rightSE)\n }\n return sweepEvents\n }\n}\n\nexport class PolyIn {\n multiPoly: MultiPolyIn\n exteriorRing: RingIn\n interiorRings: RingIn[]\n bbox: Bbox\n\n constructor(geomPoly: Poly, multiPoly: MultiPolyIn) {\n if (!Array.isArray(geomPoly)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n this.exteriorRing = new RingIn(geomPoly[0], this, true)\n // copy by value\n this.bbox = {\n ll: { x: this.exteriorRing.bbox.ll.x, y: this.exteriorRing.bbox.ll.y },\n ur: { x: this.exteriorRing.bbox.ur.x, y: this.exteriorRing.bbox.ur.y },\n }\n this.interiorRings = []\n for (let i = 1, iMax = geomPoly.length; i < iMax; i++) {\n const ring = new RingIn(geomPoly[i], this, false)\n if (ring.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = ring.bbox.ll.x\n if (ring.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = ring.bbox.ll.y\n if (ring.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = ring.bbox.ur.x\n if (ring.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = ring.bbox.ur.y\n this.interiorRings.push(ring)\n }\n this.multiPoly = multiPoly\n }\n\n getSweepEvents() {\n const sweepEvents = this.exteriorRing.getSweepEvents()\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringSweepEvents = this.interiorRings[i].getSweepEvents()\n for (let j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n\nexport class MultiPolyIn {\n isSubject: boolean\n polys: PolyIn[]\n bbox: Bbox\n\n constructor(geom: Geom, isSubject: boolean) {\n if (!Array.isArray(geom)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === \"number\") geom = [geom as Poly]\n } catch (ex) {\n // The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n\n this.polys = []\n this.bbox = {\n ll: { x: new BigNumber(Number.POSITIVE_INFINITY), y: new BigNumber(Number.POSITIVE_INFINITY) },\n ur: { x: new BigNumber(Number.NEGATIVE_INFINITY), y: new BigNumber(Number.NEGATIVE_INFINITY) },\n }\n for (let i = 0, iMax = geom.length; i < iMax; i++) {\n const poly = new PolyIn(geom[i] as Poly, this)\n if (poly.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = poly.bbox.ll.x\n if (poly.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = poly.bbox.ll.y\n if (poly.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = poly.bbox.ur.x\n if (poly.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = poly.bbox.ur.y\n this.polys.push(poly)\n }\n this.isSubject = isSubject\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polySweepEvents = this.polys[i].getSweepEvents()\n for (let j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n","export default <T>(x: T) => {\n return () => {\n return x\n }\n}","import BigNumber from \"bignumber.js\"\nimport constant from \"./constant.js\"\n\nexport default (eps?: number) => {\n const almostEqual = eps ? (a: BigNumber, b: BigNumber) =>\n b.minus(a).abs().isLessThanOrEqualTo(eps)\n : constant(false)\n\n return (a: BigNumber, b: BigNumber) => {\n if (almostEqual(a, b)) return 0\n\n return a.comparedTo(b)\n }\n}","import BigNumber from \"bignumber.js\";\nimport constant from \"./constant.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default function (eps?: number) {\n const almostCollinear = eps ? (area2: BigNumber, ax: BigNumber, ay: BigNumber, cx: BigNumber, cy: BigNumber) =>\n area2.exponentiatedBy(2).isLessThanOrEqualTo(\n cx.minus(ax).exponentiatedBy(2).plus(cy.minus(ay).exponentiatedBy(2))\n .times(eps))\n : constant(false)\n\n return (a: Vector, b: Vector, c: Vector) => {\n const ax = a.x, ay = a.y, cx = c.x, cy = c.y\n\n const area2 = ay.minus(cy).times(b.x.minus(cx)).minus(ax.minus(cx).times(b.y.minus(cy)))\n\n if (almostCollinear(area2, ax, ay, cx, cy)) return 0\n\n return area2.comparedTo(0)\n }\n}","import BigNumber from \"bignumber.js\";\nimport { SplayTreeSet } from \"splaytree-ts\"\nimport compare from \"./compare.js\";\nimport identity from \"./identity.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default (eps?: number) => {\n if (eps) {\n\n const xTree = new SplayTreeSet(compare(eps))\n const yTree = new SplayTreeSet(compare(eps))\n\n const snapCoord = (coord: BigNumber, tree: SplayTreeSet<BigNumber>) => {\n return tree.addAndReturn(coord)\n }\n\n const snap = (v: Vector) => {\n return {\n x: snapCoord(v.x, xTree),\n y: snapCoord(v.y, yTree),\n } as Vector\n }\n\n snap({ x: new BigNumber(0), y: new BigNumber(0)})\n\n return snap\n }\n\n return identity<Vector>\n}","export default <T>(x: T) => {\n return x;\n}","import compare from \"./compare.js\";\nimport orient from \"./orient.js\";\nimport snap from \"./snap.js\";\n\nconst set = (eps?: number) => {\n return {\n set: (eps?: number) => { precision = set(eps) },\n reset: () => set(eps),\n compare: compare(eps),\n snap: snap(eps),\n orient: orient(eps)\n }\n}\n\nexport let precision: ReturnType<typeof set> = set()","import { Vector } from \"./vector.js\";\n\nexport interface Bbox {\n ll: Vector;\n ur: Vector;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\n\nexport const isInBbox = (bbox: Bbox, point: Vector) => {\n return (\n bbox.ll.x.isLessThanOrEqualTo(point.x) &&\n point.x.isLessThanOrEqualTo(bbox.ur.x) &&\n bbox.ll.y.isLessThanOrEqualTo(point.y) &&\n point.y.isLessThanOrEqualTo(bbox.ur.y) \n )\n}\n\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\nexport const getBboxOverlap = (b1: Bbox, b2: Bbox) => {\n // check if the bboxes overlap at all\n if (\n b2.ur.x.isLessThan(b1.ll.x) ||\n b1.ur.x.isLessThan(b2.ll.x) ||\n b2.ur.y.isLessThan(b1.ll.y) ||\n b1.ur.y.isLessThan(b2.ll.y) \n )\n return null\n\n // find the middle two X values\n const lowerX = b1.ll.x.isLessThan(b2.ll.x) ? b2.ll.x : b1.ll.x\n const upperX = b1.ur.x.isLessThan(b2.ur.x) ? b1.ur.x : b2.ur.x\n\n // find the middle two Y values\n const lowerY = b1.ll.y.isLessThan(b2.ll.y) ? b2.ll.y : b1.ll.y\n const upperY = b1.ur.y.isLessThan(b2.ur.y) ? b1.ur.y : b2.ur.y\n\n // put those middle values together to get the overlap\n return { ll: { x: lowerX, y: lowerY }, ur: { x: upperX, y: upperY } } as Bbox\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport { getBboxOverlap } from \"./bbox.js\"\nimport * as geomIn from \"./geom-in.js\"\nimport { Geom } from \"./geom-in.js\"\nimport * as geomOut from \"./geom-out.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent from \"./sweep-event.js\"\nimport SweepLine from \"./sweep-line.js\"\n\nexport class Operation {\n type!: string\n numMultiPolys!: number\n\n run(type: string, geom: Geom, moreGeoms: Geom[]) {\n operation.type = type\n\n /* Convert inputs to MultiPoly objects */\n const multipolys = [new geomIn.MultiPolyIn(geom, true)]\n for (let i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new geomIn.MultiPolyIn(moreGeoms[i], false))\n }\n operation.numMultiPolys = multipolys.length\n\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n if (operation.type === \"difference\") {\n // in place removal\n const subject = multipolys[0]\n let i = 1\n while (i < multipolys.length) {\n if (getBboxOverlap(multipolys[i].bbox, subject.bbox) !== null) i++\n else multipolys.splice(i, 1)\n }\n }\n\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n if (operation.type === \"intersection\") {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const mpA = multipolys[i]\n for (let j = i + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return []\n }\n }\n }\n\n /* Put segment endpoints in a priority queue */\n const queue = new SplayTreeSet(SweepEvent.compare)\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const sweepEvents = multipolys[i].getSweepEvents()\n for (let j = 0, jMax = sweepEvents.length; j < jMax; j++) {\n queue.add(sweepEvents[j])\n }\n }\n\n /* Pass the sweep line over those endpoints */\n const sweepLine = new SweepLine(queue)\n let evt = null\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n }\n while (evt) {\n const newEvents = sweepLine.process(evt)\n for (let i = 0, iMax = newEvents.length; i < iMax; i++) {\n const evt = newEvents[i]\n if (evt.consumedBy === undefined) queue.add(evt)\n }\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n } else {\n evt = null;\n }\n }\n\n // free some memory we don't need anymore\n precision.reset()\n\n /* Collect and compile segments we're keeping into a multipolygon */\n const ringsOut = geomOut.RingOut.factory(sweepLine.segments)\n const result = new geomOut.MultiPolyOut(ringsOut)\n return result.getGeom()\n }\n}\n\n// singleton available by import\nconst operation = new Operation()\n\nexport default operation\n","import * as bn from \"bignumber.js\";\n\nexport interface Vector {\n x: bn.BigNumber;\n y: bn.BigNumber;\n}\n\n/* Cross Product of two vectors with first point at origin */\nexport const crossProduct = (a: Vector, b: Vector) => a.x.times(b.y).minus(a.y.times(b.x))\n\n/* Dot Product of two vectors with first point at origin */\nexport const dotProduct = (a: Vector, b: Vector) => a.x.times(b.x).plus(a.y.times(b.y))\n\nexport const length = (v: Vector) => dotProduct(v, v).sqrt()\n\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const sineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return crossProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const cosineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return dotProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const horizontalIntersection = (pt: Vector, v: Vector, y: bn.BigNumber) => {\n if (v.y.isZero()) return null\n return { x: pt.x.plus((v.x.div(v.y)).times(y.minus(pt.y))), y: y }\n}\n\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const verticalIntersection = (pt: Vector, v: Vector, x: bn.BigNumber) => {\n if (v.x.isZero()) return null\n return { x: x, y: pt.y.plus((v.y.div(v.x)).times(x.minus(pt.x))) }\n}\n\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const intersection = (pt1: Vector, v1: Vector, pt2: Vector, v2: Vector) => {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x.isZero()) return verticalIntersection(pt2, v2, pt1.x)\n if (v2.x.isZero()) return verticalIntersection(pt1, v1, pt2.x)\n if (v1.y.isZero()) return horizontalIntersection(pt2, v2, pt1.y)\n if (v2.y.isZero()) return horizontalIntersection(pt1, v1, pt2.y)\n\n // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n const kross = crossProduct(v1, v2)\n if (kross.isZero()) return null\n\n const ve = { x: pt2.x.minus(pt1.x), y: pt2.y.minus(pt1.y) }\n const d1 = crossProduct(ve, v1).div(kross)\n const d2 = crossProduct(ve, v2).div(kross)\n\n // take the average of the two calculations to minimize rounding error\n const x1 = pt1.x.plus(d2.times(v1.x)),\n x2 = pt2.x.plus(d1.times(v2.x))\n const y1 = pt1.y.plus(d2.times(v1.y)),\n y2 = pt2.y.plus(d1.times(v2.y))\n const x = x1.plus(x2).div(2)\n const y = y1.plus(y2).div(2)\n return { x: x, y: y } as Vector\n}\n\n/* Given a vector, return one that is perpendicular */\nexport const perpendicular = (v: Vector) => {\n return { x: v.y.negated(), y: v.x }\n}","import BigNumber from \"bignumber.js\";\nimport Segment from \"./segment.js\"\nimport { cosineOfAngle, sineOfAngle, Vector } from \"./vector.js\"\n\nexport interface Point extends Vector {\n events: SweepEvent[];\n}\n\nexport default class SweepEvent {\n point: Point;\n isLeft: boolean;\n segment!: Segment;\n otherSE!: SweepEvent;\n consumedBy: SweepEvent | undefined;\n\n // for ordering sweep events in the sweep event queue\n static compare(a: SweepEvent, b: SweepEvent) {\n // favor event with a point that the sweep line hits first\n const ptCmp = SweepEvent.comparePoints(a.point, b.point)\n if (ptCmp !== 0) return ptCmp\n\n // the points are the same, so link them if needed\n if (a.point !== b.point) a.link(b)\n\n // favor right events over left\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1\n\n // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n return Segment.compare(a.segment, b.segment)\n }\n\n // for ordering points in sweep line order\n static comparePoints(aPt: Point, bPt: Point) {\n if (aPt.x.isLessThan(bPt.x)) return -1\n if (aPt.x.isGreaterThan(bPt.x)) return 1\n\n if (aPt.y.isLessThan(bPt.y)) return -1\n if (aPt.y.isGreaterThan(bPt.y)) return 1\n\n return 0\n }\n\n // Warning: 'point' input will be modified and re-used (for performance)\n constructor(point: Point, isLeft: boolean) {\n if (point.events === undefined) point.events = [this]\n else point.events.push(this)\n this.point = point\n this.isLeft = isLeft\n // this.segment, this.otherSE set by factory\n }\n\n link(other: SweepEvent) {\n if (other.point === this.point) {\n throw new Error(\"Tried to link already linked events\")\n }\n const otherEvents = other.point.events\n for (let i = 0, iMax = otherEvents.length; i < iMax; i++) {\n const evt = otherEvents[i]\n this.point.events.push(evt)\n evt.point = this.point\n }\n this.checkForConsuming()\n }\n\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n\n // Compare each pair of events to see if other events also match\n const numEvents = this.point.events.length\n for (let i = 0; i < numEvents; i++) {\n const evt1 = this.point.events[i]\n if (evt1.segment.consumedBy !== undefined) continue\n for (let j = i + 1; j < numEvents; j++) {\n const evt2 = this.point.events[j]\n if (evt2.consumedBy !== undefined) continue\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue\n evt1.segment.consume(evt2.segment)\n }\n }\n }\n\n getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n const events = []\n for (let i = 0, iMax = this.point.events.length; i < iMax; i++) {\n const evt = this.point.events[i]\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt)\n }\n }\n return events\n }\n\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n getLeftmostComparator(baseEvent: SweepEvent) {\n const cache = new Map<SweepEvent, { sine: BigNumber, cosine: BigNumber }>()\n\n const fillCache = (linkedEvent: SweepEvent) => {\n const nextEvent = linkedEvent.otherSE\n cache.set(linkedEvent, {\n sine: sineOfAngle(this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(this.point, baseEvent.point, nextEvent.point),\n })\n }\n\n return (a: SweepEvent, b: SweepEvent) => {\n if (!cache.has(a)) fillCache(a)\n if (!cache.has(b)) fillCache(b)\n\n const { sine: asine, cosine: acosine } = cache.get(a)!\n const { sine: bsine, cosine: bcosine } = cache.get(b)!\n\n // both on or above x-axis\n if (asine.isGreaterThanOrEqualTo(0) && bsine.isGreaterThanOrEqualTo(0)) {\n if (acosine.isLessThan(bcosine)) return 1\n if (acosine.isGreaterThan(bcosine)) return -1\n return 0\n }\n\n // both below x-axis\n if (asine.isLessThan(0) && bsine.isLessThan(0)) {\n if (acosine.isLessThan(bcosine)) return -1\n if (acosine.isGreaterThan(bcosine)) return 1\n return 0\n }\n\n // one above x-axis, one below\n if (bsine.isLessThan(asine)) return -1\n if (bsine.isGreaterThan(asine)) return 1\n return 0\n }\n }\n}\n","import { MultiPoly, Poly, Ring } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport Segment from \"./segment.js\"\nimport SweepEvent from \"./sweep-event.js\"\n\nexport class RingOut {\n events: SweepEvent[]\n poly: PolyOut | null\n _isExteriorRing: boolean | undefined\n _enclosingRing: RingOut | null | undefined\n \n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n static factory(allSegments: Segment[]) {\n const ringsOut = []\n\n for (let i = 0, iMax = allSegments.length; i < iMax; i++) {\n const segment = allSegments[i]\n if (!segment.isInResult() || segment.ringOut) continue\n\n let prevEvent = null\n let event = segment.leftSE\n let nextEvent = segment.rightSE\n const events = [event]\n\n const startingPoint = event.point\n const intersectionLEs = []\n\n /* Walk the chain of linked events to form a closed ring */\n while (true) {\n prevEvent = event\n event = nextEvent\n events.push(event)\n\n /* Is the ring complete? */\n if (event.point === startingPoint) break\n\n while (true) {\n const availableLEs = event.getAvailableLinkedEvents()\n\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n if (availableLEs.length === 0) {\n const firstPt = events[0].point\n const lastPt = events[events.length - 1].point\n throw new Error(\n `Unable to complete output ring starting at [${firstPt.x},` +\n ` ${firstPt.y}]. Last matching segment found ends at` +\n ` [${lastPt.x}, ${lastPt.y}].`,\n )\n }\n\n /* Only one way to go, so cotinue on the path */\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE\n break\n }\n\n /* We must have an intersection. Check for a completed loop */\n let indexLE = null\n for (let j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j\n break\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n if (indexLE !== null) {\n const intersectionLE = intersectionLEs.splice(indexLE)[0]\n const ringEvents = events.splice(intersectionLE.index)\n ringEvents.unshift(ringEvents[0].otherSE)\n ringsOut.push(new RingOut(ringEvents.reverse()))\n continue\n }\n /* register the intersection */\n intersectionLEs.push({\n index: events.length,\n point: event.point,\n })\n /* Choose the left-most option to continue the walk */\n const comparator = event.getLeftmostComparator(prevEvent)\n nextEvent = availableLEs.sort(comparator)[0].otherSE\n break\n }\n }\n\n ringsOut.push(new RingOut(events))\n }\n return ringsOut\n }\n\n constructor(events: SweepEvent[]) {\n this.events = events\n for (let i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this\n }\n this.poly = null\n }\n\n getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n let prevPt = this.events[0].point\n const points = [prevPt]\n for (let i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n const pt = this.events[i].point\n const nextPt = this.events[i + 1].point\n if (precision.orient(pt, prevPt, nextPt) === 0) continue\n points.push(pt)\n prevPt = pt\n }\n\n // ring was all (within rounding error of angle calc) colinear points\n if (points.length === 1) return null\n\n // check if the starting point is necessary\n const pt = points[0]\n const nextPt = points[1]\n if (precision.orient(pt, prevPt, nextPt) === 0) points.shift()\n\n points.push(points[0])\n const step = this.isExteriorRing() ? 1 : -1\n const iStart = this.isExteriorRing() ? 0 : points.length - 1\n const iEnd = this.isExteriorRing() ? points.length : -1\n const orderedPoints: Ring = []\n for (let i = iStart; i != iEnd; i += step)\n orderedPoints.push([points[i].x.toNumber(), points[i].y.toNumber()])\n return orderedPoints\n }\n\n isExteriorRing(): boolean {\n if (this._isExteriorRing === undefined) {\n const enclosing = this.enclosingRing()\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true\n }\n return this._isExteriorRing\n }\n\n enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing()\n }\n return this._enclosingRing\n }\n\n /* Returns the ring that encloses this one, if any */\n _calcEnclosingRing(): RingOut | null | undefined {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n let leftMostEvt = this.events[0]\n for (let i = 1, iMax = this.events.length; i < iMax; i++) {\n const evt = this.events[i]\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt\n }\n\n let prevSeg: Segment | null | undefined = leftMostEvt.segment.prevInResult()\n let prevPrevSeg: Segment | null | undefined = prevSeg ? prevSeg.prevInResult() : null\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null\n\n // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n if (!prevPrevSeg) return prevSeg.ringOut\n\n // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut?.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut\n } else return prevSeg.ringOut?.enclosingRing()\n }\n\n // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n prevSeg = prevPrevSeg.prevInResult()\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null\n }\n }\n}\n\nexport class PolyOut {\n exteriorRing: RingOut;\n interiorRings: RingOut[];\n\n constructor(exteriorRing: RingOut) {\n this.exteriorRing = exteriorRing\n exteriorRing.poly = this\n this.interiorRings = []\n }\n\n addInterior(ring: RingOut) {\n this.interiorRings.push(ring)\n ring.poly = this\n }\n\n getGeom() {\n const geom0 = this.exteriorRing.getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (geom0 === null) return null\n const geom: Poly = [geom0];\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringGeom = this.interiorRings[i].getGeom()\n // interior ring was all (within rounding error of angle calc) colinear points\n if (ringGeom === null) continue\n geom.push(ringGeom)\n }\n return geom\n }\n}\n\nexport class MultiPolyOut {\n rings: RingOut[];\n polys: PolyOut[];\n\n constructor(rings: RingOut[]) {\n this.rings = rings\n this.polys = this._composePolys(rings)\n }\n\n getGeom() {\n const geom: MultiPoly = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polyGeom = this.polys[i].getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (polyGeom === null) continue\n geom.push(polyGeom)\n }\n return geom\n }\n\n _composePolys(rings: RingOut[]) {\n const polys = []\n for (let i = 0, iMax = rings.length; i < iMax; i++) {\n const ring = rings[i]\n if (ring.poly) continue\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring))\n else {\n const enclosingRing = ring.enclosingRing()\n if (!enclosingRing?.poly) polys.push(new PolyOut(enclosingRing!))\n enclosingRing?.poly?.addInterior(ring)\n }\n }\n return polys\n }\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport Segment from \"./segment.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nexport default class SweepLine {\n private queue: SplayTreeSet<SweepEvent>\n private tree: SplayTreeSet<Segment>\n segments: Segment[]\n\n constructor(queue: SplayTreeSet<SweepEvent>, comparator = Segment.compare) {\n this.queue = queue\n this.tree = new SplayTreeSet(comparator)\n this.segments = []\n }\n\n process(event: SweepEvent) {\n const segment = event.segment\n const newEvents: SweepEvent[] = []\n\n // if we've already been consumed by another segment,\n // clean up our body parts and get out\n if (event.consumedBy) {\n if (event.isLeft) this.queue.delete(event.otherSE)\n else this.tree.delete(segment)\n return newEvents\n }\n\n if (event.isLeft) this.tree.add(segment);\n\n let prevSeg: Segment | null = segment\n let nextSeg: Segment | null = segment\n\n // skip consumed segments still in tree\n do {\n prevSeg = this.tree.lastBefore(prevSeg)\n } while (prevSeg != null && prevSeg.consumedBy != undefined)\n\n // skip consumed segments still in tree\n do {\n nextSeg = this.tree.firstAfter(nextSeg)\n } while (nextSeg != null && nextSeg.consumedBy != undefined)\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n let prevMySplitter = null\n if (prevSeg) {\n const prevInter = prevSeg.getIntersection(segment)\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter\n if (!prevSeg.isAnEndpoint(prevInter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, prevInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // Check for intersections against the next segment in the sweep line\n let nextMySplitter = null\n if (nextSeg) {\n const nextInter = nextSeg.getIntersection(segment)\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter\n if (!nextSeg.isAnEndpoint(nextInter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, nextInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n if (prevMySplitter !== null || nextMySplitter !== null) {\n let mySplitter = null\n if (prevMySplitter === null) mySplitter = nextMySplitter\n else if (nextMySplitter === null) mySplitter = prevMySplitter\n else {\n const cmpSplitters = SweepEvent.comparePoints(\n prevMySplitter,\n nextMySplitter,\n )\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter\n }\n\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n this.queue.delete(segment.rightSE)\n newEvents.push(segment.rightSE)\n\n const newEventsFromSplit = segment.split(mySplitter!)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.delete(segment)\n newEvents.push(event)\n } else {\n // done with left event\n this.segments.push(segment)\n segment.prev = prevSeg\n }\n } else {\n // event.isRight\n\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n const inter = prevSeg.getIntersection(nextSeg)\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n if (!nextSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n this.tree.delete(segment)\n }\n\n return newEvents\n }\n\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n _splitSafely(seg: Segment, pt: Point) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.delete(seg)\n const rightSE = seg.rightSE\n this.queue.delete(rightSE)\n const newEvents = seg.split(pt)\n newEvents.push(rightSE)\n // splitting can trigger consumption\n if (seg.consumedBy === undefined) this.tree.add(seg)\n return newEvents\n }\n}\n","import { getBboxOverlap, isInBbox } from \"./bbox.js\"\nimport { MultiPolyIn, RingIn } from \"./geom-in.js\"\nimport { RingOut } from \"./geom-out.js\"\nimport operation from \"./operation.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\nimport { intersection } from \"./vector.js\"\n\ninterface State {\n rings: RingIn[],\n windings: number[],\n multiPolys: MultiPolyIn[]\n}\n\n// Give segments unique ID's to get consistent sorting of\n// segments and sweep events when all else is identical\nlet segmentId = 0\n\nexport default class Segment {\n id: number\n leftSE: SweepEvent\n rightSE: SweepEvent\n rings: RingIn[] | null\n windings: number[] | null\n ringOut: RingOut | undefined\n consumedBy: Segment | undefined\n prev: Segment | null | undefined\n _prevInResult: Segment | null | undefined\n _beforeState: State | undefined\n _afterState: State | undefined\n _isInResult: boolean | undefined\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n static compare(a: Segment, b: Segment) {\n const alx = a.leftSE.point.x\n const blx = b.leftSE.point.x\n const arx = a.rightSE.point.x\n const brx = b.rightSE.point.x\n\n // check if they're even in the same vertical plane\n if (brx.isLessThan(alx)) return 1\n if (arx.isLessThan(blx)) return -1\n\n const aly = a.leftSE.point.y\n const bly = b.leftSE.point.y\n const ary = a.rightSE.point.y\n const bry = b.rightSE.point.y\n\n // is left endpoint of segment B the right-more?\n if (alx.isLessThan(blx)) {\n // are the two segments in the same horizontal plane?\n if (bly.isLessThan(aly) && bly.isLessThan(ary)) return 1\n if (bly.isGreaterThan(aly) && bly.isGreaterThan(ary)) return -1\n\n // is the B left endpoint colinear to segment A?\n const aCmpBLeft = a.comparePoint(b.leftSE.point)\n if (aCmpBLeft < 0) return 1\n if (aCmpBLeft > 0) return -1\n\n // is the A right endpoint colinear to segment B ?\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return -1\n }\n\n // is left endpoint of segment A the right-more?\n if (alx.isGreaterThan(blx)) {\n if (aly.isLessThan(bly) && aly.isLessThan(bry)) return -1\n if (aly.isGreaterThan(bly) && aly.isGreaterThan(bry)) return 1\n\n // is the A left endpoint colinear to segment B?\n const bCmpALeft = b.comparePoint(a.leftSE.point)\n if (bCmpALeft !== 0) return bCmpALeft\n\n // is the B right endpoint colinear to segment A?\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return 1\n }\n\n // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n\n // consider the lower left-endpoint to come first\n if (aly.isLessThan(bly)) return -1\n if (aly.isGreaterThan(bly)) return 1\n\n // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n\n // is the A right endpoint more left-more?\n if (arx.isLessThan(brx)) {\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n }\n\n // is the B right endpoint more left-more?\n if (arx.isGreaterThan(brx)) {\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n }\n\n if (!arx.eq(brx)) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n const ay = ary.minus(aly)\n const ax = arx.minus(alx)\n const by = bry.minus(bly)\n const bx = brx.minus(blx)\n if (ay.isGreaterThan(ax) && by.isLessThan(bx)) return 1\n if (ay.isLessThan(ax) && by.isGreaterThan(bx)) return -1\n }\n\n // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n if (arx.isGreaterThan(brx)) return 1\n if (arx.isLessThan(brx)) return -1\n\n // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n\n // consider the lower right-endpoint to come first\n if (ary.isLessThan(bry)) return -1\n if (ary.isGreaterThan(bry)) return 1\n\n // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n if (a.id < b.id) return -1\n if (a.id > b.id) return 1\n\n // identical segment, ie a === b\n return 0\n }\n\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n constructor(leftSE: SweepEvent, rightSE: SweepEvent, rings: RingIn[], windings: number[]) {\n this.id = ++segmentId\n this.leftSE = leftSE\n leftSE.segment = this\n leftSE.otherSE = rightSE\n this.rightSE = rightSE\n rightSE.segment = this\n rightSE.otherSE = leftSE\n this.rings = rings\n this.windings = windings\n // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n static fromRing(pt1: Point, pt2: Point, ring: RingIn) {\n let leftPt: Point, rightPt: Point, winding: number\n\n // ordering the two points according to sweep line ordering\n const cmpPts = SweepEvent.comparePoints(pt1, pt2)\n if (cmpPts < 0) {\n leftPt = pt1\n rightPt = pt2\n winding = 1\n } else if (cmpPts > 0) {\n leftPt = pt2\n rightPt = pt1\n winding = -1\n } else\n throw new Error(\n `Tried to create degenerate segment at [${pt1.x}, ${pt1.y}]`,\n )\n\n const leftSE = new SweepEvent(leftPt, true)\n const rightSE = new SweepEvent(rightPt, false)\n return new Segment(leftSE, rightSE, [ring], [winding])\n }\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n replaceRightSE(newRightSE: SweepEvent) {\n this.rightSE = newRightSE\n this.rightSE.segment = this\n this.rightSE.otherSE = this.leftSE\n this.leftSE.otherSE = this.rightSE\n }\n\n bbox() {\n const y1 = this.leftSE.point.y\n const y2 = this.rightSE.point.y\n return {\n ll: { x: this.leftSE.point.x, y: y1.isLessThan(y2) ? y1 : y2 },\n ur: { x: this.rightSE.point.x, y: y1.isGreaterThan(y2) ? y1 : y2 },\n }\n }\n\n /* A vector from the left point to the right */\n vector() {\n return {\n x: this.rightSE.point.x.minus(this.leftSE.point.x),\n y: this.rightSE.point.y.minus(this.leftSE.point.y),\n }\n }\n\n isAnEndpoint(pt: Point) {\n return (\n (pt.x.eq(this.leftSE.point.x) && pt.y.eq(this.leftSE.point.y)) ||\n (pt.x.eq(this.rightSE.point.x) && pt.y.eq(this.rightSE.point.y))\n )\n }\n\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n comparePoint(point: Point) {\n return precision.orient(this.leftSE.point, point, this.rightSE.point)\n }\n\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n getIntersection(other: Segment) {\n // If bboxes don't overlap, there can't be any intersections\n const tBbox = this.bbox()\n const oBbox = other.bbox()\n const bboxOverlap = getBboxOverlap(tBbox, oBbox)\n if (bboxOverlap === null) return null\n\n // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n const tlp = this.leftSE.point\n const trp = this.rightSE.point\n const olp = other.leftSE.point\n const orp = other.rightSE.point\n\n // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n const touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0\n const touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0\n const touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0\n const touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0\n\n // do left endpoints match?\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp\n if (!touchesThisRSE && touchesOtherRSE) return orp\n // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n return null\n }\n\n // does this left endpoint matches (other doesn't)\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x.eq(orp.x) && tlp.y.eq(orp.y)) return null\n }\n // t-intersection on left endpoint\n return tlp\n }\n\n // does other left endpoint matches (this doesn't)\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x.eq(olp.x) && trp.y.eq(olp.y)) return null\n }\n // t-intersection on left endpoint\n return olp\n }\n\n // trivial intersection on right endpoints\n if (touchesThisRSE && touchesOtherRSE) return null\n\n // t-intersections on just one right endpoint\n if (touchesThisRSE) return trp\n if (touchesOtherRSE) return orp\n\n // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n const pt = intersection(tlp, this.vector(), olp, other.vector())\n\n // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n if (pt === null) return null\n\n // is the intersection found between the lines not on the segments?\n if (!isInBbox(bboxOverlap, pt)) return null\n\n // round the the computed point if needed\n return precision.snap(pt) as Point\n }\n\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n split(point: Point) {\n const newEvents = []\n const alreadyLinked = point.events !== undefined\n\n const newLeftSE = new SweepEvent(point, true)\n const newRightSE = new SweepEvent(point, false)\n const oldRightSE = this.rightSE\n this.replaceRightSE(newRightSE)\n newEvents.push(newRightSE)\n newEvents.push(newLeftSE)\n const newSeg = new Segment(\n newLeftSE,\n oldRightSE,\n this.rings!.slice(),\n this.windings!.slice(),\n )\n\n // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n if (\n SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0\n ) {\n newSeg.swapEvents()\n }\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents()\n }\n\n // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n if (alreadyLinked) {\n newLeftSE.checkForConsuming()\n newRightSE.checkForConsuming()\n }\n\n return newEvents\n }\n\n /* Swap which event is left and right */\n swapEvents() {\n const tmpEvt = this.rightSE\n this.rightSE = this.leftSE\n this.leftSE = tmpEvt\n this.leftSE.isLeft = true\n this.rightSE.isLeft = false\n for (let i = 0, iMax = this.windings!.length; i < iMax; i++) {\n this.windings![i] *= -1\n }\n }\n\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n consume(other: Segment) {\n let consumer = this as Segment\n let consumee = other\n while (consumer.consumedBy) consumer = consumer.consumedBy\n while (consumee.consumedBy) consumee = consumee.consumedBy\n\n const cmp = Segment.compare(consumer, consumee)\n if (cmp === 0) return // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n if (cmp > 0) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n // make sure a segment doesn't consume it's prev\n if (consumer.prev === consumee) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n for (let i = 0, iMax = consumee.rings!.length; i < iMax; i++) {\n const ring = consumee.rings![i]\n const winding = consumee.windings![i]\n const index = consumer.rings!.indexOf(ring)\n if (index === -1) {\n consumer.rings!.push(ring)\n consumer.windings!.push(winding)\n } else consumer.windings![index] += winding\n }\n consumee.rings = null\n consumee.windings = null\n consumee.consumedBy = consumer\n\n // mark sweep events consumed as to maintain ordering in sweep event queue\n consumee.leftSE.consumedBy = consumer.leftSE\n consumee.rightSE.consumedBy = consumer.rightSE\n }\n\n /* The first segment previous segment chain that is in the result */\n prevInResult(): Segment | null | undefined {\n if (this._prevInResult !== undefined) return this._prevInResult\n if (!this.prev) this._prevInResult = null\n else if (this.prev.isInResult()) this._prevInResult = this.prev\n else this._prevInResult = this.prev.prevInResult()\n return this._prevInResult\n }\n\n beforeState(): State {\n if (this._beforeState !== undefined) return this._beforeState\n if (!this.prev)\n this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: [],\n }\n else {\n const seg = this.prev.consumedBy || this.prev\n this._beforeState = seg.afterState()\n }\n return this._beforeState\n }\n\n afterState() {\n if (this._afterState !== undefined) return this._afterState\n\n const beforeState = this.beforeState()\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: [],\n }\n const ringsAfter = this._afterState.rings\n const windingsAfter = this._afterState.windings\n const mpsAfter = this._afterState.multiPolys\n\n // calculate ringsAfter, windingsAfter\n for (let i = 0, iMax = this.rings!.length; i < iMax; i++) {\n const ring = this.rings![i]\n const winding = this.windings![i]\n const index = ringsAfter.indexOf(ring)\n if (index === -1) {\n ringsAfter.push(ring)\n windingsAfter.push(winding)\n } else windingsAfter[index] += winding\n }\n\n // calcualte polysAfter\n const polysAfter = []\n const polysExclude = []\n for (let i = 0, iMax = ringsAfter.length; i < iMax; i++) {\n if (windingsAfter[i] === 0) continue // non-zero rule\n const ring = ringsAfter[i]\n const poly = ring.poly\n if (polysExclude.indexOf(poly) !== -1) continue\n if (ring.isExterior) polysAfter.push(poly)\n else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly)\n const index = polysAfter.indexOf(ring.poly)\n if (index !== -1) polysAfter.splice(index, 1)\n }\n }\n\n // calculate multiPolysAfter\n for (let i = 0, iMax = polysAfter.length; i < iMax; i++) {\n const mp = polysAfter[i].multiPoly\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp)\n }\n\n return this._afterState\n }\n\n /* Is this segment part of the final result? */\n isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false\n\n if (this._isInResult !== undefined) return this._isInResult\n\n const mpsBefore = this.beforeState().multiPolys\n const mpsAfter = this.afterState().multiPolys\n\n switch (operation.type) {\n case \"union\": {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n const noBefores = mpsBefore.length === 0\n const noAfters = mpsAfter.length === 0\n this._isInResult = noBefores !== noAfters\n break\n }\n\n case \"intersection\": {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n let least\n let most\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length\n most = mpsAfter.length\n } else {\n least = mpsAfter.length\n most = mpsBefore.length\n }\n this._isInResult = most === operation.numMultiPolys && least < most\n break\n }\n\n case \"xor\": {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n const diff = Math.abs(mpsBefore.length - mpsAfter.length)\n this._isInResult = diff % 2 === 1\n break\n }\n\n case \"difference\": {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n const isJustSubject = (mps: MultiPolyIn[]) => mps.length === 1 && mps[0].isSubject\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter)\n break\n }\n }\n\n return this._isInResult\n }\n}\n","import { Geom } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport operation from \"./operation.js\"\n\nexport { Geom }\n\nexport const union = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"union\", geom, moreGeoms)\n\nexport const intersection = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"intersection\", geom, moreGeoms)\n\nexport const xor = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"xor\", geom, moreGeoms)\n\nexport const difference = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"difference\", geom, moreGeoms)\n\nexport const setPrecision = precision.set","import {\n Feature,\n GeoJsonProperties,\n MultiPolygon,\n Polygon,\n FeatureCollection,\n} from \"geojson\";\nimport { multiPolygon, polygon } from \"@turf/helpers\";\nimport { geomEach } from \"@turf/meta\";\nimport * as polyclip from \"polyclip-ts\";\n\n/**\n * Takes {@link Polygon|polygon} or {@link MultiPolygon|multi-polygon} geometries and\n * finds their polygonal intersection. If they don't intersect, returns null.\n *\n * @function\n * @param {FeatureCollection<Polygon | MultiPolygon>} features the features to intersect\n * @param {Object} [options={}] Optional Parameters\n * @param {Object} [options.properties={}] Translate GeoJSON Properties to Feature\n * @returns {Feature|null} returns a feature representing the area they share (either a {@link Polygon} or\n * {@link MultiPolygon}). If they do not share any area, returns `null`.\n * @example\n * var poly1 = turf.polygon([[\n * [-122.801742, 45.48565],\n * [-122.801742, 45.60491],\n * [-122.584762, 45.60491],\n * [-122.584762, 45.48565],\n * [-122.801742, 45.48565]\n * ]]);\n *\n * var poly2 = turf.polygon([[\n * [-122.520217, 45.535693],\n * [-122.64038, 45.553967],\n * [-122.720031, 45.526554],\n * [-122.669906, 45.507309],\n * [-122.723464, 45.446643],\n * [-122.532577, 45.408574],\n * [-122.487258, 45.477466],\n * [-122.520217, 45.535693]\n * ]]);\n *\n * var intersection = turf.intersect(turf.featureCollection([poly1, poly2]));\n *\n * //addToMap\n * var addToMap = [poly1, poly2, intersection];\n */\nfunction intersect<P extends GeoJsonProperties = GeoJsonProperties>(\n features: FeatureCollection<Polygon | MultiPolygon>,\n options: {\n properties?: P;\n } = {}\n): Feature<Polygon | MultiPolygon, P> | null {\n const geoms: polyclip.Geom[] = [];\n\n geomEach(features, (geom) => {\n geoms.push(geom.coordinates as polyclip.Geom);\n });\n\n if (geoms.length < 2) {\n throw new Error(\"Must specify at least 2 geometries\");\n }\n const intersection = polyclip.intersection(geoms[0], ...geoms.slice(1));\n if (intersection.length === 0) return null;\n if (intersection.length === 1)\n return polygon(intersection[0], options.properties);\n return multiPolygon(intersection, options.properties);\n}\n\nexport { intersect };\nexport default intersect;\n","import {lngLatToWorld} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform WGS84 coordinates to tile coords.\n * It's the inverse of deck.gl coordinate-transform (https://github.com/visgl/deck.gl/blob/master/modules/geo-layers/src/mvt-layer/coordinate-transform.js)\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformToTileCoords<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = projectFlat([west, north]);\n const se = projectFlat([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = inverseLerp(nw[0], se[0], pointX);\n const y = inverseLerp(nw[1], se[1], pointY);\n\n return [x, y];\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(projectFlat(g), bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n\nfunction projectFlat(xyz: Position): Position {\n return lngLatToWorld(xyz);\n}\n\nfunction inverseLerp(a: number, b: number, x: number): number {\n return (x - a) / (b - a);\n}\n","import type {BBox} from 'geojson';\nimport type {SpatialFilter} from '../types.js';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport booleanWithin from '@turf/boolean-within';\nimport intersect from '@turf/intersect';\nimport {feature, featureCollection} from '@turf/helpers';\nimport {TileFormat} from '../constants.js';\nimport {transformToTileCoords} from '../utils/transformToTileCoords.js';\nimport {\n cellToBoundary as quadbinCellToBoundary,\n geometryToCells as quadbinGeometryToCells,\n} from 'quadbin';\nimport {polygonToCells as h3PolygonToCells} from 'h3-js';\nimport bboxClip from '@turf/bbox-clip';\n\n// Computes intersections between spatial filters and tiles in various formats,\n// for pre-filtering each tile's features before performing widget calculations.\n//\n// Return types:\n// - true: All features in tile are within spatial filter.\n// - false: No features in tile are within spatial filter; skip tile.\n// - SpatialFilter/Set: Requires a more detailed per-feature check for each\n// feature in the tile. Provides a clipped spatial filter local to the tile\n// or, for spatial indexes, a set of indices (\"covering set\").\n//\n// Computing a covering set for spatial indexes may be very expensive for large\n// spatial filters and small cell resolutions. For example, a viewport at z=3\n// would contain ~18,000,000 raster cells at resolution=14. To avoid ever\n// creating a covering set of this size, compute per-tile (not global) coverings\n// when possible. For tiles fully inside or outside the spatial filter, creating\n// a covering set can be skipped.\n//\n// H3 is currently a special case where coverage must be computed for the entire\n// spatial filter; per-tile coverage would return a different result, because\n// H3 child cells are not fully contained within their parents.\n\n///////////////////////////////////////////////////////////////////////////////\n// GEOMETRY\n\n/** @internal */\nexport function intersectTileGeometry(\n tileBbox: BBox,\n tileFormat?: TileFormat,\n spatialFilter?: SpatialFilter\n): boolean | SpatialFilter {\n const tilePolygon = bboxPolygon(tileBbox);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([tilePolygon, feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n // Transform into local coordinates [0..1]. We assume MVT tiles use local\n // coordinates but geojson or binary features are already WGS84.\n return tileFormat === TileFormat.MVT\n ? transformToTileCoords(clippedSpatialFilter.geometry, tileBbox)\n : clippedSpatialFilter.geometry;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// RASTER\n\n/** @internal */\nexport function intersectTileRaster(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n) {\n return intersectTileQuadbin(parent, cellResolution, spatialFilter);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// QUADBIN\n\n/** @internal */\nexport function intersectTileQuadbin(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n): boolean | Set<bigint> {\n const tilePolygon = quadbinCellToBoundary(parent);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([feature(tilePolygon), feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n const cells = quadbinGeometryToCells(\n clippedSpatialFilter.geometry,\n cellResolution\n );\n\n return new Set(cells);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// H3\n\nconst BBOX_WEST: BBox = [-180, -90, 0, 90];\nconst BBOX_EAST: BBox = [0, -90, 180, 90];\n\n/** @internal */\nexport function intersectTileH3(\n cellResolution: number,\n spatialFilter?: SpatialFilter\n): true | Set<string> {\n if (!spatialFilter) {\n return true;\n }\n\n // Unlike quadbin and raster tiles, H3 children do not align to the parent's\n // boundaries. Per-tile coverage with `h3PolygonToCells` would return only\n // cells with _centers_ inside the clipped polygon — fewer cells. So for H3\n // we compute the coverage set for the entire spatial filter (more expensive).\n // In the future this could be replaced with `polygonToCellsExperimental`,\n // which can compute child cells in different modes.\n\n const spatialFilterFeature = feature(spatialFilter);\n\n // The current H3 polyfill algorithm can't deal with polygon segments of greater than 180 degrees longitude\n // so we clip the geometry to be sure that none of them is greater than 180 degrees\n // https://github.com/uber/h3-js/issues/24#issuecomment-431893796\n\n const cellsWest = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_WEST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n const cellsEast = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_EAST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n return new Set(cellsWest.concat(cellsEast));\n}\n","import {\n BBox,\n Feature,\n LineString,\n MultiLineString,\n MultiPolygon,\n GeoJsonProperties,\n Polygon,\n} from \"geojson\";\n\nimport {\n lineString,\n multiLineString,\n multiPolygon,\n polygon,\n} from \"@turf/helpers\";\nimport { getGeom } from \"@turf/invariant\";\nimport { lineclip, polygonclip } from \"./lib/lineclip.js\";\n\n/**\n * Takes a {@link Feature} and a bbox and clips the feature to the bbox using\n * [lineclip](https://github.com/mapbox/lineclip).\n * May result in degenerate edges when clipping Polygons.\n *\n * @function\n * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox\n * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature\n * @example\n * var bbox = [0, 0, 10, 10];\n * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);\n *\n * var clipped = turf.bboxClip(poly, bbox);\n *\n * //addToMap\n * var addToMap = [bbox, poly, clipped]\n */\nfunction bboxClip<\n G extends Polygon | MultiPolygon | LineString | MultiLineString,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(feature: Feature<G, P> | G, bbox: BBox) {\n const geom = getGeom(feature);\n const type = geom.type;\n const properties = feature.type === \"Feature\" ? feature.properties : {};\n let coords: any[] = geom.coordinates;\n\n switch (type) {\n case \"LineString\":\n case \"MultiLineString\": {\n const lines: any[] = [];\n if (type === \"LineString\") {\n coords = [coords];\n }\n coords.forEach((line) => {\n lineclip(line, bbox, lines);\n });\n if (lines.length === 1) {\n return lineString(lines[0], properties);\n }\n return multiLineString(lines, properties);\n }\n case \"Polygon\":\n return polygon(clipPolygon(coords, bbox), properties);\n case \"MultiPolygon\":\n return multiPolygon(\n coords.map((poly) => {\n return clipPolygon(poly, bbox);\n }),\n properties\n );\n default:\n throw new Error(\"geometry \" + type + \" not supported\");\n }\n}\n\nfunction clipPolygon(rings: number[][][], bbox: BBox) {\n const outRings = [];\n for (const ring of rings) {\n const clipped = polygonclip(ring, bbox);\n if (clipped.length > 0) {\n if (\n clipped[0][0] !== clipped[clipped.length - 1][0] ||\n clipped[0][1] !== clipped[clipped.length - 1][1]\n ) {\n clipped.push(clipped[0]);\n }\n if (clipped.length >= 4) {\n outRings.push(clipped);\n }\n }\n }\n return outRings;\n}\n\nexport { bboxClip };\nexport default bboxClip;\n","// Cohen-Sutherland line clipping algorithm, adapted to efficiently\n// handle polylines rather than just segments\nimport { BBox } from \"geojson\";\n\nexport function lineclip(\n points: number[][],\n bbox: BBox,\n result?: number[][][]\n): number[][][] {\n var len = points.length,\n codeA = bitCode(points[0], bbox),\n part = [] as number[][],\n i,\n codeB,\n lastCode;\n let a: number[];\n let b: number[];\n\n if (!result) result = [];\n\n for (i = 1; i < len; i++) {\n a = points[i - 1];\n b = points[i];\n codeB = lastCode = bitCode(b, bbox);\n\n while (true) {\n if (!(codeA | codeB)) {\n // accept\n part.push(a);\n\n if (codeB !== lastCode) {\n // segment went outside\n part.push(b);\n\n if (i < len - 1) {\n // start a new line\n result.push(part);\n part = [];\n }\n } else if (i === len - 1) {\n part.push(b);\n }\n break;\n } else if (codeA & codeB) {\n // trivial reject\n break;\n } else if (codeA) {\n // a outside, intersect with clip edge\n a = intersect(a, b, codeA, bbox)!;\n codeA = bitCode(a, bbox);\n } else {\n // b outside\n b = intersect(a, b, codeB, bbox)!;\n codeB = bitCode(b, bbox);\n }\n }\n\n codeA = lastCode;\n }\n\n if (part.length) result.push(part);\n\n return result;\n}\n\n// Sutherland-Hodgeman polygon clipping algorithm\n\nexport function polygonclip(points: number[][], bbox: BBox): number[][] {\n var result: number[][], edge, prev, prevInside, i, p, inside;\n\n // clip against each side of the clip rectangle\n for (edge = 1; edge <= 8; edge *= 2) {\n result = [];\n prev = points[points.length - 1];\n prevInside = !(bitCode(prev, bbox) & edge);\n\n for (i = 0; i < points.length; i++) {\n p = points[i];\n inside = !(bitCode(p, bbox) & edge);\n\n // if segment goes through the clip window, add an intersection\n if (inside !== prevInside) result.push(intersect(prev, p, edge, bbox)!);\n\n if (inside) result.push(p); // add a point if it's inside\n\n prev = p;\n prevInside = inside;\n }\n\n points = result;\n\n if (!points.length) break;\n }\n\n return result!;\n}\n\n// intersect a segment against one of the 4 lines that make up the bbox\n\nfunction intersect(\n a: number[],\n b: number[],\n edge: number,\n bbox: BBox\n): number[] | null {\n return edge & 8\n ? [a[0] + ((b[0] - a[0]) * (bbox[3] - a[1])) / (b[1] - a[1]), bbox[3]] // top\n : edge & 4\n ? [a[0] + ((b[0] - a[0]) * (bbox[1] - a[1])) / (b[1] - a[1]), bbox[1]] // bottom\n : edge & 2\n ? [bbox[2], a[1] + ((b[1] - a[1]) * (bbox[2] - a[0])) / (b[0] - a[0])] // right\n : edge & 1\n ? [bbox[0], a[1] + ((b[1] - a[1]) * (bbox[0] - a[0])) / (b[0] - a[0])] // left\n : null;\n}\n\n// bit code reflects the point position relative to the bbox:\n\n// left mid right\n// top 1001 1000 1010\n// mid 0001 0000 0010\n// bottom 0101 0100 0110\n\nfunction bitCode(p: number[], bbox: BBox) {\n var code = 0;\n\n if (p[0] < bbox[0]) code |= 1;\n // left\n else if (p[0] > bbox[2]) code |= 2; // right\n\n if (p[1] < bbox[1]) code |= 4;\n // bottom\n else if (p[1] > bbox[3]) code |= 8; // top\n\n return code;\n}\n","import intersects from '@turf/boolean-intersects';\nimport {transformTileCoordsToWGS84} from '../utils/transformTileCoordsToWGS84.js';\nimport {TileFormat} from '../constants.js';\nimport type {\n BBox,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from 'geojson';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n BinaryAttribute,\n BinaryFeature,\n BinaryGeometryType,\n BinaryLineFeature,\n BinaryPointFeature,\n BinaryPolygonFeature,\n TypedArrayConstructor,\n} from '@loaders.gl/schema';\nimport {intersectTileGeometry} from './tileIntersection.js';\n\nexport const FEATURE_GEOM_PROPERTY = '__geomValue';\n\ntype TileMap = Map<unknown, unknown>;\n\ntype TileDataInternal = {\n uniqueId: string | number | undefined;\n properties: any;\n numericProps: Record<string, number>;\n};\n\ntype GeometryExtractOptions = {\n storeGeometry?: boolean;\n};\n\nexport function tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options,\n}: {\n tiles: Tile[];\n tileFormat?: TileFormat;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}): FeatureData[] {\n const map = new Map();\n\n for (const tile of tiles) {\n // Discard if it's not a visible tile (only check false value, not undefined)\n // or tile has not data\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n const tileBbox = [\n tile.bbox.west,\n tile.bbox.south,\n tile.bbox.east,\n tile.bbox.north,\n ] as BBox;\n\n const intersection = intersectTileGeometry(\n tileBbox,\n tileFormat,\n spatialFilter\n );\n\n if (intersection === false) continue;\n\n const transformedSpatialFilter =\n intersection === true ? undefined : intersection;\n\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.points!,\n type: 'Point',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.lines!,\n type: 'LineString',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.polygons!,\n type: 'Polygon',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n return Array.from(map.values());\n}\n\nfunction processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n}: {\n map: TileMap;\n data: BinaryFeature;\n startIndex: number;\n endIndex: number;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n storeGeometry: boolean;\n spatialFilter?: Geometry;\n}) {\n const tileProps = getPropertiesFromTile(data, startIndex);\n const uniquePropertyValue = getUniquePropertyValue(\n tileProps,\n uniqueIdProperty,\n map\n );\n\n if (!uniquePropertyValue || map.has(uniquePropertyValue)) {\n return;\n }\n let geometry: Geometry | null = null;\n\n // Only calculate geometry if necessary\n if (storeGeometry || spatialFilter) {\n const {positions} = data;\n const ringCoordinates = getRingCoordinatesFor(\n startIndex,\n endIndex,\n positions\n );\n geometry = getFeatureByType(ringCoordinates, type);\n }\n\n // If intersection is required, check before proceeding\n if (geometry && spatialFilter && !intersects(geometry, spatialFilter)) {\n return;\n }\n\n const properties = parseProperties(tileProps);\n\n // Only save geometry if necessary\n if (storeGeometry && geometry) {\n properties[FEATURE_GEOM_PROPERTY] =\n tileFormat === TileFormat.MVT\n ? transformTileCoordsToWGS84(geometry, bbox)\n : geometry;\n }\n map.set(uniquePropertyValue, properties);\n}\n\nfunction addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n spatialFilter: Geometry;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n });\n }\n}\n\n// Despite TypeScript, 'data.type' is OPTIONAL. So 'type' must be passed in\n// separately. Observed missing .type for Redshift tilesets, 2025-04-09.\nfunction getIndices(data: BinaryFeature, type: BinaryGeometryType) {\n let indices: BinaryAttribute;\n switch (type) {\n case 'Polygon':\n indices = (data as BinaryPolygonFeature).primitivePolygonIndices;\n break;\n case 'LineString':\n indices = (data as BinaryLineFeature).pathIndices;\n break;\n case 'Point':\n indices = createIndicesForPoints(data as BinaryPointFeature);\n break;\n default:\n throw new Error(\n `Unsupported geometry type: ${type as unknown as string}`\n );\n }\n return indices.value;\n}\n\nfunction getFeatureId(data: BinaryFeature, startIndex: number) {\n return data.featureIds.value[startIndex];\n}\n\nfunction getPropertiesFromTile(data: BinaryFeature, startIndex: number) {\n const featureId = getFeatureId(data, startIndex);\n const {properties, numericProps, fields} = data;\n const result: TileDataInternal = {\n uniqueId: (fields?.[featureId] as {id: string | number})?.id,\n properties: properties[featureId],\n numericProps: {},\n };\n\n for (const key in numericProps) {\n result.numericProps[key] = numericProps[key].value[startIndex];\n }\n\n return result;\n}\n\nfunction parseProperties(tileProps: TileDataInternal) {\n const {properties, numericProps} = tileProps;\n return Object.assign({}, properties, numericProps);\n}\n\nfunction getUniquePropertyValue(\n tileProps: TileDataInternal,\n uniqueIdProperty: string | undefined,\n map: TileMap\n) {\n if (uniqueIdProperty) {\n return getValueFromTileProps(tileProps, uniqueIdProperty);\n }\n\n if (tileProps.uniqueId) {\n return tileProps.uniqueId;\n }\n\n const artificialId = map.size + 1; // a counter, assumed as a valid new id\n return (\n getValueFromTileProps(tileProps, 'cartodb_id') ||\n getValueFromTileProps(tileProps, 'geoid') ||\n artificialId\n );\n}\n\nfunction getValueFromTileProps(\n tileProps: TileDataInternal,\n propertyName: string\n) {\n const {properties, numericProps} = tileProps;\n return numericProps[propertyName] || properties[propertyName];\n}\n\nfunction getFeatureByType(\n coordinates: Position[],\n type: BinaryGeometryType\n): Polygon | LineString | Point {\n switch (type) {\n case 'Polygon':\n return {type: 'Polygon', coordinates: [coordinates]};\n case 'LineString':\n return {type: 'LineString', coordinates};\n case 'Point':\n return {type: 'Point', coordinates: coordinates[0]};\n default:\n throw new Error('Invalid geometry type');\n }\n}\n\nfunction getRingCoordinatesFor(\n startIndex: number,\n endIndex: number,\n positions: BinaryAttribute\n) {\n const ringCoordinates = [];\n\n for (let j = startIndex; j < endIndex; j++) {\n ringCoordinates.push(\n Array.from(\n positions.value.subarray(j * positions.size, (j + 1) * positions.size)\n )\n );\n }\n\n return ringCoordinates;\n}\n\nfunction calculateFeatures({\n map,\n spatialFilter,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n spatialFilter?: SpatialFilter;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n if (!data?.properties.length) {\n return;\n }\n\n if (!spatialFilter) {\n addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n } else {\n addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n}\n\nfunction addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n });\n }\n}\n\n/**\n * BinaryPointFeature does not include indices, so we generate in-memory\n * indices to allow processing points similarly to other topologies.\n */\nfunction createIndicesForPoints(data: BinaryPointFeature): BinaryAttribute {\n const featureIds = data.featureIds.value;\n const lastFeatureId = featureIds[featureIds.length - 1];\n const PointIndicesArray = featureIds.constructor as TypedArrayConstructor;\n\n const pointIndices: BinaryAttribute = {\n value: new PointIndicesArray(featureIds.length + 1),\n size: 1,\n };\n pointIndices.value.set(featureIds);\n pointIndices.value.set([lastFeatureId + 1], featureIds.length);\n return pointIndices;\n}\n","import {SpatialIndex} from '../constants.js';\nimport {getResolution as quadbinGetResolution} from 'quadbin';\nimport type {SpatialFilter, SpatialIndexTile} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {getResolution as h3GetResolution} from 'h3-js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialDataType} from '../sources/types.js';\nimport {intersectTileH3, intersectTileQuadbin} from './tileIntersection.js';\n\nexport type TileFeaturesSpatialIndexOptions = {\n tiles: SpatialIndexTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n};\n\nexport function tileFeaturesSpatialIndex({\n tiles,\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n}: TileFeaturesSpatialIndexOptions): FeatureData[] {\n const map = new Map();\n const spatialIndex = getSpatialIndex(spatialDataType);\n const cellResolution = getResolution(tiles, spatialIndex);\n const spatialIndexIDName = spatialDataColumn\n ? spatialDataColumn\n : spatialIndex;\n\n if (!cellResolution) {\n return [];\n }\n\n let intersection: undefined | boolean | Set<bigint | string>;\n\n // Compute H3 intersection globally, Quadbin intersection per-tile. See tileIntersection.ts.\n if (spatialIndex === SpatialIndex.H3) {\n intersection = intersectTileH3(cellResolution as number, spatialFilter);\n }\n\n for (const tile of tiles) {\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n const parent = getTileIndex(tile, spatialIndex);\n intersection = intersectTileQuadbin(\n parent as bigint,\n cellResolution as bigint,\n spatialFilter\n );\n }\n\n if (!intersection) continue;\n\n tile.data.forEach((d: Feature) => {\n // @ts-expect-error Mixed types for cell indices.\n if (intersection === true || intersection.has(d.id as bigint | string)) {\n map.set(d.id, {...d.properties, [spatialIndexIDName]: d.id});\n }\n });\n }\n return Array.from(map.values());\n}\n\nfunction getTileIndex(\n tile: SpatialIndexTile,\n spatialIndex: SpatialIndex\n): bigint | string {\n if (spatialIndex === SpatialIndex.QUADBIN) {\n // @ts-expect-error Missing types for quadbin tile indices.\n return tile.index.q;\n }\n return tile.id;\n}\n\nfunction getResolution(\n tiles: SpatialIndexTile[],\n spatialIndex: SpatialIndex\n): bigint | number | undefined {\n const data = tiles.find((tile) => tile.data?.length)?.data;\n\n if (!data) {\n return;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n return Number(quadbinGetResolution(data[0].id));\n }\n\n if (spatialIndex === SpatialIndex.H3) {\n return h3GetResolution(data[0].id);\n }\n}\n\nfunction getSpatialIndex(spatialDataType: SpatialDataType): SpatialIndex {\n switch (spatialDataType) {\n case 'h3':\n return SpatialIndex.H3;\n case 'quadbin':\n return SpatialIndex.QUADBIN;\n default:\n throw new Error('Unexpected spatial data type');\n }\n}\n","/** @internal */\nexport const V3_MINOR_VERSION = '3.4';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_GEO_COLUMN = 'geom';\n\n/**\n * Fastly default limit is 8192; leave some padding.\n * @privateRemarks Source: @deck.gl/carto\n */\nexport const DEFAULT_MAX_LENGTH_URL = 7000;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport const DEFAULT_TILE_RESOLUTION = 0.5;\n\n/**\n * @todo TODO(v0.5): Update DEFAULT_TILE_RESOLUTION and remove this constant.\n * @internal\n */\nexport const REDUCED_QUERIES_TILE_RESOLUTION = 1;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_H3 = 4;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN = 6;\n\n/** @internal */\nexport const DEFAULT_AGGREGATION_EXP_ALIAS = '__aggregationValue';\nexport const DEFAULT_AGGREGATION_EXP = `1 AS ${DEFAULT_AGGREGATION_EXP_ALIAS}`;\n","import {cellToTile, getResolution, tileToCell} from 'quadbin';\nimport type {RasterTile, SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n RasterMetadata,\n RasterMetadataBand,\n SpatialDataType,\n} from '../sources/types.js';\nimport {intersectTileRaster} from './tileIntersection.js';\n\nexport type TileFeaturesRasterOptions = {\n tiles: RasterTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n rasterMetadata: RasterMetadata;\n};\n\nexport function tileFeaturesRaster({\n tiles,\n ...options\n}: TileFeaturesRasterOptions): FeatureData[] {\n // Cache band metadata for faster lookup while iterating over pixels.\n const metadataByBand: Record<string, RasterMetadataBand & {nodata: number}> =\n {};\n for (const band of options.rasterMetadata.bands) {\n // TODO(cleanup): Remove copy and cast after API is updated to return 'nodata' as a number.\n metadataByBand[band.name] = {...band, nodata: Number(band.nodata)};\n }\n\n // Omit empty and invisible tiles for simpler processing and types.\n tiles = tiles.filter(isRasterTileVisible);\n if (tiles.length === 0) return [];\n\n // Raster tiles, and all pixels, are quadbin cells. Resolution of a pixel is\n // the resolution of the tile, plus the number of subdivisions. Block size\n // must be square, N x N, where N is a power of two.\n const tileResolution = getResolution(tiles[0].index.q);\n const tileBlockSize = tiles[0].data!.blockSize;\n const cellResolution = tileResolution + BigInt(Math.log2(tileBlockSize));\n\n const data = new Map<bigint, FeatureData>();\n\n for (const tile of tiles as Required<RasterTile>[]) {\n const parent = tile.index.q;\n\n const intersection = intersectTileRaster(\n parent,\n cellResolution,\n options.spatialFilter\n );\n\n if (intersection === false) continue;\n\n const tileSortedCells = cellToChildrenRaster(parent, cellResolution);\n\n // For each pixel/cell within the spatial filter, create a FeatureData.\n // Order is row-major, starting from NW and ending at SE.\n for (let i = 0; i < tileSortedCells.length; i++) {\n if (intersection !== true && !intersection.has(tileSortedCells[i])) {\n continue;\n }\n\n const cellData: FeatureData = {};\n let cellDataExists = false;\n\n for (const band in tile.data.cells.numericProps) {\n const value = tile.data.cells.numericProps[band].value[i];\n const bandMetadata = metadataByBand[band];\n\n if (isValidBandValue(value, bandMetadata.nodata)) {\n cellData[band] = tile.data.cells.numericProps[band].value[i];\n cellDataExists = true;\n }\n }\n\n if (cellDataExists) {\n data.set(tileSortedCells[i], cellData);\n }\n }\n }\n\n return Array.from(data.values());\n}\n\n/**\n * Detects whether a given {@link Tile} is a {@link RasterTile}.\n * @privateRemarks Method of detection is arbitrary, and may be changed.\n */\nexport function isRasterTile(tile: Tile): tile is RasterTile {\n return !!(tile.data as Record<string, unknown>)?.cells;\n}\n\nfunction isRasterTileVisible(tile: RasterTile): tile is Required<RasterTile> {\n return !!(tile.isVisible && tile.data?.cells?.numericProps);\n}\n\n/**\n * Alternative to `quadbin` module's `cellToChildren()` function, modified to\n * return cells in row-major order, NW to SE, as stored in CARTO raster tiles.\n * Sorting after computing cells is too slow.\n */\nfunction cellToChildrenRaster(parent: bigint, resolution: bigint): bigint[] {\n const parentTile = cellToTile(parent);\n\n // 1. Calculate x/y/z of upper left pixel in raster tile.\n const childZ = Number(resolution);\n const blockSize = 2 ** (childZ - parentTile.z);\n const childBaseX = parentTile.x * blockSize;\n const childBaseY = parentTile.y * blockSize;\n\n // 2. Iterate pixels in raster tile order; compute cell ID from base x/y.\n const cells: bigint[] = [];\n for (let i = 0, il = blockSize ** 2; i < il; i++) {\n const x = childBaseX + (i % blockSize);\n const y = childBaseY + Math.floor(i / blockSize);\n cells.push(tileToCell({x, y, z: childZ}));\n }\n\n return cells;\n}\n\n/**\n * Returns true if the given value is valid (not NaN, not 'nodata')\n * for the given raster band.\n */\nfunction isValidBandValue(value: unknown, nodata: number): value is number {\n return Number.isNaN(value) ? false : nodata !== value;\n}\n","import type {FilterType} from './constants.js';\nimport type {Polygon, MultiPolygon, Feature} from 'geojson';\nimport type {BinaryFeature, BinaryFeatureCollection} from '@loaders.gl/schema';\n\n/******************************************************************************\n * MAP INSTANTIATION\n */\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport enum SchemaFieldType {\n Number = 'number',\n Bigint = 'bigint',\n String = 'string',\n Geometry = 'geometry',\n Timestamp = 'timestamp',\n Object = 'object',\n Boolean = 'boolean',\n Variant = 'variant',\n Unknown = 'unknown',\n}\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport interface SchemaField {\n name: string;\n type: SchemaFieldType; // Field type in the CARTO stack, common for all providers\n}\n\n/******************************************************************************\n * MAPS AND TILES\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Format = 'json' | 'geojson' | 'tilejson';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport type MapType = 'boundary' | 'query' | 'table' | 'tileset' | 'raster';\n\n/** @privateRemarks Source: cloud-native */\nexport type ProviderType =\n | 'bigquery'\n | 'postgres'\n | 'snowflake'\n | 'redshift'\n | 'databricks'\n | 'carto'\n | 'carto_dw';\n\n/**\n * Alias for GeoJSON 'BBox' type, semantically representing a viewport.\n * Order of values is \"west\", \"south\", \"east\", \"north\".\n */\nexport type Viewport = [number, number, number, number];\n\n/**\n * Subset of deck.gl's Tile2DHeader type, containing only the properties\n * required for local widget calculations. Deeper dependencies on deck.gl\n * APIs should be minimized within this library: @deck.gl/carto depends\n * on the API client, not the other way around.\n * @privateRemarks Source: @deck.gl/geo-layers\n */\nexport type Tile = {\n index: {x: number; y: number; z: number};\n id: string;\n bbox: {west: number; east: number; north: number; south: number};\n isVisible: boolean;\n data?: BinaryFeatureCollection;\n};\n\n/** Subset of deck.gl's Tile2DHeader type, for spatial indexes. */\nexport type SpatialIndexTile = Tile & {\n data?: (Feature & {id: bigint})[];\n};\n\nexport type RasterTile = Tile & {\n id: string;\n index: {q: bigint; i: string};\n data?: Raster;\n};\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Raster = {\n blockSize: number;\n cells: {\n numericProps: BinaryFeature['numericProps'];\n properties: BinaryFeature['properties'];\n };\n};\n\n/******************************************************************************\n * AGGREGATION\n */\n\n/**\n * Enum type for the different types of aggregations available for widgets.\n *\n * @privateRemarks Source: @carto/constants\n * @privateRemarks Converted from enum to type union, for improved declarative API.\n */\nexport type AggregationType =\n | 'count'\n | 'avg'\n | 'min'\n | 'max'\n | 'sum'\n | 'custom';\n\n/******************************************************************************\n * FILTERS\n */\n\n/** @privateRemarks Source: @carto/react-api */\nexport type SpatialFilter = Polygon | MultiPolygon;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport interface Filters {\n [column: string]: Filter;\n}\n\n/** @privateRemarks Source: @carto/react-api, @deck.gl/carto */\nexport interface Filter {\n [FilterType.IN]?: {owner?: string; values: number[] | string[]};\n /** [a, b] both are included. */\n [FilterType.BETWEEN]?: {owner?: string; values: number[][]};\n /** [a, b) a is included, b is not. */\n [FilterType.CLOSED_OPEN]?: {owner?: string; values: number[][]};\n [FilterType.TIME]?: {owner?: string; values: number[][]};\n [FilterType.STRING_SEARCH]?: {\n owner?: string;\n values: string[];\n params?: StringSearchOptions;\n };\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport type FilterLogicalOperator = 'and' | 'or';\n\n/**\n * Type for minimum or maximum value of an interval. Values 'null' and\n * 'undefined' are intentionally allowed, and represent an unbounded value.\n */\nexport type FilterIntervalExtremum = number | null | undefined;\nexport type FilterInterval = [FilterIntervalExtremum, FilterIntervalExtremum];\nexport type FilterIntervalComplete = [number, number];\n\nexport type StringSearchOptions = {\n useRegExp?: boolean;\n mustStart?: boolean;\n mustEnd?: boolean;\n caseSensitive?: boolean;\n keepSpecialCharacters?: boolean;\n};\n\n/******************************************************************************\n * GROUPING\n */\n\n/**\n * Defines a step size increment for use with {@link TimeSeriesRequestOptions}.\n *\n * @privateRemarks Source: @carto/react-core\n */\nexport type GroupDateType =\n | 'year'\n | 'month'\n | 'week'\n | 'day'\n | 'hour'\n | 'minute'\n | 'second';\n\n/******************************************************************************\n * SORTING\n */\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortColumnType = 'number' | 'string' | 'date';\n\n/******************************************************************************\n * SQL QUERY PARAMETERS\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameterValue =\n | string\n | number\n | boolean\n | Array<QueryParameterValue>\n | object;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type NamedQueryParameter = Record<string, QueryParameterValue>;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type PositionalQueryParameter = QueryParameterValue[];\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameters = NamedQueryParameter | PositionalQueryParameter;\n","import {SchemaFieldType, type Filter, type SchemaField} from './types.js';\nimport {FilterType} from './constants.js';\nimport type {SpatialDataType} from './sources/types.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\n/**\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n\ntype Row<T> = Record<string, T> | Record<string, T>[] | T[] | T;\n\n/**\n * Due to each data warehouse having its own behavior with columns,\n * we need to normalize them and transform every key to lowercase.\n *\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function normalizeObjectKeys<T, R extends Row<T>>(el: R): R {\n if (Array.isArray(el)) {\n return el.map((value) => normalizeObjectKeys(value)) as R;\n } else if (typeof el !== 'object') {\n return el;\n }\n\n return Object.entries(el as Record<string, T>).reduce(\n (acc, [key, value]) => {\n acc[key.toLowerCase()] =\n typeof value === 'object' && value ? normalizeObjectKeys(value) : value;\n return acc;\n },\n {} as Record<string, T>\n ) as R;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * @privateRemarks Source: @carto/react-core\n * @internal\n */\nexport class InvalidColumnError extends Error {\n protected static readonly NAME = 'InvalidColumnError';\n\n constructor(message: string) {\n super(`${InvalidColumnError.NAME}: ${message}`);\n this.name = InvalidColumnError.NAME;\n }\n\n static is(error: unknown) {\n return (\n error instanceof InvalidColumnError ||\n (error as Error).message?.includes(InvalidColumnError.NAME)\n );\n }\n}\n\nexport function isEmptyObject(object: object): boolean {\n for (const _ in object) {\n return false;\n }\n return true;\n}\n\n/** @internal */\nexport const isObject: (x: unknown) => boolean = (x) =>\n x !== null && typeof x === 'object';\n\n/** @internal */\nexport const isPureObject: (x: any) => boolean = (x) =>\n isObject(x) && x.constructor === {}.constructor;\n\n/**\n * Merges one or more source objects into a target object. Unlike `Object.assign`, does not\n * assign properties with undefined values. Null values will overwrite existing properties.\n */\nexport function assignOptional<T extends object, U, V>(\n target: T,\n source1: U,\n source2: V\n): T & U & V;\nexport function assignOptional<T extends object, U>(\n target: T,\n source: U\n): T & U;\nexport function assignOptional<T extends object, U>(\n target: T,\n ...sources: any[]\n): any {\n for (const source of sources) {\n for (const key in source) {\n if (source[key] !== undefined) {\n (target as Record<string, unknown>)[key] = source[key];\n }\n }\n }\n return target as T & U;\n}\n\n/**\n * Returns the spatialDataType expected for widget operations, given layer source props. The\n * spatialDataType used in widget operations may be different from that of the layer. For\n * dynamically aggregated point datasets, widgets use type 'geo', not the aggregation type.\n */\nexport function getWidgetSpatialDataType(\n spatialDataType: SpatialDataType,\n spatialDataColumn: string,\n schema: SchemaField[]\n): SpatialDataType {\n const field = schema.find((field) => field.name === spatialDataColumn);\n if (field && field.type === SchemaFieldType.Geometry) {\n return 'geo';\n }\n\n return spatialDataType;\n}\n","import type {\n RasterTile,\n SpatialFilter,\n SpatialIndexTile,\n Tile,\n} from '../types.js';\nimport {tileFeaturesGeometries} from './tileFeaturesGeometries.js';\nimport {tileFeaturesSpatialIndex} from './tileFeaturesSpatialIndex.js';\nimport {TileFormat} from '../constants.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {RasterMetadata, SpatialDataType} from '../sources/types.js';\nimport {isRasterTile, tileFeaturesRaster} from './tileFeaturesRaster.js';\nimport {assert} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatures = {\n tiles: Tile[];\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n rasterMetadata?: RasterMetadata;\n storeGeometry?: boolean;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatureExtractOptions = {\n storeGeometry?: boolean;\n spatialDataType?: SpatialDataType;\n spatialDataColumn?: string;\n uniqueIdProperty?: string;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function tileFeatures({\n tiles,\n spatialFilter,\n uniqueIdProperty,\n tileFormat,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialDataType,\n rasterMetadata,\n storeGeometry = false,\n}: TileFeatures): FeatureData[] {\n if (spatialDataType === 'geo') {\n return tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options: {storeGeometry},\n });\n }\n\n if (tiles.some(isRasterTile)) {\n assert(rasterMetadata, 'Missing raster metadata');\n return tileFeaturesRaster({\n tiles: tiles as RasterTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n rasterMetadata,\n });\n }\n\n return tileFeaturesSpatialIndex({\n tiles: tiles as SpatialIndexTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n });\n}\n","import type {Feature} from 'geojson';\nimport type {FilterLogicalOperator, Filters} from '../types.js';\nimport {FilterType} from '../constants.js';\nimport {_buildFeatureFilter} from '../filters/index.js';\nimport type {FeatureData} from '../types-internal.js';\n\ntype TimeFilter = Filters['string'][FilterType.TIME] & {\n params?: {offsetBy?: number};\n};\n\n/**\n * deck.gl's DataFilterExtension supports GPU filtering with 1–4 values. We\n * allocate filters[0] to generic filters and filters[1] to time filters.\n *\n * getFilterValue() _must_ return an array of the same size as the filterSize\n * used to initialize the DataFilterExtension. We document that users must use\n * filterSize=4 for compatibility with @link {getDataFilterExtensionProps}.\n */\nconst DEFAULT_FILTER_SIZE = 4;\n\n/** @experimental Prefer type definition from deck.gl. */\nexport type _DataFilterExtensionProps = {\n filterRange: number[][];\n updateTriggers: Record<string, string>;\n getFilterValue: (feature: Feature | FeatureData) => number[];\n};\n\n/**\n * Creates props for DataFilterExtension, from `@deck.gl/extensions`, given\n * a set of filters. Requires that DataFilterExtension is initialized with\n * filterSize=4, where the CARTO filters will occupy the first two slots.\n *\n * @example To create a deck.gl layer with GPU data filtering:\n * ```typescript\n * import {DataFilterExtension} from '@deck.gl/extensions';\n * import {VectorTileLayer} from '@deck.gl/layers';\n * import {getDataFilterExtensionProps} from '@carto/api-client';\n *\n * const layer = new VectorTileLayer({\n * data: data,\n * extensions: [new DataFilterExtension({filterSize: 4})],\n * ...getDataFilterExtensionProps(filters),\n * });\n * ```\n */\nexport function getDataFilterExtensionProps(\n filters: Filters,\n filtersLogicalOperator?: FilterLogicalOperator\n): _DataFilterExtensionProps {\n const {filtersWithoutTimeType, timeColumn, timeFilter} =\n getFiltersByType(filters);\n return {\n filterRange: getFilterRange(timeFilter, DEFAULT_FILTER_SIZE),\n updateTriggers: getUpdateTriggers(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter\n ),\n getFilterValue: getFilterValue(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n DEFAULT_FILTER_SIZE,\n filtersLogicalOperator\n ),\n };\n}\n\n/** @internal */\nfunction getFiltersByType(filters: Filters) {\n const filtersWithoutTimeType: Filters = {};\n\n let timeColumn: string | null = null;\n let timeFilter: TimeFilter | null = null;\n\n for (const [column, columnData] of Object.entries(filters)) {\n for (const [type, typeData] of Object.entries(columnData) as [\n FilterType,\n unknown,\n ][]) {\n if (type === FilterType.TIME) {\n timeColumn = column;\n timeFilter = typeData as TimeFilter;\n } else {\n filtersWithoutTimeType[column] = {[type]: typeData};\n }\n }\n }\n\n return {\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n };\n}\n\n/** @internal */\nfunction getFilterRange(\n timeFilter: TimeFilter | null,\n filterSize: number\n): number[][] {\n const result = Array(filterSize).fill([0, 0]);\n // According to getFilterValue all filters are resolved as 0 or 1 in the first position of the array\n // except the time filter value that is resolved with the real value of the feature in the second position of the array\n result[0] = [1, 1];\n if (timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n result[1] = timeFilter.values[0].map((v) => v - offsetBy);\n }\n return result;\n}\n\n/** @internal */\nfunction getUpdateTriggers(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null\n) {\n const result: Record<string, object> = {...filtersWithoutTimeType};\n\n // We don't want to change the layer UpdateTriggers every time that the time filter changes\n // because this filter is changed by the time series widget during its animation\n // so we remove the time filter value from the `updateTriggers`\n if (timeColumn && timeFilter) {\n result[timeColumn] = {\n ...result[timeColumn],\n offsetBy: timeFilter.params?.offsetBy,\n [FilterType.TIME]: {}, // Allows working with other filters, without an impact on performance.\n };\n }\n return {\n getFilterValue: JSON.stringify(result),\n };\n}\n\n/** @internal */\nfunction getFilterValue(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null,\n filterSize: number,\n filtersLogicalOperator?: FilterLogicalOperator\n) {\n const result = Array(filterSize).fill(0);\n const featureFilter = _buildFeatureFilter({\n filters: filtersWithoutTimeType,\n type: 'number',\n filtersLogicalOperator,\n });\n\n // We evaluate all filters except the time filter using _buildFeatureFilter function.\n // For the time filter, we return the value of the feature and we will change the getFilterRange result\n // every time this filter changes\n return (feature: Feature | FeatureData) => {\n result[0] = featureFilter(feature);\n\n if (timeColumn && timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n const f = (feature.properties || feature) as Record<string, unknown>;\n result[1] = (f[timeColumn] as number) - offsetBy;\n }\n return result;\n };\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type APIRequestType =\n | 'Map data'\n | 'Map instantiation'\n | 'Public map'\n | 'Tile stats'\n | 'SQL'\n | 'Basemap style';\n\nexport type APIErrorContext = {\n requestType: APIRequestType;\n mapId?: string;\n connection?: string;\n source?: string;\n type?: MapType;\n};\n\n/**\n *\n * Custom error for reported errors in CARTO Maps API.\n * Provides useful debugging information in console and context for applications.\n *\n */\nexport class CartoAPIError extends Error {\n /** Source error from server */\n error: Error;\n\n /** Context (API call & parameters) in which error occured */\n errorContext: APIErrorContext;\n\n /** Response from server */\n response?: Response;\n\n /** JSON Response from server */\n responseJson?: any;\n\n constructor(\n error: Error,\n errorContext: APIErrorContext,\n response?: Response,\n responseJson?: any\n ) {\n let responseString = 'Failed to connect';\n if (response) {\n responseString = 'Server returned: ';\n if (response.status === 400) {\n responseString += 'Bad request';\n } else if (response.status === 401 || response.status === 403) {\n responseString += 'Unauthorized access';\n } else if (response.status === 404) {\n responseString += 'Not found';\n } else {\n responseString += 'Error';\n }\n\n responseString += ` (${response.status}):`;\n }\n responseString += ` ${error.message || error}`;\n\n let message = `${errorContext.requestType} API request failed`;\n message += `\\n${responseString}`;\n for (const key of Object.keys(errorContext)) {\n if (key === 'requestType') continue;\n message += `\\n${formatErrorKey(key)}: ${(errorContext as any)[key]}`;\n }\n message += '\\n';\n\n super(message);\n\n this.name = 'CartoAPIError';\n this.response = response;\n this.responseJson = responseJson;\n this.error = error;\n this.errorContext = errorContext;\n }\n}\n\n/**\n * Converts camelCase to Camel Case\n */\nfunction formatErrorKey(key: string) {\n return key.replace(/([A-Z])/g, ' $1').replace(/^./, (s) => s.toUpperCase());\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type V3Endpoint = 'maps' | 'stats' | 'sql';\n\nfunction joinPath(...args: string[]): string {\n return args\n .map((part) => (part.endsWith('/') ? part.slice(0, -1) : part))\n .join('/');\n}\n\nfunction buildV3Path(\n apiBaseUrl: string,\n version: 'v3',\n endpoint: V3Endpoint,\n ...rest: string[]\n): string {\n return joinPath(apiBaseUrl, version, endpoint, ...rest);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildPublicMapUrl({\n apiBaseUrl,\n cartoMapId,\n}: {\n apiBaseUrl: string;\n cartoMapId: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', 'public', cartoMapId);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildStatsUrl({\n attribute,\n apiBaseUrl,\n connectionName,\n source,\n type,\n}: {\n attribute: string;\n apiBaseUrl: string;\n connectionName: string;\n source: string;\n type: MapType;\n}): string {\n if (type === 'query') {\n return buildV3Path(apiBaseUrl, 'v3', 'stats', connectionName, attribute);\n }\n\n // type === 'table'\n return buildV3Path(\n apiBaseUrl,\n 'v3',\n 'stats',\n connectionName,\n source,\n attribute\n );\n}\n\nexport function buildSourceUrl({\n apiBaseUrl,\n connectionName,\n endpoint,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n endpoint: MapType;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', connectionName, endpoint);\n}\n\nexport function buildQueryUrl({\n apiBaseUrl,\n connectionName,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'sql', connectionName, 'query');\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isPureObject} from '../utils.js';\nimport {CartoAPIError, type APIErrorContext} from './carto-api-error.js';\nimport {V3_MINOR_VERSION} from '../constants-internal.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {getClient} from '../client.js';\nimport type {LocalCacheOptions} from '../sources/types.js';\n\nconst DEFAULT_HEADERS = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n};\n\nconst DEFAULT_REQUEST_CACHE = new Map<string, Promise<unknown>>();\n\nexport async function requestWithParameters<T = any>({\n baseUrl,\n parameters = {},\n headers: customHeaders = {},\n errorContext,\n maxLengthURL = DEFAULT_MAX_LENGTH_URL,\n localCache,\n signal,\n}: {\n baseUrl: string;\n parameters?: Record<string, unknown>;\n headers?: Record<string, string>;\n errorContext: APIErrorContext;\n maxLengthURL?: number;\n localCache?: LocalCacheOptions;\n signal?: AbortSignal;\n}): Promise<T> {\n // Parameters added to all requests issued with `requestWithParameters()`.\n // These parameters override parameters already in the base URL, but not\n // user-provided parameters.\n parameters = {\n v: V3_MINOR_VERSION,\n client: getClient(),\n ...(typeof deck !== 'undefined' &&\n deck.VERSION && {deckglVersion: deck.VERSION}),\n ...parameters,\n };\n\n baseUrl = excludeURLParameters(baseUrl, Object.keys(parameters));\n const key = createCacheKey(baseUrl, parameters, customHeaders);\n\n const {\n cache: REQUEST_CACHE,\n canReadCache,\n canStoreInCache,\n } = getCacheSettings(localCache);\n\n if (canReadCache && REQUEST_CACHE.has(key)) {\n return REQUEST_CACHE.get(key) as Promise<T>;\n }\n\n const url = createURLWithParameters(baseUrl, parameters);\n const headers = {...DEFAULT_HEADERS, ...customHeaders};\n\n /* global fetch */\n const fetchPromise =\n url.length > maxLengthURL\n ? fetch(baseUrl, {\n method: 'POST',\n body: JSON.stringify(parameters),\n headers,\n signal,\n })\n : fetch(url, {headers, signal});\n\n let response: Response | undefined;\n let responseJson: unknown;\n const jsonPromise: Promise<T> = fetchPromise\n .then((_response: Response) => {\n response = _response;\n return response.json();\n })\n .then((json: any) => {\n responseJson = json;\n if (!response || !response.ok) {\n throw new Error(json.error);\n }\n return json;\n })\n .catch((error: Error) => {\n if (canStoreInCache) {\n REQUEST_CACHE.delete(key);\n }\n throw new CartoAPIError(error, errorContext, response, responseJson);\n });\n\n if (canStoreInCache) {\n REQUEST_CACHE.set(key, jsonPromise);\n }\n return jsonPromise;\n}\n\nfunction getCacheSettings(localCache: LocalCacheOptions | undefined) {\n const canReadCache = localCache?.cacheControl?.includes('no-cache')\n ? false\n : true;\n const canStoreInCache = localCache?.cacheControl?.includes('no-store')\n ? false\n : true;\n const cache = localCache?.cache || DEFAULT_REQUEST_CACHE;\n\n return {\n cache,\n canReadCache,\n canStoreInCache,\n };\n}\n\nfunction createCacheKey(\n baseUrl: string,\n parameters: Record<string, unknown>,\n headers: Record<string, string>\n): string {\n const parameterEntries = Object.entries(parameters).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n const headerEntries = Object.entries(headers).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n return JSON.stringify({\n baseUrl,\n parameters: parameterEntries,\n headers: headerEntries,\n });\n}\n\n/**\n * Appends query string parameters to a URL. Existing URL parameters are kept,\n * unless there is a conflict, in which case the new parameters override\n * those already in the URL.\n */\nfunction createURLWithParameters(\n baseUrlString: string,\n parameters: Record<string, unknown>\n): string {\n const baseUrl = new URL(baseUrlString);\n for (const [key, value] of Object.entries(parameters)) {\n if (isPureObject(value) || Array.isArray(value)) {\n baseUrl.searchParams.set(key, JSON.stringify(value));\n } else {\n if (value !== null && value !== undefined) {\n baseUrl.searchParams.set(\n key,\n (value as string | boolean | number).toString()\n );\n }\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Deletes query string parameters from a URL.\n */\nfunction excludeURLParameters(baseUrlString: string, parameters: string[]) {\n const baseUrl = new URL(baseUrlString);\n for (const param of parameters) {\n if (baseUrl.searchParams.has(param)) {\n baseUrl.searchParams.delete(param);\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Clears the HTTP response cache for all requests using the default cache.\n * @internal\n */\nexport function clearDefaultRequestCache() {\n DEFAULT_REQUEST_CACHE.clear();\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_API_BASE_URL} from '../constants.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {buildSourceUrl} from '../api/endpoints.js';\nimport {requestWithParameters} from '../api/request-with-parameters.js';\nimport type {\n SourceOptionalOptions,\n SourceRequiredOptions,\n TilejsonMapInstantiation,\n TilejsonResult,\n} from './types.js';\nimport type {MapType} from '../types.js';\nimport type {APIErrorContext} from '../api/index.js';\nimport {getClient} from '../client.js';\n\nexport const SOURCE_DEFAULTS: Omit<SourceOptionalOptions, 'clientId'> = {\n apiBaseUrl: DEFAULT_API_BASE_URL,\n headers: {},\n maxLengthURL: DEFAULT_MAX_LENGTH_URL,\n};\n\nexport async function baseSource<UrlParameters extends Record<string, unknown>>(\n endpoint: MapType,\n options: Partial<SourceOptionalOptions> & SourceRequiredOptions,\n urlParameters: UrlParameters\n): Promise<TilejsonResult> {\n const {accessToken, connectionName, cache, ...optionalOptions} = options;\n const mergedOptions = {\n ...SOURCE_DEFAULTS,\n clientId: getClient(),\n accessToken,\n connectionName,\n endpoint,\n };\n for (const key in optionalOptions) {\n if (optionalOptions[key as keyof typeof optionalOptions]) {\n (mergedOptions as any)[key] =\n optionalOptions[key as keyof typeof optionalOptions];\n }\n }\n const baseUrl = buildSourceUrl(mergedOptions);\n const {clientId, maxLengthURL, localCache} = mergedOptions;\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {client: clientId, ...options.tags, ...urlParameters};\n\n const errorContext: APIErrorContext = {\n requestType: 'Map instantiation',\n connection: options.connectionName,\n type: endpoint,\n source: JSON.stringify(parameters, undefined, 2),\n };\n const {tilejson, schema} =\n await requestWithParameters<TilejsonMapInstantiation>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n\n const dataUrl = tilejson.url[0];\n if (cache) {\n cache.value = parseInt(\n new URL(dataUrl).searchParams.get('cache') || '',\n 10\n );\n }\n errorContext.requestType = 'Map data';\n\n const json = await requestWithParameters<TilejsonResult>({\n baseUrl: dataUrl,\n parameters: {client: clientId},\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n if (accessToken) {\n json.accessToken = accessToken;\n }\n if (schema) {\n json.schema = schema;\n }\n return json;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {QueryParameters} from '../types.js';\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryQuerySourceOptions = SourceOptions &\n FilterOptions & {\n columns?: string[];\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: QueryParameters;\n };\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: Record<string, unknown> | unknown[];\n};\n\nexport type BoundaryQuerySourceResponse = TilejsonResult;\n\nexport const boundaryQuerySource = async function (\n options: BoundaryQuerySourceOptions\n): Promise<BoundaryQuerySourceResponse> {\n const {\n columns,\n filters,\n tilesetTableName,\n propertiesSqlQuery,\n queryParameters,\n } = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesSqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryTableSourceOptions = SourceOptions &\n FilterOptions & {\n tilesetTableName: string;\n columns?: string[];\n propertiesTableName: string;\n };\ntype UrlParameters = {\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n columns?: string;\n propertiesTableName: string;\n};\n\nexport type BoundaryTableSourceResponse = TilejsonResult;\n\nexport const boundaryTableSource = async function (\n options: BoundaryTableSourceOptions\n): Promise<BoundaryTableSourceResponse> {\n const {filters, tilesetTableName, columns, propertiesTableName} = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesTableName,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","import type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentRequestOptions,\n ExtentResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {FilterLogicalOperator, Filter} from '../types.js';\nimport {getClient} from '../client.js';\nimport type {SourceOptions} from '../sources/index.js';\nimport {ApiVersion, DEFAULT_API_BASE_URL} from '../constants.js';\n\nexport interface WidgetSourceProps extends Omit<SourceOptions, 'filters'> {\n apiVersion?: ApiVersion;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n}\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetSource<\n Props extends WidgetSourceProps = WidgetSourceProps,\n> {\n readonly props: Props;\n\n static defaultProps: Partial<WidgetSourceProps> = {\n apiVersion: ApiVersion.V3,\n apiBaseUrl: DEFAULT_API_BASE_URL,\n clientId: getClient(),\n filters: {},\n filtersLogicalOperator: 'and',\n };\n\n constructor(props: Props) {\n this.props = {\n ...WidgetSource.defaultProps,\n clientId: getClient(), // Refresh clientId, default may have changed.\n ...props,\n };\n }\n\n /**\n * Destroys the widget source and releases allocated resources.\n *\n * For remote sources (tables, queries) this has no effect, but for local\n * sources (tilesets, rasters) these resources will affect performance\n * and stability if many (10+) sources are created and not released.\n */\n destroy() {\n // no-op in most cases, but required for worker sources.\n }\n\n /**\n * Returns a list of labeled datapoints for categorical data. Suitable for\n * charts including grouped bar charts, pie charts, and tree charts.\n */\n abstract getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse>;\n\n /**\n * Given a list of feature IDs (as found in `_carto_feature_id`) returns all\n * matching features. In datasets containing features with duplicate geometries,\n * feature IDs may be duplicated (IDs are a hash of geometry) and so more\n * results may be returned than IDs in the request.\n * @internal\n * @experimental\n */\n abstract getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse>;\n\n /**\n * Returns a scalar numerical statistic over all matching data. Suitable\n * for 'headline' or 'scorecard' figures such as counts and sums.\n */\n abstract getFormula(options: FormulaRequestOptions): Promise<FormulaResponse>;\n\n /**\n * Returns a list of labeled datapoints for 'bins' of data defined as ticks\n * over a numerical range. Suitable for histogram charts.\n */\n abstract getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse>;\n\n /**\n * Returns a range (min and max) for a numerical column of matching rows.\n * Suitable for displaying certain 'headline' or 'scorecard' statistics,\n * or rendering a range slider UI for filtering.\n */\n abstract getRange(options: RangeRequestOptions): Promise<RangeResponse>;\n\n /**\n * Returns a list of bivariate datapoints defined as numerical 'x' and 'y'\n * values. Suitable for rendering scatter plots.\n */\n abstract getScatter(options: ScatterRequestOptions): Promise<ScatterResponse>;\n\n /**\n * Returns a list of arbitrary data rows, with support for pagination and\n * sorting. Suitable for displaying tables and lists.\n */\n abstract getTable(options: TableRequestOptions): Promise<TableResponse>;\n\n /**\n * Returns a series of labeled numerical values, grouped into equally-sized\n * time intervals. Suitable for rendering time series charts.\n */\n abstract getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse>;\n\n /**\n * Returns multiple aggregated values computed over matching data. Suitable\n * for aggregated statistics from pivoted tables, such as H3 tables with\n * pre-computed aggregations across multiple columns.\n */\n abstract getAggregations(\n options: AggregationsRequestOptions\n ): Promise<AggregationsResponse>;\n\n /** @experimental */\n abstract getExtent(options?: ExtentRequestOptions): Promise<ExtentResponse>;\n}\n","import {InvalidColumnError} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-api */\nexport interface ModelRequestOptions {\n method: 'GET' | 'POST';\n headers?: Record<string, string>;\n signal?: AbortSignal;\n otherOptions?: Record<string, unknown>;\n body?: string;\n}\n\ninterface ModelErrorResponse {\n error?: string | string[];\n hint?: string;\n column_name?: string;\n}\n\n/**\n * Return more descriptive error from API\n * @privateRemarks Source: @carto/react-api\n */\nexport function dealWithApiError({\n response,\n data,\n}: {\n response: Response;\n data: ModelErrorResponse;\n}) {\n if (data.error === 'Column not found') {\n throw new InvalidColumnError(`${data.error} ${data.column_name}`);\n }\n\n if (\n typeof data.error === 'string' &&\n data.error?.includes('Missing columns')\n ) {\n throw new InvalidColumnError(data.error);\n }\n\n switch (response.status) {\n case 401:\n throw new Error('Unauthorized access. Invalid credentials');\n case 403:\n throw new Error('Forbidden access to the requested data');\n default:\n throw new Error(\n data && data.error && typeof data.error === 'string'\n ? data.error\n : JSON.stringify(data?.hint || data.error?.[0])\n );\n }\n}\n\n/** @privateRemarks Source: @carto/react-api */\nexport async function makeCall({\n url,\n accessToken,\n opts,\n}: {\n url: string;\n accessToken: string;\n opts: ModelRequestOptions;\n}) {\n let response;\n let data;\n const isPost = opts?.method === 'POST';\n try {\n response = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...(isPost && {'Content-Type': 'application/json'}),\n ...opts.headers,\n },\n ...(isPost && {\n method: opts?.method,\n body: opts?.body,\n }),\n signal: opts?.signal,\n ...opts?.otherOptions,\n });\n data = await response.json();\n } catch (error) {\n if ((error as Error).name === 'AbortError') throw error;\n\n throw new Error(`Failed request: ${error as Error}`);\n }\n\n if (!response.ok) {\n dealWithApiError({response, data});\n }\n\n return data;\n}\n","import {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {\n Filter,\n FilterLogicalOperator,\n MapType,\n QueryParameters,\n SpatialFilter,\n} from '../types.js';\nimport {assert, isPureObject} from '../utils.js';\nimport {type ModelRequestOptions, makeCall} from './common.js';\nimport {ApiVersion} from '../constants.js';\nimport type {\n SpatialDataType,\n SpatialFilterPolyfillMode,\n} from '../sources/types.js';\n\n/** @privateRemarks Source: @carto/react-api */\nconst AVAILABLE_MODELS = [\n 'category',\n 'histogram',\n 'formula',\n 'pick',\n 'timeseries',\n 'range',\n 'scatterplot',\n 'table',\n 'aggregations',\n] as const;\n\nexport type Model = (typeof AVAILABLE_MODELS)[number];\n\nexport interface ModelSource {\n type: MapType;\n apiVersion: ApiVersion;\n apiBaseUrl: string;\n accessToken: string;\n clientId: string;\n connectionName: string;\n data: string;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n spatialFilter?: SpatialFilter;\n queryParameters?: QueryParameters;\n spatialDataColumn?: string;\n spatialDataType?: SpatialDataType;\n spatialFiltersMode?: SpatialFilterPolyfillMode;\n tags?: Record<string, string>;\n}\n\nconst {V3} = ApiVersion;\nconst REQUEST_GET_MAX_URL_LENGTH = 2048;\n\n/**\n * Execute a SQL model request.\n * @privateRemarks Source: @carto/react-api\n */\nexport function executeModel(props: {\n model: Model;\n source: ModelSource;\n params: Record<string, unknown>;\n opts?: Partial<ModelRequestOptions>;\n}) {\n assert(props.source, 'executeModel: missing source');\n assert(props.model, 'executeModel: missing model');\n assert(props.params, 'executeModel: missing params');\n\n assert(\n AVAILABLE_MODELS.includes(props.model),\n `executeModel: model provided isn't valid. Available models: ${AVAILABLE_MODELS.join(\n ', '\n )}`\n );\n\n const {model, source, params, opts} = props;\n const {type, apiVersion, apiBaseUrl, accessToken, connectionName, clientId} =\n source;\n\n assert(apiBaseUrl, 'executeModel: missing apiBaseUrl');\n assert(accessToken, 'executeModel: missing accessToken');\n assert(apiVersion === V3, 'executeModel: SQL Model API requires CARTO 3+');\n assert(type !== 'tileset', 'executeModel: Tilesets not supported');\n\n let url = `${apiBaseUrl}/v3/sql/${connectionName}/model/${model}`;\n\n const {\n data,\n filters,\n filtersLogicalOperator = 'and',\n spatialDataType = 'geo',\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialFiltersMode = 'intersects',\n tags,\n } = source;\n\n const queryParams: Record<string, unknown> = {\n type,\n client: clientId,\n source: data,\n params,\n queryParameters: source.queryParameters || '',\n filters,\n filtersLogicalOperator,\n ...(tags ?? {}),\n };\n\n queryParams.spatialDataType = spatialDataType;\n queryParams.spatialDataColumn = spatialDataColumn;\n\n if (source.spatialFilter) {\n // API supports multiple filters, we apply it only to spatialDataColumn\n queryParams.spatialFilters = {[spatialDataColumn]: source.spatialFilter};\n if (spatialDataType !== 'geo') {\n queryParams.spatialFiltersMode = spatialFiltersMode;\n }\n }\n\n const urlWithSearchParams =\n url + '?' + objectToURLSearchParams(queryParams).toString();\n const isGet = urlWithSearchParams.length <= REQUEST_GET_MAX_URL_LENGTH;\n if (isGet) {\n url = urlWithSearchParams;\n }\n return makeCall({\n url,\n accessToken: source.accessToken,\n opts: {\n ...opts,\n method: isGet ? 'GET' : 'POST',\n ...(!isGet && {body: JSON.stringify(queryParams)}),\n },\n });\n}\n\nfunction objectToURLSearchParams(object: Record<string, unknown>) {\n const params = new URLSearchParams();\n for (const key in object) {\n if (isPureObject(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (Array.isArray(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (object[key] === null) {\n params.append(key, 'null');\n } else if (object[key] !== undefined) {\n params.append(key, String(object[key] as unknown));\n }\n }\n return params;\n}\n","import {FilterType} from './constants.js';\nimport type {Filter} from './types.js';\nimport {isEmptyObject} from './utils.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\ntype FilterTypeOptions<T extends FilterType> = {\n type: T;\n column: string;\n} & Filter[T];\n\nexport type AddFilterOptions =\n | FilterTypeOptions<FilterType.IN>\n | FilterTypeOptions<FilterType.BETWEEN>\n | FilterTypeOptions<FilterType.CLOSED_OPEN>\n | FilterTypeOptions<FilterType.TIME>\n | FilterTypeOptions<FilterType.STRING_SEARCH>;\n\n/**\n * Adds a {@link Filter} to the filter set. Any previous filters with the same\n * `column` and `type` will be replaced.\n */\nexport function addFilter(\n filters: Record<string, Filter>,\n {column, type, values, owner}: AddFilterOptions\n): Record<string, Filter> {\n if (!filters[column]) {\n filters[column] = {};\n }\n\n const filter = {values, owner} as FilterTypeOptions<typeof type>;\n (filters[column][type] as FilterTypeOptions<typeof type>) = filter;\n\n return filters;\n}\n\nexport type RemoveFilterOptions = {\n column: string;\n owner?: string;\n};\n\n/**\n * Removes one or more {@link Filter filters} from the filter set. If only\n * `column` is specified, then all filters on that column are removed. If both\n * `column` and `owner` are specified, then only filters for that column\n * associated with the owner are removed.\n */\nexport function removeFilter(\n filters: Record<string, Filter>,\n {column, owner}: RemoveFilterOptions\n): Record<string, Filter> {\n const filter = filters[column];\n if (!filter) {\n return filters;\n }\n\n if (owner) {\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n delete filter[type as FilterType];\n }\n }\n }\n\n if (!owner || isEmptyObject(filter)) {\n delete filters[column];\n }\n\n return filters;\n}\n\n/**\n * Clears all {@link Filter filters} from the filter set.\n */\nexport function clearFilters(\n filters: Record<string, Filter>\n): Record<string, Filter> {\n for (const column of Object.keys(filters)) {\n delete filters[column];\n }\n return filters;\n}\n\nexport type HasFilterOptions = {\n column: string;\n owner?: string;\n};\n\nexport function hasFilter(\n filters: Record<string, Filter>,\n {column, owner}: HasFilterOptions\n): boolean {\n const filter = filters[column];\n if (!filter) {\n return false;\n }\n\n if (!owner) {\n return true;\n }\n\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n return true;\n }\n }\n\n return false;\n}\n\nexport type GetFilterOptions<T extends FilterType> = {\n column: string;\n type: T;\n owner?: string;\n};\n\nexport function getFilter<T extends FilterType>(\n filters: Record<string, Filter>,\n {column, type, owner}: GetFilterOptions<T>\n): Filter[T] | null {\n const filter = filters[column];\n if (!filter) {\n return null;\n }\n\n if (!owner || owner === filter[type]?.owner) {\n return filter[type] || null;\n }\n\n return null;\n}\n\n/**\n * Given all filters for a dataset, returns the subset of filters that are not\n * attributable to the given owner. Typically used to allow filterable widgets\n * to affect other widgets *without* filtering themselves.\n *\n * @privateRemarks Source: @carto/react-widgets\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n","/**\n * Name of the category that represents the \"Others\" category.\n *\n * See `WidgetSource.getCategories` for more information.\n */\nexport const OTHERS_CATEGORY_NAME = '_carto_others';\n","import {executeModel, type ModelSource} from '../models/index.js';\nimport type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentRequestOptions,\n ExtentResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {assert, normalizeObjectKeys} from '../utils.js';\nimport {DEFAULT_TILE_RESOLUTION} from '../constants-internal.js';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport type {Filters} from '../types.js';\nimport {AggregationTypes, ApiVersion} from '../constants.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\nimport {requestWithParameters} from '../api/request-with-parameters.js';\nimport type {APIErrorContext} from '../api/carto-api-error.js';\n\nexport type WidgetRemoteSourceProps = WidgetSourceProps;\n\n/**\n * Source for Widget API requests.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetRemoteSource<\n Props extends WidgetRemoteSourceProps,\n> extends WidgetSource<Props> {\n /**\n * Subclasses of {@link WidgetRemoteSource} must implement this method, calling\n * {@link WidgetRemoteSource.prototype._getModelSource} for common source\n * properties, and adding additional required properties including 'type' and\n * 'data'.\n */\n protected abstract getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource;\n\n protected _getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): Omit<ModelSource, 'type' | 'data'> {\n const props = this.props;\n return {\n apiVersion: props.apiVersion as ApiVersion,\n apiBaseUrl: props.apiBaseUrl as string,\n clientId: props.clientId as string,\n accessToken: props.accessToken,\n connectionName: props.connectionName,\n filters: getApplicableFilters(filterOwner, filters || props.filters),\n filtersLogicalOperator: props.filtersLogicalOperator,\n spatialDataType: props.spatialDataType,\n spatialDataColumn: props.spatialDataColumn,\n tags: props.tags,\n };\n }\n\n async getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n rawResult,\n ...params\n } = options;\n const {\n column,\n operation,\n operationColumn,\n operationExp,\n othersThreshold,\n orderBy,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n const result = await executeModel({\n model: 'category',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n operation,\n operationExp,\n operationColumn: operationColumn || column,\n othersThreshold,\n orderBy,\n },\n opts: {signal, headers: this.props.headers},\n });\n\n const normalizedRows = normalizeObjectKeys(result.rows || []);\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return normalizedRows;\n }\n\n return [\n ...normalizedRows,\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n async getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, dataType, featureIds, z, limit, tileResolution} = params;\n\n type FeaturesModelResponse = {rows: Record<string, unknown>[]};\n\n return executeModel({\n model: 'pick',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n columns,\n dataType,\n featureIds,\n z,\n limit: limit || 1000,\n tileResolution: tileResolution || DEFAULT_TILE_RESOLUTION,\n },\n opts: {signal, headers: this.props.headers},\n // Avoid `normalizeObjectKeys()`, which changes column names.\n }).then(({rows}: FeaturesModelResponse) => ({rows}));\n }\n\n async getFormula(options: FormulaRequestOptions): Promise<FormulaResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n operationExp,\n ...params\n } = options;\n const {column, operation} = params;\n\n type FormulaModelResponse = {rows: {value: number}[]};\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n return executeModel({\n model: 'formula',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: column ?? '*',\n operation: operation ?? AggregationTypes.Count,\n operationExp,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: FormulaModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column, operation, ticks} = params;\n\n type HistogramModelResponse = {rows: {tick: number; value: number}[]};\n\n const data = await executeModel({\n model: 'histogram',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column, operation, ticks},\n opts: {signal, headers: this.props.headers},\n }).then((res: HistogramModelResponse) => normalizeObjectKeys(res.rows));\n\n if (data.length) {\n // Given N ticks the API returns up to N+1 bins, omitting any empty bins. Bins\n // include 1 bin below the lowest tick, N-1 between ticks, and 1 bin above the highest tick.\n const result = Array(ticks.length + 1).fill(0);\n data.forEach(\n ({tick, value}: {tick: number; value: number}) => (result[tick] = value)\n );\n return result;\n }\n\n return [];\n }\n\n async getRange(options: RangeRequestOptions): Promise<RangeResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column} = params;\n\n type RangeModelResponse = {rows: {min: number; max: number}[]};\n\n return executeModel({\n model: 'range',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column},\n opts: {signal, headers: this.props.headers},\n }).then((res: RangeModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getScatter(options: ScatterRequestOptions): Promise<ScatterResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {xAxisColumn, xAxisJoinOperation, yAxisColumn, yAxisJoinOperation} =\n params;\n\n // Make sure this is sync with the same constant in cloud-native/maps-api\n const HARD_LIMIT = 500;\n\n type ScatterModelResponse = {rows: {x: number; y: number}[]};\n\n return executeModel({\n model: 'scatterplot',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n xAxisColumn,\n xAxisJoinOperation,\n yAxisColumn,\n yAxisJoinOperation,\n limit: HARD_LIMIT,\n },\n opts: {signal, headers: this.props.headers},\n })\n .then((res: ScatterModelResponse) => normalizeObjectKeys(res.rows))\n .then((res) => res.map(({x, y}: {x: number; y: number}) => [x, y]));\n }\n\n async getTable(options: TableRequestOptions): Promise<TableResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, sortBy, sortDirection, offset = 0, limit = 10} = params;\n\n type TableModelResponse = {\n rows: Record<string, number | string>[];\n metadata: {total: number};\n };\n\n return executeModel({\n model: 'table',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: columns,\n sortBy,\n sortDirection,\n limit,\n offset,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TableModelResponse) => ({\n // Avoid `normalizeObjectKeys()`, which changes column names.\n rows: res.rows ?? (res as any).ROWS,\n totalCount: res.metadata?.total ?? (res as any).METADATA?.TOTAL,\n }));\n }\n\n async getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {\n column,\n operationColumn,\n joinOperation,\n operation,\n operationExp,\n stepSize,\n stepMultiplier,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n type TimeSeriesModelResponse = {\n rows: {name: string; value: number}[];\n metadata: {categories: string[]};\n };\n\n return executeModel({\n model: 'timeseries',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n stepSize,\n stepMultiplier,\n operationColumn: operationColumn || column,\n joinOperation,\n operation,\n operationExp,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TimeSeriesModelResponse) => ({\n rows: normalizeObjectKeys(res.rows),\n categories: res.metadata?.categories,\n }));\n }\n\n async getAggregations(\n options: AggregationsRequestOptions\n ): Promise<AggregationsResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n aggregations,\n } = options;\n\n return executeModel({\n model: 'aggregations',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n aggregations,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: AggregationsResponse) => ({\n rows: res.rows.map((row) => normalizeObjectKeys(row)),\n }));\n }\n\n /** @experimental */\n async getExtent(options: ExtentRequestOptions = {}): Promise<ExtentResponse> {\n const {signal, filters = this.props.filters, filterOwner} = options;\n\n const {\n type,\n data,\n apiBaseUrl,\n apiVersion,\n connectionName,\n spatialDataColumn,\n spatialDataType,\n queryParameters,\n } = this.getModelSource(filters, filterOwner);\n\n assert(apiVersion === ApiVersion.V3, 'Stats API requires CARTO 3+');\n\n let url: string;\n\n const parameters: Record<string, unknown> = {filters, spatialDataType};\n\n if (type === 'query') {\n url = `${apiBaseUrl}/${apiVersion}/stats/${connectionName}/${spatialDataColumn}`;\n parameters.q = data;\n parameters.queryParameters = queryParameters;\n } else {\n url = `${apiBaseUrl}/${apiVersion}/stats/${connectionName}/${data}/${spatialDataColumn}`;\n }\n\n const headers = {\n Authorization: `Bearer ${this.props.accessToken}`,\n ...this.props.headers,\n };\n\n const errorContext: APIErrorContext = {\n requestType: 'Tile stats',\n connection: connectionName,\n type: type,\n };\n\n type StatsResponse = {\n extent: {\n xmin: number;\n ymin: number;\n xmax: number;\n ymax: number;\n };\n };\n\n return requestWithParameters<StatsResponse>({\n baseUrl: url,\n headers,\n signal,\n errorContext,\n parameters,\n }).then(({extent: {xmin, ymin, xmax, ymax}}) => ({\n bbox: [xmin, ymin, xmax, ymax],\n }));\n }\n}\n","import type {\n H3QuerySourceOptions,\n QuadbinQuerySourceOptions,\n VectorQuerySourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerQuerySourceOptions =\n | Omit<VectorQuerySourceOptions, 'filters'>\n | Omit<H3QuerySourceOptions, 'filters'>\n | Omit<QuadbinQuerySourceOptions, 'filters'>;\n\nexport type WidgetQuerySourceResult = {widgetSource: WidgetQuerySource};\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorQuerySource}, {@link h3QuerySource}, or {@link quadbinQuerySource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorQuerySource } from '@carto/api-client';\n *\n * const data = vectorQuerySource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * sqlQuery: 'SELECT * FROM carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetQuerySource extends WidgetRemoteSource<\n LayerQuerySourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'query',\n data: this.props.sqlQuery,\n queryParameters: this.props.queryParameters,\n };\n }\n}\n","import type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type AggregationFunction = (\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n) => number;\n\n/** @privateRemarks Source: @carto/react-core */\nexport const aggregationFunctions: Record<\n Exclude<AggregationType, 'custom'>,\n AggregationFunction\n> = {\n count: (values) => values.length,\n min: (...args) => applyAggregationFunction(min, ...args),\n max: (...args) => applyAggregationFunction(max, ...args),\n sum: (...args) => applyAggregationFunction(sum, ...args),\n avg: (...args) => applyAggregationFunction(avg, ...args),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function aggregate(\n feature: FeatureData,\n keys?: string[],\n operation?: AggregationType\n): unknown {\n if (!keys?.length) {\n throw new Error('Cannot aggregate a feature without having keys');\n } else if (keys.length === 1) {\n const value = feature[keys[0]];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n }\n\n const aggregationFn =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!aggregationFn) {\n throw new Error(`${operation} isn't a valid aggregation function`);\n }\n\n return aggregationFn(\n keys.map((column) => {\n const value = feature[column];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n })\n );\n}\n\n/*\n * Forced casting to Number (just of non empty strings) allows to work-around\n * some specific situations, where a big numeric field is transformed into a string when generating the tileset(eg.PG)\n */\nfunction isPotentiallyValidNumber(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nconst applyAggregationFunction = (\n aggFn: AggregationFunction,\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n operation?: AggregationType\n) => {\n const normalizedKeys = normalizeKeys(keys);\n const elements =\n (normalizedKeys?.length || 0) <= 1\n ? filterFalsyElements(values as unknown[], normalizedKeys || [])\n : values;\n return aggFn(elements, keys, operation);\n};\n\nfunction filterFalsyElements(\n values: unknown[] | FeatureData[],\n keys: string[]\n) {\n const filterFn = (value: unknown) => value !== null && value !== undefined;\n\n if (!keys?.length) {\n return values.filter(filterFn);\n }\n\n return (values as FeatureData[]).filter((v) => filterFn(v[keys[0]]));\n}\n\n// Aggregation functions\nfunction avg(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n return sum(values, keys, joinOperation) / (values.length || 1);\n}\n\nfunction sum(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) => a + (aggregate(b, normalizedKeys, joinOperation) as number),\n 0\n );\n }\n\n return values.reduce((a: number, b: unknown) => a + (b as number), 0);\n}\n\nfunction min(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.min(a, aggregate(b, normalizedKeys, joinOperation) as number),\n Infinity\n );\n }\n\n let min = Number.POSITIVE_INFINITY;\n for (const value of values as number[]) {\n min = Math.min(min, value);\n }\n return min;\n}\n\nfunction max(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.max(a, aggregate(b, normalizedKeys, joinOperation) as number),\n -Infinity\n );\n }\n\n let max = Number.NEGATIVE_INFINITY;\n for (const value of values as number[]) {\n max = Math.max(max, value);\n }\n return max;\n}\n\n// Aux\n\n// Keys can come as a string (one column) or a strings array (multiple column)\n// Use always an array to make the code easier\nfunction normalizeKeys(keys: unknown): string[] | undefined {\n return Array.isArray(keys)\n ? keys\n : typeof keys === 'string'\n ? [keys]\n : undefined;\n}\n","import {firstBy} from 'thenby';\nimport type {SortDirection} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n// TODO(cleanup): Could this be simplified?\ntype SortColumns = string | string[] | object[];\n\ninterface SortOptions {\n sortBy?: SortColumns;\n sortByDirection?: SortDirection;\n sortByColumnType?: 'number' | 'string' | 'date';\n}\n\n/**\n * Apply sort structure to a collection of features\n * @param features\n * @param [sortOptions]\n * @param [sortOptions.sortBy] - One or more columns to sort by\n * @param [sortOptions.sortByDirection] - Direction by the columns will be sorted\n * @param [sortOptions.sortByColumnType] - Column type\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function applySorting(\n features: FeatureData[],\n {\n sortBy,\n sortByDirection = 'asc',\n sortByColumnType = 'string',\n }: SortOptions = {}\n): FeatureData[] {\n // If sortBy is undefined, pass all features\n if (sortBy === undefined) {\n return features;\n }\n\n // sortOptions exists, but are bad formatted\n const isValidSortBy =\n (Array.isArray(sortBy) && sortBy.length) || // sortBy can be an array of columns\n typeof sortBy === 'string'; // or just one column\n\n if (!isValidSortBy) {\n throw new Error('Sorting options are bad formatted');\n }\n const sortFn = createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType: sortByColumnType || 'string',\n });\n return features.sort(sortFn);\n}\n\n// Aux\nfunction createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const [firstSortOption, ...othersSortOptions] = normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n }) as Parameters<typeof firstBy>[];\n\n let sortFn = firstBy(...firstSortOption);\n for (const sortOptions of othersSortOptions) {\n sortFn = sortFn.thenBy(...sortOptions);\n }\n\n return sortFn;\n}\n\nfunction normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const numberFormat = sortByColumnType === 'number' && {\n cmp: (a: number, b: number) => a - b,\n };\n if (!Array.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n return sortBy.map((sortByEl) => {\n // sortByEl is 'column'\n if (typeof sortByEl === 'string') {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n if (Array.isArray(sortByEl)) {\n // sortBy is ['column']\n if (sortByEl[1] === undefined) {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n // sortBy is ['column', { ... }]\n if (typeof sortByEl[1] === 'object') {\n const othersSortOptions = numberFormat\n ? {...numberFormat, ...sortByEl[1]}\n : sortByEl[1];\n return [\n sortByEl[0],\n {direction: sortByDirection, ...othersSortOptions},\n ];\n }\n }\n return sortByEl;\n });\n}\n","import {aggregationFunctions, aggregate} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n CategoryOrderBy,\n CategoryResponseEntry,\n CategoryResponseRaw,\n} from '../widget-sources/types.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n operation,\n othersThreshold,\n orderBy = 'frequency_desc',\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: AggregationType;\n keysColumn: string;\n operation: AggregationType;\n othersThreshold?: number;\n orderBy?: CategoryOrderBy;\n}): CategoryResponseRaw | null {\n if (Array.isArray(data) && data.length === 0) {\n return {rows: null};\n }\n const groups = data.reduce((accumulator, item) => {\n const group = item[keysColumn];\n\n const values = accumulator.get(group) || [];\n accumulator.set(group, values);\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid =\n (operation === 'count' ? true : aggregatedValue !== null) &&\n aggregatedValue !== undefined;\n\n if (isValid) {\n values.push(aggregatedValue);\n accumulator.set(group, values);\n }\n\n return accumulator;\n }, new Map()); // We use a map to be able to maintain the type in the key value\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!targetOperation) {\n return {rows: []};\n }\n\n const allCategories = Array.from(groups)\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort(getSorter(orderBy));\n\n if (othersThreshold && allCategories.length > othersThreshold) {\n const otherValue = allCategories\n .slice(othersThreshold)\n .flatMap(({name}) => groups.get(name));\n return {\n rows: allCategories,\n metadata: {\n others: targetOperation(otherValue),\n },\n };\n }\n\n return {\n rows: allCategories,\n };\n}\n\nexport function getSorter(\n orderBy: CategoryOrderBy\n): (a: CategoryResponseEntry, b: CategoryResponseEntry) => number {\n switch (orderBy) {\n case 'frequency_asc':\n // 'value ASC, name ASC'\n return (a, b) => a.value - b.value || nameCompare(a.name, b.name);\n case 'frequency_desc':\n // 'value DESC, name ASC'\n return (a, b) => b.value - a.value || nameCompare(a.name, b.name);\n case 'alphabetical_asc':\n // 'name ASC, value DESC'\n return (a, b) => nameCompare(a.name, b.name) || b.value - a.value;\n case 'alphabetical_desc':\n // 'name DESC, value DESC'\n return (a, b) => nameCompare(b.name, a.name) || b.value - a.value;\n }\n}\n\nfunction nameCompare(\n a?: CategoryResponseEntry['name'],\n b?: CategoryResponseEntry['name']\n) {\n // Despite the naming of 'alphabetical_*' sort options, we still want to\n // sort numeric category names (usually raster datasets) numerically.\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n return String(a ?? 'null').localeCompare(String(b ?? 'null'));\n}\n","/**\n * Returns midnight (local time) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getDay();\n const diff = dateCp.getDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setDate(diff);\n dateCp.setHours(0, 0, 0, 0);\n return dateCp.getTime();\n}\n\n/**\n * Returns midnight (UTC) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getUTCMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getUTCDay();\n const diff = dateCp.getUTCDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setUTCDate(diff);\n return Date.UTC(\n dateCp.getUTCFullYear(),\n dateCp.getUTCMonth(),\n dateCp.getUTCDate()\n );\n}\n","import type {AggregationType, GroupDateType} from '../types.js';\nimport {getUTCMonday} from '../utils/dateUtils.js';\nimport {aggregate, aggregationFunctions} from './aggregation.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type GroupByFeature = {\n name: string;\n value: number;\n}[];\n\nconst GROUP_KEY_FN_MAPPING: Record<GroupDateType, (date: Date) => number> = {\n year: (date: Date) => Date.UTC(date.getUTCFullYear()),\n month: (date: Date) => Date.UTC(date.getUTCFullYear(), date.getUTCMonth()),\n week: (date: Date) => getUTCMonday(date),\n day: (date: Date) =>\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()),\n hour: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours()\n ),\n minute: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes()\n ),\n second: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds()\n ),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByDateColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n groupType,\n operation,\n}: {\n data: Record<string, unknown>[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n keysColumn: string;\n groupType: GroupDateType;\n operation?: Exclude<AggregationType, 'custom'>;\n}): GroupByFeature | null {\n if (Array.isArray(data) && data.length === 0) {\n return null;\n }\n\n const groupKeyFn = GROUP_KEY_FN_MAPPING[groupType];\n\n if (!groupKeyFn) {\n return null;\n }\n\n const groups = data.reduce((acc, item) => {\n const value = item[keysColumn];\n const formattedValue = new Date(value as number);\n const groupKey = groupKeyFn(formattedValue);\n\n if (!isNaN(groupKey)) {\n let groupedValues = acc.get(groupKey);\n if (!groupedValues) {\n groupedValues = [];\n acc.set(groupKey, groupedValues);\n }\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid = aggregatedValue !== null && aggregatedValue !== undefined;\n\n if (isValid) {\n groupedValues.push(aggregatedValue);\n acc.set(groupKey, groupedValues);\n }\n }\n\n return acc;\n }, new Map());\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n return [...groups.entries()]\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort((a, b) => a.name - b.name);\n}\n","import {aggregate, aggregationFunctions} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/**\n * Histogram computation.\n * @privateRemarks Source: @carto/react-core\n */\nexport function histogram({\n data,\n valuesColumns,\n joinOperation,\n ticks,\n operation,\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n ticks: number[];\n operation: Exclude<AggregationType, 'custom'>;\n}): number[] {\n if (Array.isArray(data) && data.length === 0) {\n return [];\n }\n\n const binsContainer = [Number.MIN_SAFE_INTEGER, ...ticks].map(\n (tick, index, arr) => ({\n bin: index,\n start: tick,\n end: index === arr.length - 1 ? Number.MAX_SAFE_INTEGER : arr[index + 1],\n values: [] as number[],\n })\n );\n\n data.forEach((feature) => {\n const featureValue = aggregate(\n feature,\n valuesColumns,\n joinOperation\n ) as number;\n\n const isValid = featureValue !== null && featureValue !== undefined;\n\n if (!isValid) {\n return;\n }\n\n const binContainer = binsContainer.find(\n (bin) => bin.start <= featureValue && bin.end > featureValue\n );\n\n if (!binContainer) {\n return;\n }\n\n binContainer.values.push(featureValue);\n });\n\n const targetOperation = aggregationFunctions[operation];\n const transformedBins = binsContainer.map(\n (binContainer) => binContainer.values\n );\n return transformedBins.map((values) =>\n values.length ? targetOperation(values) : 0\n );\n}\n","import {aggregate} from './aggregation.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {AggregationType} from '../types.js';\n\nexport type ScatterPlotFeature = [number, number][];\n\n/**\n * Filters invalid features and formats data.\n * @privateRemarks Source: @carto/react-core\n */\nexport function scatterPlot({\n data,\n xAxisColumns,\n xAxisJoinOperation,\n yAxisColumns,\n yAxisJoinOperation,\n}: {\n data: FeatureData[];\n xAxisColumns: string[];\n xAxisJoinOperation?: AggregationType;\n yAxisColumns: string[];\n yAxisJoinOperation?: AggregationType;\n}): ScatterPlotFeature {\n return data.reduce(\n (acc, feature) => {\n const xValue = aggregate(\n feature,\n xAxisColumns,\n xAxisJoinOperation\n ) as number;\n\n const xIsValid = xValue !== null && xValue !== undefined;\n\n const yValue = aggregate(\n feature,\n yAxisColumns,\n yAxisJoinOperation\n ) as number;\n\n const yIsValid = yValue !== null && yValue !== undefined;\n\n if (xIsValid && yIsValid) {\n acc.push([xValue, yValue]);\n }\n\n return acc;\n },\n [] as [number, number][]\n );\n}\n","import {\n Feature,\n LineString,\n Position,\n GeoJSON,\n Point,\n Polygon,\n GeometryCollection,\n FeatureCollection,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n\n * GeoJSON equality checking utility.\n * Adapted from https://github.com/geosquare/geojson-equality\n *\n * @memberof helpers\n * @type {Class}\n */\nclass GeojsonEquality {\n private precision: number;\n private direction = false;\n private compareProperties = true;\n\n constructor(opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }) {\n this.precision = 10 ** -(opts?.precision ?? 17);\n this.direction = opts?.direction ?? false;\n this.compareProperties = opts?.compareProperties ?? true;\n }\n\n compare(g1: GeoJSON, g2: GeoJSON): boolean {\n if (g1.type !== g2.type) {\n return false;\n }\n\n if (!sameLength(g1, g2)) {\n return false;\n }\n\n switch (g1.type) {\n case \"Point\":\n return this.compareCoord(g1.coordinates, (g2 as Point).coordinates);\n case \"LineString\":\n return this.compareLine(g1.coordinates, (g2 as LineString).coordinates);\n case \"Polygon\":\n return this.comparePolygon(g1, g2 as Polygon);\n case \"GeometryCollection\":\n return this.compareGeometryCollection(g1, g2 as GeometryCollection);\n case \"Feature\":\n return this.compareFeature(g1, g2 as Feature);\n case \"FeatureCollection\":\n return this.compareFeatureCollection(g1, g2 as FeatureCollection);\n default:\n if (g1.type.startsWith(\"Multi\")) {\n const g1s = explode(g1);\n const g2s = explode(\n g2 as MultiLineString | MultiPoint | MultiPolygon\n );\n return g1s.every((g1part) =>\n g2s.some((g2part) => this.compare(g1part as any, g2part as any))\n );\n }\n }\n return false;\n }\n\n private compareCoord(c1: Position, c2: Position) {\n return (\n c1.length === c2.length &&\n c1.every((c, i) => Math.abs(c - c2[i]) < this.precision)\n );\n }\n\n private compareLine(\n path1: Position[],\n path2: Position[],\n ind = 0,\n isPoly = false\n ): boolean {\n if (!sameLength(path1, path2)) {\n return false;\n }\n const p1 = path1;\n let p2 = path2;\n if (isPoly && !this.compareCoord(p1[0], p2[0])) {\n // fix start index of both to same point\n const startIndex = this.fixStartIndex(p2, p1);\n if (!startIndex) {\n return false;\n } else {\n p2 = startIndex;\n }\n }\n // for linestring ind =0 and for polygon ind =1\n const sameDirection = this.compareCoord(p1[ind], p2[ind]);\n if (this.direction || sameDirection) {\n return this.comparePath(p1, p2);\n } else {\n if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) {\n return this.comparePath(p1.slice().reverse(), p2);\n }\n return false;\n }\n }\n\n private fixStartIndex(sourcePath: Position[], targetPath: Position[]) {\n //make sourcePath first point same as of targetPath\n let correctPath,\n ind = -1;\n for (let i = 0; i < sourcePath.length; i++) {\n if (this.compareCoord(sourcePath[i], targetPath[0])) {\n ind = i;\n break;\n }\n }\n if (ind >= 0) {\n correctPath = ([] as Position[]).concat(\n sourcePath.slice(ind, sourcePath.length),\n sourcePath.slice(1, ind + 1)\n );\n }\n return correctPath;\n }\n\n private comparePath(p1: Position[], p2: Position[]) {\n return p1.every((c, i) => this.compareCoord(c, p2[i]));\n }\n\n private comparePolygon(g1: Polygon, g2: Polygon) {\n if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) {\n const holes1 = g1.coordinates.slice(1, g1.coordinates.length);\n const holes2 = g2.coordinates.slice(1, g2.coordinates.length);\n return holes1.every((h1) =>\n holes2.some((h2) => this.compareLine(h1, h2, 1, true))\n );\n }\n return false;\n }\n\n private compareGeometryCollection(\n g1: GeometryCollection,\n g2: GeometryCollection\n ) {\n return (\n sameLength(g1.geometries, g2.geometries) &&\n this.compareBBox(g1, g2) &&\n g1.geometries.every((g, i) => this.compare(g, g2.geometries[i]))\n );\n }\n\n private compareFeature(g1: Feature, g2: Feature) {\n return (\n g1.id === g2.id &&\n (this.compareProperties ? equal(g1.properties, g2.properties) : true) &&\n this.compareBBox(g1, g2) &&\n this.compare(g1.geometry, g2.geometry)\n );\n }\n\n private compareFeatureCollection(\n g1: FeatureCollection,\n g2: FeatureCollection\n ) {\n return (\n sameLength(g1.features, g2.features) &&\n this.compareBBox(g1, g2) &&\n g1.features.every((f, i) => this.compare(f, g2.features[i]))\n );\n }\n\n private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean {\n return (\n Boolean(!g1.bbox && !g2.bbox) ||\n (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false)\n );\n }\n}\n\nfunction sameLength(g1: any, g2: any) {\n return g1.coordinates\n ? g1.coordinates.length === g2.coordinates.length\n : g1.length === g2.length;\n}\n\nfunction explode(g: MultiLineString | MultiPoint | MultiPolygon) {\n return g.coordinates.map((part) => ({\n type: g.type.replace(\"Multi\", \"\"),\n coordinates: part,\n }));\n}\n\nfunction geojsonEquality(\n g1: GeoJSON,\n g2: GeoJSON,\n opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }\n): boolean {\n const eq = new GeojsonEquality(opts);\n\n return eq.compare(g1, g2);\n}\n\n// Adapted from https://medium.com/syncfusion/5-different-ways-to-deep-compare-javascript-objects-6708a0da9f05\nfunction equal(object1: GeoJsonProperties, object2: GeoJsonProperties) {\n if (object1 === null && object2 === null) {\n return true;\n }\n\n if (object1 === null || object2 === null) {\n return false;\n }\n\n const objKeys1 = Object.keys(object1);\n const objKeys2 = Object.keys(object2);\n\n if (objKeys1.length !== objKeys2.length) return false;\n\n for (var key of objKeys1) {\n const value1 = object1[key];\n const value2 = object2[key];\n\n const isObjects = isObject(value1) && isObject(value2);\n\n if (\n (isObjects && !equal(value1, value2)) ||\n (!isObjects && value1 !== value2)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst isObject = (object: any) => {\n return object != null && typeof object === \"object\";\n};\n\nexport { GeojsonEquality, geojsonEquality };\nexport default GeojsonEquality;\n","import { Position } from \"geojson\";\nimport { feature } from \"@turf/helpers\";\nimport { getCoords, getType } from \"@turf/invariant\";\n\n// To-Do => Improve Typescript GeoJSON handling\n\n/**\n * Removes redundant coordinates from any GeoJSON Geometry.\n *\n * @function\n * @param {Geometry|Feature} geojson Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated\n * @returns {Geometry|Feature} the cleaned input Feature/Geometry\n * @example\n * var line = turf.lineString([[0, 0], [0, 2], [0, 5], [0, 8], [0, 8], [0, 10]]);\n * var multiPoint = turf.multiPoint([[0, 0], [0, 0], [2, 2]]);\n *\n * turf.cleanCoords(line).geometry.coordinates;\n * //= [[0, 0], [0, 10]]\n *\n * turf.cleanCoords(multiPoint).geometry.coordinates;\n * //= [[0, 0], [2, 2]]\n */\nfunction cleanCoords(\n geojson: any,\n options: {\n mutate?: boolean;\n } = {}\n) {\n // Backwards compatible with v4.0\n var mutate = typeof options === \"object\" ? options.mutate : options;\n if (!geojson) throw new Error(\"geojson is required\");\n var type = getType(geojson);\n\n // Store new \"clean\" points in this Array\n var newCoords = [];\n\n switch (type) {\n case \"LineString\":\n newCoords = cleanLine(geojson, type);\n break;\n case \"MultiLineString\":\n case \"Polygon\":\n getCoords(geojson).forEach(function (line) {\n newCoords.push(cleanLine(line, type));\n });\n break;\n case \"MultiPolygon\":\n getCoords(geojson).forEach(function (polygons: any) {\n var polyPoints: Position[] = [];\n polygons.forEach(function (ring: Position[]) {\n polyPoints.push(cleanLine(ring, type));\n });\n newCoords.push(polyPoints);\n });\n break;\n case \"Point\":\n return geojson;\n case \"MultiPoint\":\n var existing: Record<string, true> = {};\n getCoords(geojson).forEach(function (coord: any) {\n var key = coord.join(\"-\");\n if (!Object.prototype.hasOwnProperty.call(existing, key)) {\n newCoords.push(coord);\n existing[key] = true;\n }\n });\n break;\n default:\n throw new Error(type + \" geometry not supported\");\n }\n\n // Support input mutation\n if (geojson.coordinates) {\n if (mutate === true) {\n geojson.coordinates = newCoords;\n return geojson;\n }\n return { type: type, coordinates: newCoords };\n } else {\n if (mutate === true) {\n geojson.geometry.coordinates = newCoords;\n return geojson;\n }\n return feature({ type: type, coordinates: newCoords }, geojson.properties, {\n bbox: geojson.bbox,\n id: geojson.id,\n });\n }\n}\n\n/**\n * Clean Coords\n *\n * @private\n * @param {Array<number>|LineString} line Line\n * @param {string} type Type of geometry\n * @returns {Array<number>} Cleaned coordinates\n */\nfunction cleanLine(line: Position[], type: string) {\n var points = getCoords(line);\n // handle \"clean\" segment\n if (points.length === 2 && !equals(points[0], points[1])) return points;\n\n var newPoints = [];\n var secondToLast = points.length - 1;\n var newPointsLength = newPoints.length;\n\n newPoints.push(points[0]);\n for (var i = 1; i < secondToLast; i++) {\n var prevAddedPoint = newPoints[newPoints.length - 1];\n if (\n points[i][0] === prevAddedPoint[0] &&\n points[i][1] === prevAddedPoint[1]\n )\n continue;\n else {\n newPoints.push(points[i]);\n newPointsLength = newPoints.length;\n if (newPointsLength > 2) {\n if (\n isPointOnLineSegment(\n newPoints[newPointsLength - 3],\n newPoints[newPointsLength - 1],\n newPoints[newPointsLength - 2]\n )\n )\n newPoints.splice(newPoints.length - 2, 1);\n }\n }\n }\n newPoints.push(points[points.length - 1]);\n newPointsLength = newPoints.length;\n\n // (Multi)Polygons must have at least 4 points, but a closed LineString with only 3 points is acceptable\n if (\n (type === \"Polygon\" || type === \"MultiPolygon\") &&\n equals(points[0], points[points.length - 1]) &&\n newPointsLength < 4\n ) {\n throw new Error(\"invalid polygon\");\n }\n\n if (type === \"LineString\" && newPointsLength < 3) {\n return newPoints;\n }\n\n if (\n isPointOnLineSegment(\n newPoints[newPointsLength - 3],\n newPoints[newPointsLength - 1],\n newPoints[newPointsLength - 2]\n )\n )\n newPoints.splice(newPoints.length - 2, 1);\n\n return newPoints;\n}\n\n/**\n * Compares two points and returns if they are equals\n *\n * @private\n * @param {Position} pt1 point\n * @param {Position} pt2 point\n * @returns {boolean} true if they are equals\n */\nfunction equals(pt1: Position, pt2: Position) {\n return pt1[0] === pt2[0] && pt1[1] === pt2[1];\n}\n\n/**\n * Returns if `point` is on the segment between `start` and `end`.\n * Borrowed from `@turf/boolean-point-on-line` to speed up the evaluation (instead of using the module as dependency)\n *\n * @private\n * @param {Position} start coord pair of start of line\n * @param {Position} end coord pair of end of line\n * @param {Position} point coord pair of point to check\n * @returns {boolean} true/false\n */\nfunction isPointOnLineSegment(start: Position, end: Position, point: Position) {\n var x = point[0],\n y = point[1];\n var startX = start[0],\n startY = start[1];\n var endX = end[0],\n endY = end[1];\n\n var dxc = x - startX;\n var dyc = y - startY;\n var dxl = endX - startX;\n var dyl = endY - startY;\n var cross = dxc * dyl - dyc * dxl;\n\n if (cross !== 0) return false;\n else if (Math.abs(dxl) >= Math.abs(dyl))\n return dxl > 0 ? startX <= x && x <= endX : endX <= x && x <= startX;\n else return dyl > 0 ? startY <= y && y <= endY : endY <= y && y <= startY;\n}\n\nexport { cleanCoords };\nexport default cleanCoords;\n","import { Feature, Geometry } from \"geojson\";\nimport { geojsonEquality } from \"geojson-equality-ts\";\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Determine whether two geometries of the same type have identical X,Y coordinate values.\n * See http://edndoc.esri.com/arcsde/9.0/general_topics/understand_spatial_relations.htm\n *\n * @function\n * @param {Geometry|Feature} feature1 GeoJSON input\n * @param {Geometry|Feature} feature2 GeoJSON input\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.precision=6] decimal precision to use when comparing coordinates\n * @returns {boolean} true if the objects are equal, false otherwise\n * @example\n * var pt1 = turf.point([0, 0]);\n * var pt2 = turf.point([0, 0]);\n * var pt3 = turf.point([1, 1]);\n *\n * turf.booleanEqual(pt1, pt2);\n * //= true\n * turf.booleanEqual(pt2, pt3);\n * //= false\n */\nfunction booleanEqual(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n options: {\n precision?: number;\n } = {}\n): boolean {\n let precision = options.precision;\n\n precision =\n precision === undefined || precision === null || isNaN(precision)\n ? 6\n : precision;\n\n if (typeof precision !== \"number\" || !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n\n const type1 = getGeom(feature1).type;\n const type2 = getGeom(feature2).type;\n if (type1 !== type2) return false;\n\n return geojsonEquality(cleanCoords(feature1), cleanCoords(feature2), {\n precision,\n });\n}\n\nexport { booleanEqual };\nexport default booleanEqual;\n","/* eslint-disable @typescript-eslint/require-await */\nimport type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {InvalidColumnError, assert, assignOptional} from '../utils.js';\nimport type {Filter, SpatialFilter, Tile} from '../types.js';\n\nimport {\n type TileFeatureExtractOptions,\n applyFilters,\n geojsonFeatures,\n tileFeatures,\n} from '../filters/index.js';\nimport {\n aggregationFunctions,\n applySorting,\n groupValuesByColumn,\n groupValuesByDateColumn,\n histogram,\n scatterPlot,\n} from '../operations/index.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {FeatureCollection} from 'geojson';\nimport {WidgetSource} from './widget-source.js';\nimport {booleanEqual} from '@turf/boolean-equal';\nimport type {WidgetTilesetSourceProps} from './widget-tileset-source.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {AggregationTypes} from '../constants.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\n\n// TODO(cleanup): Parameter defaults in source functions and widget API calls are\n// currently duplicated and possibly inconsistent. Consider consolidating and\n// operating on Required<T> objects. See:\n// https://github.com/CartoDB/carto-api-client/issues/39\n\n/**\n * Local (in-memory) implementation of tileset widget calculations. This class\n * may be instantiated by {@link WidgetTilesetSource} in a Web Worker when\n * supported, or on the main thread.\n */\nexport class WidgetTilesetSourceImpl extends WidgetSource<WidgetTilesetSourceProps> {\n private _tiles: Tile[] = [];\n private _features: FeatureData[] = [];\n private _tileFeatureExtractOptions: TileFeatureExtractOptions = {};\n private _tileFeatureExtractPreviousInputs: {spatialFilter?: SpatialFilter} =\n {};\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n this._tiles = tiles as Tile[];\n this._features.length = 0;\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n this._tileFeatureExtractOptions = options;\n this._features.length = 0;\n }\n\n protected _extractTileFeatures(spatialFilter?: SpatialFilter) {\n // When spatial filter has not changed, don't redo extraction. If tiles or\n // tile extract options change, features will have been cleared already.\n const prevInputs = this._tileFeatureExtractPreviousInputs;\n if (\n this._features.length &&\n spatialFilterEquals(prevInputs.spatialFilter, spatialFilter)\n ) {\n return;\n }\n\n this._features = tileFeatures({\n ...assignOptional({}, this.props, this._tileFeatureExtractOptions),\n tiles: this._tiles,\n spatialFilter,\n });\n\n prevInputs.spatialFilter = spatialFilter;\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n this._features = geojsonFeatures({\n geojson,\n spatialFilter,\n ...this._tileFeatureExtractOptions,\n });\n this._tileFeatureExtractPreviousInputs.spatialFilter = spatialFilter;\n }\n\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n column = '*',\n operation = AggregationTypes.Count,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (filteredFeatures.length === 0 && operation !== AggregationTypes.Count) {\n return {value: null};\n }\n\n if (operation === AggregationTypes.Custom) {\n throw new Error('Custom aggregation not supported for tilesets');\n }\n\n // Column is required except when operation is 'count'.\n if ((column && column !== '*') || operation !== AggregationTypes.Count) {\n assertColumn(this._features, column);\n }\n\n const targetOperation = aggregationFunctions[operation];\n assert(targetOperation, `Unsupported aggregation operation: ${operation}`);\n\n return {\n value: targetOperation(filteredFeatures, column, joinOperation),\n };\n }\n\n override async getHistogram({\n operation = AggregationTypes.Count,\n ticks,\n column,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n return [];\n }\n\n assertColumn(this._features, column);\n\n return histogram({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(column),\n joinOperation,\n ticks,\n operation,\n });\n }\n\n override async getCategories({\n column,\n operation = AggregationTypes.Count,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n othersThreshold,\n orderBy = 'frequency_desc',\n rawResult,\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, column, operationColumn as string);\n\n const result = groupValuesByColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n joinOperation,\n keysColumn: column,\n operation,\n othersThreshold,\n orderBy,\n });\n\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return result?.rows || [];\n }\n\n return [\n ...(result?.rows || []),\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n override async getScatter({\n xAxisColumn,\n yAxisColumn,\n xAxisJoinOperation,\n yAxisJoinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, xAxisColumn, yAxisColumn);\n\n return scatterPlot({\n data: filteredFeatures,\n xAxisColumns: normalizeColumns(xAxisColumn),\n xAxisJoinOperation,\n yAxisColumns: normalizeColumns(yAxisColumn),\n yAxisJoinOperation,\n });\n }\n\n override async getTable({\n columns,\n searchFilterColumn,\n searchFilterText,\n sortBy,\n sortDirection,\n sortByColumnType,\n offset = 0,\n limit = 10,\n filters,\n filterOwner,\n spatialFilter,\n }: TableRequestOptions): Promise<TableResponse> {\n // Filter.\n let filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: [], totalCount: 0};\n }\n\n // Search.\n // TODO(v0.6): Remove \"searchFilterText\" and \"searchFilterColumn\".\n if (searchFilterColumn && searchFilterText) {\n console.warn(\n 'WidgetTilesetSource: \"searchFilterText\" is deprecated, use \"filters\" and FilterType.STRING_SEARCH instead.'\n );\n filteredFeatures = filteredFeatures.filter(\n (row) =>\n row[searchFilterColumn] &&\n String(row[searchFilterColumn] as unknown)\n .toLowerCase()\n .includes(String(searchFilterText).toLowerCase())\n );\n }\n\n // Sort.\n let rows = applySorting(filteredFeatures, {\n sortBy,\n sortByDirection: sortDirection,\n sortByColumnType,\n });\n const totalCount = rows.length;\n\n // Offset and limit.\n rows = rows.slice(\n Math.min(offset, totalCount),\n Math.min(offset + limit, totalCount)\n );\n\n // Select columns.\n rows = rows.map((srcRow: FeatureData) => {\n const dstRow: FeatureData = {};\n for (const column of columns) {\n dstRow[column] = srcRow[column];\n }\n return dstRow;\n });\n\n return {rows, totalCount} as TableResponse;\n }\n\n override async getTimeSeries({\n column,\n stepSize,\n operation,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: []};\n }\n\n assertColumn(this._features, column, operationColumn as string);\n assert(\n operation !== 'custom',\n 'Custom operation not supported for tilesets'\n );\n\n const rows =\n groupValuesByDateColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n keysColumn: column,\n groupType: stepSize,\n operation,\n joinOperation,\n }) || [];\n\n return {rows};\n }\n\n override async getRange({\n column,\n filters,\n filterOwner,\n spatialFilter,\n }: RangeRequestOptions): Promise<RangeResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n // TODO: Is this the only nullable response in the Widgets API? If so,\n // can we do something more consistent?\n return null;\n }\n\n assertColumn(this._features, column);\n\n return {\n min: aggregationFunctions.min(filteredFeatures, column),\n max: aggregationFunctions.max(filteredFeatures, column),\n };\n }\n\n async getAggregations({\n aggregations,\n filters,\n filterOwner,\n spatialFilter,\n }: AggregationsRequestOptions): Promise<AggregationsResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n return {rows: []};\n }\n\n // SQL aggregations require remote execution, and are not supported for tilesets.\n assert(\n typeof aggregations !== 'string',\n 'Unsupported tileset SQL aggregation'\n );\n\n // Handle array-based aggregations\n const result: Record<string, number> = {};\n const usedAliases = new Set<string>();\n\n for (const {column, operation, alias} of aggregations) {\n // Column is required except when operation is 'count'.\n if ((column && column !== '*') || operation !== AggregationTypes.Count) {\n assertColumn(this._features, column);\n }\n\n const aliasKey = alias.toLowerCase();\n assert(!usedAliases.has(aliasKey), `Duplicate alias: ${aliasKey}`);\n usedAliases.add(aliasKey);\n\n const targetOperation = aggregationFunctions[operation];\n assert(targetOperation, `Unsupported operation: ${operation}`);\n\n result[alias] = targetOperation(filteredFeatures, column);\n }\n\n return {rows: [result]};\n }\n\n /** @experimental */\n async getExtent(): Promise<ExtentResponse> {\n return Promise.reject(new Error('not implemented'));\n }\n\n /****************************************************************************\n * INTERNAL\n */\n\n private _getFilteredFeatures(\n spatialFilter?: SpatialFilter,\n filters?: Record<string, Filter>,\n filterOwner?: string\n ): FeatureData[] {\n this._extractTileFeatures(spatialFilter);\n return applyFilters(\n this._features,\n getApplicableFilters(filterOwner, filters || this.props.filters),\n this.props.filtersLogicalOperator || 'and'\n );\n }\n}\n\nfunction assertColumn(\n features: FeatureData[],\n ...columnArgs: string[] | string[][]\n) {\n // Due to the multiple column shape, we normalise it as an array with normalizeColumns\n const columns = Array.from(new Set(columnArgs.map(normalizeColumns).flat()));\n\n const featureKeys = Object.keys(features[0]);\n\n // For backward compatibility, '' should pass column validation. For example,\n // operation='count',operationColumn='' is accepted.\n const invalidColumns = columns.filter(\n (column) => column && !featureKeys.includes(column)\n );\n\n if (invalidColumns.length) {\n throw new InvalidColumnError(\n `Missing column(s): ${invalidColumns.join(', ')}`\n );\n }\n}\n\nfunction normalizeColumns(columns: string | string[]): string[] {\n return Array.isArray(columns)\n ? columns\n : typeof columns === 'string'\n ? [columns]\n : [];\n}\n\nfunction spatialFilterEquals(a?: SpatialFilter, b?: SpatialFilter) {\n if (a === b) return true;\n if (!a || !b) return false;\n return booleanEqual(a, b);\n}\n","import type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {TileFeatureExtractOptions} from '../filters/index.js';\nimport type {BBox, FeatureCollection} from 'geojson';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport {Method} from '../workers/constants.js';\nimport type {WorkerRequest, WorkerResponse} from '../workers/types.js';\nimport type {SpatialDataType, TilesetSourceOptions} from '../sources/types.js';\nimport {TileFormat} from '../constants.js';\nimport {WidgetTilesetSourceImpl} from './widget-tileset-source-impl.js';\n\nexport type WidgetTilesetSourceProps = WidgetSourceProps &\n Omit<TilesetSourceOptions, 'filters'> & {\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n /**\n * Extent of spatial data, typically from TileJSON. Does not include filters.\n */\n spatialDataBounds: BBox;\n };\n\nexport type WidgetTilesetSourceResult = {widgetSource: WidgetTilesetSource};\n\n/**\n * Source for Widget API requests on a data source defined by a tileset.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTilesetSource}, {@link h3TilesetSource}, or {@link quadbinTilesetSource},\n * which can be shared with map layers. Sources contain a `widgetSource`\n * property, for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTilesetSource } from '@carto/api-client';\n *\n * const data = vectorTilesetSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_rasters.my_tileset_source'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTilesetSource<\n Props extends WidgetTilesetSourceProps = WidgetTilesetSourceProps,\n> extends WidgetSource<Props> {\n protected _localImpl: WidgetTilesetSourceImpl | null = null;\n\n protected _workerImpl: Worker | null = null;\n protected _workerEnabled: boolean;\n protected _workerNextRequestId = 1;\n\n constructor(props: Props) {\n super(props);\n\n this._workerEnabled =\n (props.widgetWorker ?? true) &&\n TSUP_FORMAT !== 'cjs' &&\n typeof Worker !== 'undefined';\n\n if (!this._workerEnabled) {\n this._localImpl = new WidgetTilesetSourceImpl(this.props);\n }\n }\n\n destroy() {\n this._localImpl?.destroy();\n this._localImpl = null;\n\n this._workerImpl?.terminate();\n this._workerImpl = null;\n\n super.destroy();\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WEB WORKER MANAGEMENT\n\n /**\n * Returns an initialized Worker, to be reused for the lifecycle of this\n * source instance.\n */\n protected _getWorker(): Worker {\n if (this._workerImpl) {\n return this._workerImpl;\n }\n\n if (this.props.widgetWorkerUrl) {\n this._workerImpl = new Worker(this.props.widgetWorkerUrl, {\n name: 'cartowidgettileset',\n });\n } else {\n // For Vite (and perhaps other bundlers) to parse WorkerOptions, it\n // must be a static, inline object – duplicated below.\n this._workerImpl = new Worker(\n new URL('@carto/api-client/worker', import.meta.url),\n {\n type: 'module',\n name: 'cartowidgettileset',\n }\n );\n }\n\n this._workerImpl.addEventListener('error', (e) => {\n console.error('widget-tileset-source worker error', e);\n });\n\n this._workerImpl.postMessage({\n method: Method.INIT,\n params: [this.props],\n } as WorkerRequest);\n\n return this._workerImpl;\n }\n\n /** Executes a given method on the worker. */\n protected _executeWorkerMethod<T>(\n method: Method,\n params: unknown[],\n signal?: AbortSignal\n ): Promise<T> {\n if (!this._workerEnabled) {\n // @ts-expect-error No type-checking dynamic method name.\n return this._localImpl[method](...params);\n }\n\n const worker = this._getWorker();\n const requestId = this._workerNextRequestId++;\n\n let resolve: ((value: T) => void) | null = null;\n let reject: ((reason: any) => void) | null = null;\n\n // If worker sends message to main process, check whether it's a response\n // to this request, and whether the request can been aborted. Then resolve\n // or reject the Promise.\n function onMessage(e: MessageEvent) {\n const response = e.data as WorkerResponse;\n if (response.requestId !== requestId) return;\n if (signal?.aborted) return; // handled by 'abort' listener\n\n if (response.ok) {\n resolve!(response.result as T);\n } else {\n reject!(new Error(response.error));\n }\n }\n\n // If request is aborted by user, immediately reject the Promise.\n function onAbort() {\n reject!(new Error(signal!.reason));\n }\n\n worker.addEventListener('message', onMessage);\n signal?.addEventListener('abort', onAbort);\n\n // Send the task to the worker, creating a Promise to resolve/reject later.\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n\n worker.postMessage({\n requestId,\n method,\n params,\n } as WorkerRequest);\n });\n\n // Whether the task completes, fails, or aborts: clean up afterward.\n void promise.finally(() => {\n worker.removeEventListener('message', onMessage);\n signal?.removeEventListener('abort', onAbort);\n });\n\n return promise;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // DATA LOADING\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadTiles(tiles);\n }\n\n const worker = this._getWorker();\n\n // We cannot pass an instance of Tile2DHeader to a Web Worker, and must\n // extract properties required for widget calculations. Note that the\n // `tile: Tile = {...}` assignment is structured so TS will warn if any\n // types required by the internal 'Tile' type are missing.\n tiles = (tiles as Tile[]).map(\n ({id, index, bbox, isVisible, data}: Tile) => {\n const tile: Tile = {\n id,\n index,\n isVisible,\n data,\n bbox,\n };\n return tile;\n }\n );\n\n worker.postMessage({\n method: Method.LOAD_TILES,\n params: [tiles],\n } as WorkerRequest);\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n if (!this._workerEnabled) {\n return this._localImpl?.setTileFeatureExtractOptions(options);\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.SET_TILE_FEATURE_EXTRACT_OPTIONS,\n params: [options],\n });\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadGeoJSON({geojson, spatialFilter});\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.LOAD_GEOJSON,\n params: [{geojson, spatialFilter}],\n } as WorkerRequest);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WIDGETS API\n\n // eslint-disable-next-line @typescript-eslint/require-await\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n signal,\n ...options\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n return this._executeWorkerMethod(Method.GET_FORMULA, [options], signal);\n }\n\n override async getHistogram({\n signal,\n ...options\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n return this._executeWorkerMethod(Method.GET_HISTOGRAM, [options], signal);\n }\n\n override async getCategories({\n signal,\n ...options\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n return this._executeWorkerMethod(Method.GET_CATEGORIES, [options], signal);\n }\n\n override async getScatter({\n signal,\n ...options\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n return this._executeWorkerMethod(Method.GET_SCATTER, [options], signal);\n }\n\n override async getTable({\n signal,\n ...options\n }: TableRequestOptions): Promise<TableResponse> {\n return this._executeWorkerMethod(Method.GET_TABLE, [options], signal);\n }\n\n override async getTimeSeries({\n signal,\n ...options\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n return this._executeWorkerMethod(Method.GET_TIME_SERIES, [options], signal);\n }\n\n override async getRange({\n signal,\n ...options\n }: RangeRequestOptions): Promise<RangeResponse> {\n return this._executeWorkerMethod(Method.GET_RANGE, [options], signal);\n }\n\n async getAggregations({\n signal,\n ...options\n }: AggregationsRequestOptions): Promise<AggregationsResponse> {\n return this._executeWorkerMethod(\n Method.GET_AGGREGATIONS,\n [options],\n signal\n );\n }\n\n /** @experimental */\n async getExtent(): Promise<ExtentResponse> {\n return Promise.resolve({\n bbox: this.props.spatialDataBounds,\n });\n }\n}\n","import type {RasterMetadata} from '../sources/index.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceProps,\n} from './widget-tileset-source.js';\n\nexport type WidgetRasterSourceProps = WidgetTilesetSourceProps & {\n rasterMetadata: RasterMetadata;\n spatialDataType: 'quadbin';\n};\n\nexport type WidgetRasterSourceResult = {widgetSource: WidgetRasterSource};\n\nexport class WidgetRasterSource extends WidgetTilesetSource<WidgetRasterSourceProps> {}\n","import type {\n H3TableSourceOptions,\n QuadbinTableSourceOptions,\n VectorTableSourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerTableSourceOptions =\n | Omit<VectorTableSourceOptions, 'filters'>\n | Omit<H3TableSourceOptions, 'filters'>\n | Omit<QuadbinTableSourceOptions, 'filters'>;\n\nexport type WidgetTableSourceResult = {widgetSource: WidgetTableSource};\n\n/**\n * Source for Widget API requests on a data source defined as a table.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTableSource}, {@link h3TableSource}, or {@link quadbinTableSource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTableSource } from '@carto/api-client';\n *\n * const data = vectorTableSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTableSource extends WidgetRemoteSource<\n LayerTableSourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'table',\n data: this.props.tableName,\n };\n }\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type H3QuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type H3QuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;\n\nexport const h3QuerySource = async function (\n options: H3QuerySourceOptions\n): Promise<H3QuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n sqlQuery,\n spatialDataColumn = 'h3',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n spatialDataColumn,\n spatialDataType,\n q: sqlQuery,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type H3TableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type H3TableSourceResponse = TilejsonResult & WidgetTableSourceResult;\n\nexport const h3TableSource = async function (\n options: H3TableSourceOptions\n): Promise<H3TableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n spatialDataColumn = 'h3',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","import {TileFormat} from '../constants.js';\nimport type {Tilejson} from '../sources/types.js';\n\nexport function getTileFormat(tilejson: Tilejson): TileFormat {\n const tileParams = new URL(tilejson.tiles[0]).searchParams;\n return tileParams.get('formatTiles') === 'mvt'\n ? TileFormat.MVT\n : TileFormat.BINARY;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type H3TilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type H3TilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const h3TilesetSource = async function (\n options: H3TilesetSourceOptions\n): Promise<H3TilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'h3'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'h3',\n spatialDataBounds: result.bounds,\n }),\n })\n ) as Promise<H3TilesetSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const quadbinQuerySource = async function (\n options: QuadbinQuerySourceOptions\n): Promise<QuadbinQuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n sqlQuery,\n spatialDataColumn = 'quadbin',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n q: sqlQuery,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinTableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const quadbinTableSource = async function (\n options: QuadbinTableSourceOptions\n): Promise<QuadbinTableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n spatialDataColumn = 'quadbin',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type QuadbinTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type QuadbinTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const quadbinTilesetSource = async function (\n options: QuadbinTilesetSourceOptions\n): Promise<QuadbinTilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'quadbin'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'quadbin',\n spatialDataBounds: result.bounds,\n }),\n })\n ) as Promise<QuadbinTilesetSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetRasterSource,\n type WidgetRasterSourceResult,\n} from '../widget-sources/index.js';\n\nimport type {\n FilterOptions,\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type RasterSourceOptions = SourceOptions &\n TilesetSourceOptions &\n FilterOptions;\ntype UrlParameters = {\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type RasterSourceResponse = TilejsonResult & WidgetRasterSourceResult;\n\nexport const rasterSource = async function (\n options: RasterSourceOptions\n): Promise<RasterSourceResponse> {\n const {tableName, filters} = options;\n const urlParameters: UrlParameters = {name: tableName};\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('raster', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetRasterSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn: 'quadbin',\n spatialDataType: 'quadbin',\n spatialDataBounds: result.bounds,\n rasterMetadata: result.raster_metadata!,\n }),\n })\n ) as Promise<RasterSourceResponse>;\n};\n","import {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetQuerySource,\n type RangeResponse,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n SourceOptions,\n QuerySourceOptions,\n SpatialDataType,\n TilejsonResult,\n ColumnsOption,\n} from './types.js';\n\nexport type TrajectoryQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n ColumnsOption & {\n /** Column name containing the trajectory identifier */\n trajectoryIdColumn: string;\n /** Column name containing the timestamp */\n timestampColumn: string;\n };\n\ntype UrlParameters = {\n columns?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n aggregationExp?: string;\n trajectoryIdColumn: string;\n timestampColumn: string;\n};\n\nexport type TrajectoryQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult & {\n timestampRange: RangeResponse;\n };\n\nexport const trajectoryQuerySource = async function (\n options: TrajectoryQuerySourceOptions\n): Promise<TrajectoryQuerySourceResponse> {\n const {\n columns,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n sqlQuery,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n queryParameters,\n aggregationExp,\n trajectoryIdColumn,\n timestampColumn,\n } = options;\n\n const spatialDataType = 'trajectory';\n\n const urlParameters: UrlParameters = {\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n q: sqlQuery,\n trajectoryIdColumn,\n timestampColumn,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n const result = await baseSource<UrlParameters>(\n 'query',\n options,\n urlParameters\n );\n\n const widgetSource = new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n });\n\n const timestampRange = await widgetSource.getRange({column: timestampColumn});\n\n return {\n ...result,\n widgetSource,\n timestampRange,\n };\n};\n","import {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetTableSource,\n type RangeResponse,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n ColumnsOption,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type TrajectoryTableSourceOptions = SourceOptions &\n TableSourceOptions &\n ColumnsOption & {\n /** Column name containing the trajectory identifier */\n trajectoryIdColumn: string;\n /** Column name containing the timestamp */\n timestampColumn: string;\n };\n\ntype UrlParameters = {\n columns?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n name: string;\n aggregationExp?: string;\n trajectoryIdColumn: string;\n timestampColumn: string;\n};\n\nexport type TrajectoryTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult & {\n timestampRange: RangeResponse;\n };\n\nexport const trajectoryTableSource = async function (\n options: TrajectoryTableSourceOptions\n): Promise<TrajectoryTableSourceResponse> {\n const {\n columns,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n tableName,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n aggregationExp,\n trajectoryIdColumn,\n timestampColumn,\n } = options;\n\n const spatialDataType = 'trajectory';\n\n const urlParameters: UrlParameters = {\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n trajectoryIdColumn,\n timestampColumn,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n const result = await baseSource<UrlParameters>(\n 'table',\n options,\n urlParameters\n );\n\n const widgetSource = new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n });\n\n const timestampRange = await widgetSource.getRange({column: timestampColumn});\n\n return {\n ...result,\n widgetSource,\n timestampRange,\n };\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n SourceOptions,\n QuerySourceOptions,\n SpatialDataType,\n TilejsonResult,\n ColumnsOption,\n} from './types.js';\n\nexport type VectorQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n aggregationExp?: string;\n};\n\nexport type VectorQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const vectorQuerySource = async function (\n options: VectorQuerySourceOptions\n): Promise<VectorQuerySourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n sqlQuery,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n queryParameters,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n q: sqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n ColumnsOption,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTableSourceOptions = SourceOptions &\n TableSourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n name: string;\n aggregationExp?: string;\n};\n\nexport type VectorTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const vectorTableSource = async function (\n options: VectorTableSourceOptions\n): Promise<VectorTableSourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n tableName,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilesetSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type VectorTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const vectorTilesetSource = async function (\n options: VectorTilesetSourceOptions\n): Promise<VectorTilesetSourceResponse> {\n const {tableName, spatialDataColumn = DEFAULT_GEO_COLUMN} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'geo',\n spatialDataBounds: result.bounds,\n }),\n })\n ) as Promise<VectorTilesetSourceResponse>;\n};\n","export enum RasterBandColorinterp {\n Gray = 'gray',\n Red = 'red',\n Green = 'green',\n Blue = 'blue',\n Alpha = 'alpha',\n Palette = 'palette',\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Import all source functions\nimport {boundaryQuerySource} from './boundary-query-source.js';\nimport {boundaryTableSource} from './boundary-table-source.js';\nimport {h3QuerySource} from './h3-query-source.js';\nimport {h3TableSource} from './h3-table-source.js';\nimport {h3TilesetSource} from './h3-tileset-source.js';\nimport {quadbinQuerySource} from './quadbin-query-source.js';\nimport {quadbinTableSource} from './quadbin-table-source.js';\nimport {quadbinTilesetSource} from './quadbin-tileset-source.js';\nimport {rasterSource} from './raster-source.js';\nimport {trajectoryQuerySource} from './trajectory-query-source.js';\nimport {trajectoryTableSource} from './trajectory-table-source.js';\nimport {vectorQuerySource} from './vector-query-source.js';\nimport {vectorTableSource} from './vector-table-source.js';\nimport {vectorTilesetSource} from './vector-tileset-source.js';\n\nexport {SOURCE_DEFAULTS} from './base-source.js';\nexport {RasterBandColorinterp} from './constants.js';\nexport type {\n SourceOptions,\n SourceRequiredOptions,\n SourceOptionalOptions,\n TilejsonResult,\n QueryResult,\n FilterOptions,\n QuerySourceOptions,\n TableSourceOptions,\n TilesetSourceOptions,\n ColumnsOption,\n SpatialDataType,\n SpatialFilterPolyfillMode,\n TileResolution,\n Tilejson,\n Tilestats,\n Layer,\n Attribute,\n VectorLayer,\n RasterMetadata,\n RasterMetadataBand,\n RasterMetadataBandStats,\n RasterBandType,\n} from './types.js';\n\nexport {boundaryQuerySource};\nexport type {\n BoundaryQuerySourceOptions,\n BoundaryQuerySourceResponse,\n} from './boundary-query-source.js';\n\nexport {boundaryTableSource};\nexport type {\n BoundaryTableSourceOptions,\n BoundaryTableSourceResponse,\n} from './boundary-table-source.js';\n\nexport {h3QuerySource};\nexport type {\n H3QuerySourceOptions,\n H3QuerySourceResponse,\n} from './h3-query-source.js';\n\nexport {h3TableSource};\nexport type {\n H3TableSourceOptions,\n H3TableSourceResponse,\n} from './h3-table-source.js';\n\nexport {h3TilesetSource};\nexport type {\n H3TilesetSourceOptions,\n H3TilesetSourceResponse,\n} from './h3-tileset-source.js';\n\nexport {rasterSource};\nexport type {RasterSourceOptions} from './raster-source.js';\n\nexport {quadbinQuerySource};\nexport type {\n QuadbinQuerySourceOptions,\n QuadbinQuerySourceResponse,\n} from './quadbin-query-source.js';\n\nexport {quadbinTableSource};\nexport type {\n QuadbinTableSourceOptions,\n QuadbinTableSourceResponse,\n} from './quadbin-table-source.js';\n\nexport {quadbinTilesetSource};\nexport type {\n QuadbinTilesetSourceOptions,\n QuadbinTilesetSourceResponse,\n} from './quadbin-tileset-source.js';\n\nexport {vectorQuerySource};\nexport type {\n VectorQuerySourceOptions,\n VectorQuerySourceResponse,\n} from './vector-query-source.js';\n\nexport {vectorTableSource};\nexport type {\n VectorTableSourceOptions,\n VectorTableSourceResponse,\n} from './vector-table-source.js';\n\nexport {vectorTilesetSource};\nexport type {\n VectorTilesetSourceOptions,\n VectorTilesetSourceResponse,\n} from './vector-tileset-source.js';\n\nexport {trajectoryQuerySource};\nexport type {\n TrajectoryQuerySourceOptions,\n TrajectoryQuerySourceResponse,\n} from './trajectory-query-source.js';\n\nexport {trajectoryTableSource};\nexport type {\n TrajectoryTableSourceOptions,\n TrajectoryTableSourceResponse,\n} from './trajectory-table-source.js';\n\nexport const CARTO_SOURCES = {\n boundaryQuerySource,\n boundaryTableSource,\n h3QuerySource,\n h3TableSource,\n h3TilesetSource,\n quadbinQuerySource,\n quadbinTableSource,\n quadbinTilesetSource,\n rasterSource,\n trajectoryQuerySource,\n trajectoryTableSource,\n vectorQuerySource,\n vectorTableSource,\n vectorTilesetSource,\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {SOURCE_DEFAULTS} from '../sources/index.js';\nimport type {\n SourceOptions,\n QuerySourceOptions,\n QueryResult,\n} from '../sources/types.js';\nimport {buildQueryUrl} from './endpoints.js';\nimport {requestWithParameters} from './request-with-parameters.js';\nimport type {APIErrorContext} from './carto-api-error.js';\nimport {getClient} from '../client.js';\n\nexport type QueryOptions = SourceOptions &\n QuerySourceOptions & {\n /**\n * @internal\n * @experimental\n * Used to append additional parameters to the SQL API request for features specific to providers or integrations.\n */\n internalParameters?: Record<string, string | boolean | number>;\n /** Used to abort the request. */\n signal?: AbortSignal;\n };\ntype UrlParameters = {q: string; queryParameters?: string};\n\nexport const query = async function (\n options: QueryOptions\n): Promise<QueryResult> {\n const {\n apiBaseUrl = SOURCE_DEFAULTS.apiBaseUrl,\n maxLengthURL = SOURCE_DEFAULTS.maxLengthURL,\n clientId = getClient(),\n localCache,\n connectionName,\n sqlQuery,\n queryParameters,\n internalParameters,\n } = options;\n const urlParameters: UrlParameters = {q: sqlQuery};\n\n if (queryParameters) {\n urlParameters.queryParameters = JSON.stringify(queryParameters);\n }\n\n const baseUrl = buildQueryUrl({apiBaseUrl, connectionName});\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {\n client: clientId,\n ...options.tags,\n ...internalParameters,\n ...urlParameters,\n };\n\n const errorContext: APIErrorContext = {\n requestType: 'SQL',\n connection: options.connectionName,\n type: 'query',\n source: JSON.stringify(parameters, undefined, 2),\n };\n return await requestWithParameters<QueryResult>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n signal: options.signal,\n });\n};\n","import {CartoAPIError, type APIErrorContext} from '../api/index.js';\nimport type {GoogleBasemapProps} from './types.js';\n\nconst cartoStyleUrlTemplate =\n 'https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json';\n\nexport const CARTO_MAP_STYLES = ['positron', 'dark-matter', 'voyager'];\n\nexport const GOOGLE_BASEMAPS: Record<string, GoogleBasemapProps> = {\n roadmap: {\n mapTypeId: 'roadmap',\n mapId: '3754c817b510f791',\n },\n 'google-positron': {\n mapTypeId: 'roadmap',\n mapId: 'ea84ae4203ef21cd',\n },\n 'google-dark-matter': {\n mapTypeId: 'roadmap',\n mapId: '2fccc3b36c22a0e2',\n },\n 'google-voyager': {\n mapTypeId: 'roadmap',\n mapId: '885caf1e15bb9ef2',\n },\n satellite: {\n mapTypeId: 'satellite',\n },\n hybrid: {\n mapTypeId: 'hybrid',\n },\n terrain: {\n mapTypeId: 'terrain',\n },\n};\n\ntype StyleLayerGroupSlug =\n | 'label'\n | 'road'\n | 'border'\n | 'building'\n | 'water'\n | 'land';\ntype StyleLayerGroup = {\n slug: StyleLayerGroupSlug;\n filter: (layer: any) => boolean;\n defaultVisibility: boolean;\n};\n\nexport const STYLE_LAYER_GROUPS: StyleLayerGroup[] = [\n {\n slug: 'label',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(\n /(?=(label|_label|place-|place_|poi-|poi_|watername_|roadname_|housenumber))/\n )\n ),\n defaultVisibility: true,\n },\n {\n slug: 'road',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(road|railway|tunnel|street|bridge))(?!.*label)/)),\n defaultVisibility: true,\n },\n {\n slug: 'border',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/border|boundaries|boundary_/)),\n defaultVisibility: false,\n },\n {\n slug: 'building',\n filter: ({id}: {id: string}) => Boolean(id.match(/building/)),\n defaultVisibility: true,\n },\n {\n slug: 'water',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(water|stream|ferry))/)),\n defaultVisibility: true,\n },\n {\n slug: 'land',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(/(?=(parks|landcover|industrial|sand|hillshade|park_))/)\n ),\n defaultVisibility: true,\n },\n];\n\nexport function applyLayerGroupFilters(\n style: any, // this Maplibre/Mapbox style, we don't want to add a dependency on Maplibre\n visibleLayerGroups: Record<StyleLayerGroupSlug, boolean>\n) {\n if (!Array.isArray(style?.layers)) {\n return style;\n }\n\n const removedLayerFilters = STYLE_LAYER_GROUPS.filter(\n (lg) => !visibleLayerGroups[lg.slug]\n ).map((lg) => lg.filter);\n\n const visibleLayers = style.layers.filter((layer: any) =>\n removedLayerFilters.every((match) => !match(layer))\n );\n\n return {\n ...style,\n layers: visibleLayers,\n };\n}\n\nexport function someLayerGroupsDisabled(\n visibleLayerGroups?: Record<StyleLayerGroupSlug, boolean>\n) {\n return (\n visibleLayerGroups &&\n Object.values(visibleLayerGroups).every(Boolean) === false\n );\n}\n\nexport function getStyleUrl(styleType: string) {\n return cartoStyleUrlTemplate.replace('{basemap}', styleType);\n}\n\nexport async function fetchStyle({\n styleUrl,\n errorContext,\n}: {\n styleUrl: string;\n errorContext?: APIErrorContext;\n}) {\n /* global fetch */\n let response: Response | undefined;\n return await fetch(styleUrl, {mode: 'cors'})\n .then((res) => {\n response = res;\n return res.json();\n })\n .catch((error) => {\n throw new CartoAPIError(\n error,\n {...errorContext, requestType: 'Basemap style'},\n response\n );\n });\n}\n\nexport default {\n VOYAGER: getStyleUrl('voyager'),\n POSITRON: getStyleUrl('positron'),\n DARK_MATTER: getStyleUrl('dark-matter'),\n VOYAGER_NOLABELS: getStyleUrl('voyager-nolabels'),\n POSITRON_NOLABELS: getStyleUrl('positron-nolabels'),\n DARK_MATTER_NOLABELS: getStyleUrl('dark-matter-nolabels'),\n} as const;\n","import jsep from 'jsep';\n\n/**\n * Create vector expresion evaluator.\n *\n * Used to calculate vector expressions, such as `(band_1 * 3) + band_2/2`,\n * where `band_1` and `band_2` are arrays or typed arrays.\n *\n * Note that all vector operations are element-wise, in paricular `band_1 * band_2`\n * is not \"mathematical\" dot or cross product, but just element-wise multiplication.\n *\n * Based on:\n * - Copyright (c) 2013 Stephen Oney, http://jsep.from.so/, MIT License\n * - Copyright (c) 2023 Don McCurdy, https://github.com/donmccurdy/expression-eval, MIT License\n */\nexport function createVecExprEvaluator(\n expression: string | jsep.Expression\n): VecExprEvaluator | null {\n try {\n const parsed = compile(expression);\n const evalFun = (context: Record<string, VecExprResult>) =>\n evaluate(parsed, context);\n evalFun.symbols = getSymbols(parsed);\n return evalFun as VecExprEvaluator;\n } catch {\n return null;\n }\n}\n\nexport function evaluateVecExpr(\n expression: string | jsep.Expression,\n context: Record<string, VecExprResult>\n) {\n try {\n return createVecExprEvaluator(expression)?.(context);\n } catch {\n return null;\n }\n}\n\nexport enum ErrorCode {\n InvalidSyntax,\n UnknownIdentifier,\n}\n\nexport type ValidationResult = {\n valid: boolean;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport function validateVecExprSyntax(\n expression: string | jsep.Expression,\n context: Record<string, unknown>\n): ValidationResult {\n let parsed: jsep.Expression;\n try {\n parsed = compile(expression);\n } catch (e: any) {\n return {\n valid: false,\n errorCode: ErrorCode.InvalidSyntax,\n errorMessage: e && 'message' in e ? String(e.message) : String(e),\n };\n }\n return validate(parsed, context);\n}\n\nexport type VecExprVecLike =\n | number[]\n | Float32Array\n | Float64Array\n | Uint8Array\n | Int8Array\n | Int32Array\n | Uint32Array\n | Uint16Array\n | Int16Array;\n\nexport type VecExprResult = number | VecExprVecLike;\n\nexport type VecExprEvaluator = {\n (context: object): VecExprResult;\n\n symbols?: string[];\n};\n\nfunction createResultArray(\n typeTemplate: VecExprVecLike,\n length: number = typeTemplate.length\n): number[] {\n return new Array(length);\n}\n\nfunction isVecLike(a: unknown): a is number[] {\n return Array.isArray(a) || ArrayBuffer.isView(a);\n}\n\nconst createBinopVec =\n (scalarBinOp: (a: number, b: number) => number) =>\n (left: number[], right: number[]) => {\n const length = Math.min(left.length, right.length);\n const r = createResultArray(left, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarBinOp(left[i], right[i]);\n }\n return r;\n };\n\nconst createBinopVecNum =\n (scalarBinOp: (a: number, b: number) => number) =>\n (left: number[], right: number) => {\n const length = left.length;\n const r = createResultArray(left, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarBinOp(left[i], right);\n }\n return r;\n };\n\n// number vec op\nconst createBinopNumVec =\n (scalarBinOp: (a: number, b: number) => number) =>\n (left: number, right: number[]) => {\n const length = right.length;\n const r = createResultArray(right, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarBinOp(left, right[i]);\n }\n return r;\n };\n\nconst createUnopVec = (scalarUnop: (a: number) => number) => (a: number[]) => {\n const length = a.length;\n const r = createResultArray(a, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarUnop(a[i]);\n }\n return r;\n};\n\nfunction mapDictValues<V, NewV>(dict: Record<string, V>, fun: (v: V) => NewV) {\n return Object.keys(dict).reduce(\n (acc, key) => {\n acc[key] = fun(dict[key]);\n return acc;\n },\n {} as Record<string, NewV>\n );\n}\n\nconst binopsNum: Record<string, (a: number, b: number) => number> = {\n '||': (a: number, b: number) => a || b,\n '&&': (a: number, b: number) => a && b,\n '|': (a: number, b: number) => a | b,\n '^': (a: number, b: number) => a ^ b,\n '&': (a: number, b: number) => a & b,\n '==': (a: number, b: number) => Number(a == b),\n '!=': (a: number, b: number) => Number(a != b),\n '===': (a: number, b: number) => Number(a === b),\n '!==': (a: number, b: number) => Number(a !== b),\n '<': (a: number, b: number) => Number(a < b),\n '>': (a: number, b: number) => Number(a > b),\n '<=': (a: number, b: number) => Number(a <= b),\n '>=': (a: number, b: number) => Number(a >= b),\n '<<': (a: number, b: number) => a << b,\n '>>': (a: number, b: number) => a >> b,\n '>>>': (a: number, b: number) => a >>> b,\n '+': (a: number, b: number) => a + b,\n '-': (a: number, b: number) => a - b,\n '*': (a: number, b: number) => a * b,\n '/': (a: number, b: number) => a / b,\n '%': (a: number, b: number) => a % b,\n};\n\nconst unopsNum: Record<string, (a: number) => number> = {\n '-': (a: number) => -a,\n '+': (a: number) => +a,\n '~': (a: number) => ~a,\n '!': (a: number) => Number(!a),\n};\n\nconst binopsVector = mapDictValues(binopsNum, createBinopVec) as Record<\n string,\n Binop\n>;\nconst binopsNumVec = mapDictValues(binopsNum, createBinopNumVec) as Record<\n string,\n Binop\n>;\nconst binopsVecNum = mapDictValues(binopsNum, createBinopVecNum) as Record<\n string,\n Binop\n>;\n\nconst unopsVector = mapDictValues(unopsNum, createUnopVec) as Record<\n string,\n UnOp\n>;\n\ntype UnOp = (a: VecExprResult) => VecExprResult;\ntype Binop = (a: VecExprResult, b: VecExprResult) => VecExprResult;\n\nfunction getBinop(\n operator: string,\n left: VecExprResult,\n right: VecExprResult\n): Binop {\n const isLeftVec = isVecLike(left);\n const isRightVec = isVecLike(right);\n if (isLeftVec && isRightVec) {\n return binopsVector[operator];\n } else if (isLeftVec) {\n return binopsVecNum[operator];\n } else if (isRightVec) {\n return binopsNumVec[operator];\n } else {\n return binopsNum[operator] as Binop;\n }\n}\n\ntype AnyExpression =\n | jsep.ArrayExpression\n | jsep.BinaryExpression\n | jsep.MemberExpression\n | jsep.CallExpression\n | jsep.ConditionalExpression\n | jsep.Identifier\n | jsep.Literal\n | jsep.ThisExpression\n | jsep.UnaryExpression;\n\nexport function evaluate(\n _node: jsep.Expression,\n context: Record<string, VecExprResult>\n): VecExprResult {\n const node = _node as AnyExpression;\n\n switch (node.type) {\n case 'BinaryExpression': {\n const left = evaluate(node.left, context);\n const right = evaluate(node.right, context);\n const binopFun = getBinop(node.operator, left, right);\n\n return binopFun(left, right);\n }\n\n case 'ConditionalExpression': {\n const val = evaluate(node.test, context);\n if (isVecLike(val)) {\n const length = val.length;\n const consequentVal = evaluate(node.consequent, context);\n const alternateVal = evaluate(node.alternate, context);\n const r = createResultArray(val);\n for (let i = 0; i < length; i++) {\n const entryVal = val[i] ? consequentVal : alternateVal;\n r[i] = isVecLike(entryVal)\n ? (entryVal[i] ?? NaN)\n : (entryVal as number);\n }\n return r;\n } else {\n return val\n ? evaluate(node.consequent, context)\n : evaluate(node.alternate, context);\n }\n }\n\n case 'Identifier':\n return context[node.name];\n\n case 'Literal':\n return node.value as number;\n\n case 'UnaryExpression': {\n const val = evaluate(node.argument, context);\n const unopFun = isVecLike(val)\n ? unopsVector[node.operator]\n : (unopsNum[node.operator] as UnOp);\n return unopFun(val);\n }\n\n default:\n return undefined as unknown as VecExprResult;\n }\n}\n\nconst validResult = {valid: true};\n\nfunction visit(_node: jsep.Expression, visitor: (node: AnyExpression) => void) {\n const node = _node as AnyExpression;\n\n visitor(node);\n switch (node.type) {\n case 'BinaryExpression': {\n visit(node.left, visitor);\n visit(node.right, visitor);\n break;\n }\n\n case 'ConditionalExpression': {\n visit(node.test, visitor);\n visit(node.consequent, visitor);\n visit(node.alternate, visitor);\n break;\n }\n\n case 'UnaryExpression': {\n visit(node.argument, visitor);\n break;\n }\n }\n}\n\nconst supportedExpressionTypes = [\n 'BinaryExpression',\n 'UnaryExpression',\n 'ConditionalExpression',\n 'LogicalExpression',\n 'Identifier',\n 'Literal',\n];\n\nfunction validate(_node: jsep.Expression, context: object): ValidationResult {\n const node = _node as AnyExpression;\n\n const errors: ValidationResult[] = [];\n\n visit(node, (node) => {\n if (!supportedExpressionTypes.includes(node.type)) {\n errors.push({\n valid: false,\n errorCode: ErrorCode.InvalidSyntax,\n errorMessage: `Not allowed`,\n });\n return;\n }\n if (node.type === 'Identifier') {\n if (!Object.prototype.hasOwnProperty.call(context, node.name)) {\n return errors.push({\n valid: false,\n errorCode: ErrorCode.UnknownIdentifier,\n errorMessage: `\"${node.name}\" not found`,\n });\n }\n }\n if (node.type === 'Literal') {\n // we actually support only numbers\n if (typeof node.value !== 'number') {\n return errors.push({\n valid: false,\n errorCode: ErrorCode.InvalidSyntax,\n errorMessage: `Only number literals are supported`,\n });\n }\n }\n });\n return errors.length ? errors[0] : validResult;\n}\n\nfunction getSymbols(node: jsep.Expression): string[] {\n const symbols = new Set<string>();\n\n visit(node, (node) => {\n if (node.type === 'Identifier') {\n symbols.add(node.name);\n }\n });\n return Array.from(symbols);\n}\n\nexport function compile(expression: string | jsep.Expression) {\n return jsep(expression);\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function identity(x) {\n return x;\n}\n","import {InternMap} from \"internmap\";\nimport identity from \"./identity.js\";\n\nexport default function group(values, ...keys) {\n return nest(values, identity, identity, keys);\n}\n\nexport function groups(values, ...keys) {\n return nest(values, Array.from, identity, keys);\n}\n\nfunction flatten(groups, keys) {\n for (let i = 1, n = keys.length; i < n; ++i) {\n groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));\n }\n return groups;\n}\n\nexport function flatGroup(values, ...keys) {\n return flatten(groups(values, ...keys), keys);\n}\n\nexport function flatRollup(values, reduce, ...keys) {\n return flatten(rollups(values, reduce, ...keys), keys);\n}\n\nexport function rollup(values, reduce, ...keys) {\n return nest(values, identity, reduce, keys);\n}\n\nexport function rollups(values, reduce, ...keys) {\n return nest(values, Array.from, reduce, keys);\n}\n\nexport function index(values, ...keys) {\n return nest(values, identity, unique, keys);\n}\n\nexport function indexes(values, ...keys) {\n return nest(values, Array.from, unique, keys);\n}\n\nfunction unique(values) {\n if (values.length !== 1) throw new Error(\"duplicate key\");\n return values[0];\n}\n\nfunction nest(values, map, reduce, keys) {\n return (function regroup(values, i) {\n if (i >= keys.length) return reduce(values);\n const groups = new InternMap();\n const keyof = keys[i++];\n let index = -1;\n for (const value of values) {\n const key = keyof(value, ++index, values);\n const group = groups.get(key);\n if (group) group.push(value);\n else groups.set(key, [value]);\n }\n for (const [key, values] of groups) {\n groups.set(key, regroup(values, i));\n }\n return map(groups);\n })(values, 0);\n}\n","export default function permute(source, keys) {\n return Array.from(keys, key => source[key]);\n}\n","import ascending from \"./ascending.js\";\nimport permute from \"./permute.js\";\n\nexport default function sort(values, ...F) {\n if (typeof values[Symbol.iterator] !== \"function\") throw new TypeError(\"values is not iterable\");\n values = Array.from(values);\n let [f] = F;\n if ((f && f.length !== 2) || F.length > 1) {\n const index = Uint32Array.from(values, (d, i) => i);\n if (F.length > 1) {\n F = F.map(f => values.map(f));\n index.sort((i, j) => {\n for (const f of F) {\n const c = ascendingDefined(f[i], f[j]);\n if (c) return c;\n }\n });\n } else {\n f = values.map(f);\n index.sort((i, j) => ascendingDefined(f[i], f[j]));\n }\n return permute(values, index);\n }\n return values.sort(compareDefined(f));\n}\n\nexport function compareDefined(compare = ascending) {\n if (compare === ascending) return ascendingDefined;\n if (typeof compare !== \"function\") throw new TypeError(\"compare is not a function\");\n return (a, b) => {\n const x = compare(a, b);\n if (x || x === 0) return x;\n return (compare(b, b) === 0) - (compare(a, a) === 0);\n };\n}\n\nexport function ascendingDefined(a, b) {\n return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);\n}\n","import ascending from \"./ascending.js\";\nimport group, {rollup} from \"./group.js\";\nimport sort from \"./sort.js\";\n\nexport default function groupSort(values, reduce, key) {\n return (reduce.length !== 2\n ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk)))\n : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk))))\n .map(([key]) => key);\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","import {extent, groupSort} from 'd3-array';\nimport {rgb} from 'd3-color';\nimport {\n scaleLinear,\n scaleOrdinal,\n scaleLog,\n scalePoint,\n scaleQuantile,\n scaleQuantize,\n scaleSqrt,\n scaleThreshold,\n} from 'd3-scale';\nimport {format as d3Format} from 'd3-format';\n\nexport type LayerType =\n | 'clusterTile'\n | 'h3'\n | 'heatmapTile'\n | 'mvt'\n | 'quadbin'\n | 'raster'\n | 'tileset';\n\nimport {\n createBinaryProxy,\n formatDate,\n formatTimestamp,\n getLog10ScaleSteps,\n scaleIdentity,\n} from './utils.js';\nimport type {\n ColorRange,\n CustomMarkersRange,\n Dataset,\n MapLayerConfig,\n VisConfig,\n VisualChannelField,\n VisualChannels,\n} from './types.js';\nimport type {ProviderType, SchemaField} from '../types.js';\nimport {DEFAULT_AGGREGATION_EXP_ALIAS} from '../constants-internal.js';\nimport {AggregationTypes} from '../constants.js';\nimport type {Attribute, TilejsonResult} from '../sources/types.js';\n\nexport type D3Scale = {\n domain: (d?: any) => any[];\n range: (d?: any) => any[];\n unknown?: (d?: string) => any;\n} & ((d: any) => any);\ntype D3ScaleFactory = () => D3Scale;\n\nexport type ScaleType =\n | 'linear'\n | 'ordinal'\n | 'log'\n | 'point'\n | 'quantile'\n | 'quantize'\n | 'sqrt'\n | 'custom'\n | 'identity';\nconst SCALE_FUNCS: Record<ScaleType, D3ScaleFactory> = {\n linear: scaleLinear,\n ordinal: scaleOrdinal,\n log: scaleLog,\n point: scalePoint,\n quantile: scaleQuantile,\n quantize: scaleQuantize,\n sqrt: scaleSqrt,\n custom: scaleThreshold,\n identity: scaleIdentity,\n};\n\nfunction identity<T>(v: T): T {\n return v;\n}\n\nconst hexToRGB = (c: any) => {\n const {r, g, b} = rgb(c);\n return [r, g, b];\n};\n\nconst rgbToHex = (c: number[]) => {\n const [r, g, b] = c;\n const rStr = r.toString(16).padStart(2, '0');\n const gStr = g.toString(16).padStart(2, '0');\n const bStr = b.toString(16).padStart(2, '0');\n return `#${rStr}${gStr}${bStr}`.toUpperCase();\n};\n\nconst UNKNOWN_COLOR = '#868d91';\nconst UNKNOWN_COLOR_RGB = hexToRGB(UNKNOWN_COLOR);\n\nexport const OPACITY_MAP: Record<string, string> = {\n getFillColor: 'opacity',\n getLineColor: 'strokeOpacity',\n getTextColor: 'opacity',\n};\n\nconst hexToRGBA = (c: any) => {\n const {r, g, b, opacity} = rgb(c);\n return [r, g, b, 255 * opacity];\n};\n\n// Kepler prop value -> Deck.gl prop value\n// Supports nested definitions, and function transforms:\n// {keplerProp: 'deckProp'} is equivalent to:\n// {keplerProp: x => ({deckProp: x})}\nconst sharedPropMap = {\n // Apply the value of Kepler `color` prop to the deck `getFillColor` prop\n color: 'getFillColor',\n isVisible: 'visible',\n label: 'cartoLabel',\n textLabel: {\n alignment: 'getTextAlignmentBaseline',\n anchor: 'getTextAnchor',\n // Apply the value of Kepler `textLabel.color` prop to the deck `getTextColor` prop\n color: 'getTextColor',\n size: 'getTextSize',\n },\n visConfig: {\n enable3d: 'extruded',\n elevationScale: 'elevationScale',\n filled: 'filled',\n strokeColor: 'getLineColor',\n stroked: 'stroked',\n thickness: 'getLineWidth',\n radius: 'getPointRadius',\n wireframe: 'wireframe',\n },\n};\n\nconst rasterPropsMap = {\n isVisible: 'visible',\n visConfig: {\n opacity: 'opacity',\n },\n};\n\nconst customMarkersPropsMap = {\n color: 'getIconColor',\n visConfig: {\n radius: 'getIconSize',\n },\n};\n\nconst heatmapTilePropsMap = {\n visConfig: {\n colorRange: (x: any) => ({colorRange: x.colors.map(hexToRGBA)}),\n radius: (radius: number) => ({radiusPixels: 20 + radius}),\n opacity: 'opacity',\n },\n};\n\nconst defaultProps = {\n lineMiterLimit: 2,\n lineWidthUnits: 'pixels',\n pointRadiusUnits: 'pixels',\n rounded: true,\n wrapLongitude: false,\n};\n\nfunction mergePropMaps(\n a: Record<string, any> = {},\n b: Record<string, any> = {}\n) {\n return {...a, ...b, visConfig: {...a.visConfig, ...b.visConfig}};\n}\n\nconst deprecatedLayerTypes = [\n 'geojson',\n 'grid',\n 'heatmap',\n 'hexagon',\n 'hexagonId',\n 'point',\n];\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_LABEL_INDEX = 0;\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_OUTLINE_OPACITY = 64;\n\nexport const TEXT_NUMBER_FORMATTER = new Intl.NumberFormat('en-US', {\n maximumFractionDigits: 2,\n notation: 'compact',\n});\n\nexport function getLayerProps(\n type: LayerType,\n config: MapLayerConfig,\n dataset: Dataset\n): {propMap: any; defaultProps: any} {\n if (deprecatedLayerTypes.includes(type)) {\n throw new Error(\n `Outdated layer type: ${type}. Please open map in CARTO Builder to automatically migrate.`\n );\n }\n\n if (type === 'raster') {\n return {\n propMap: rasterPropsMap,\n defaultProps: {},\n };\n }\n\n let basePropMap: any = sharedPropMap;\n if (config.visConfig?.customMarkers) {\n basePropMap = mergePropMaps(basePropMap, customMarkersPropsMap);\n }\n if (type === 'heatmapTile') {\n basePropMap = mergePropMaps(basePropMap, heatmapTilePropsMap);\n }\n const {aggregationExp, aggregationResLevel} = dataset;\n\n return {\n propMap: basePropMap,\n defaultProps: {\n ...defaultProps,\n ...(aggregationExp && {aggregationExp}),\n ...(aggregationResLevel && {aggregationResLevel}),\n uniqueIdProperty: 'geoid',\n },\n };\n}\n\nfunction domainFromAttribute(\n attribute: Attribute,\n scaleType: ScaleType,\n scaleLength: number\n): number[] | string[] {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n if (!attribute.categories) {\n return [0, 1];\n }\n return attribute.categories\n .map((c: any) => c.category)\n .filter((c: any) => c !== undefined && c !== null);\n }\n\n if (scaleType === 'quantile' && attribute.quantiles) {\n const quantiles: Record<number, number[]> =\n 'global' in attribute.quantiles\n ? attribute.quantiles.global\n : attribute.quantiles;\n\n // Stats API doesn't provide quantile[2] - which would be effecively [min, median, max]\n // so let's derive median from Quartiles (quantile[4]), of which second is median\n if (scaleLength === 2 && !quantiles[2] && quantiles[4]?.length === 5) {\n return [quantiles[4][0], quantiles[4][2], quantiles[4][4]];\n }\n if (quantiles[scaleLength]) {\n return quantiles[scaleLength];\n }\n }\n\n let {min} = attribute;\n if (scaleType === 'log' && min === 0) {\n min = 1e-5;\n }\n return [min ?? 0, attribute.max ?? 1];\n}\n\nfunction domainFromValues(values: any, scaleType: ScaleType) {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n return groupSort(\n values,\n (g) => -g.length,\n (d) => d\n );\n } else if (scaleType === 'quantile') {\n return values.sort((a: any, b: any) => a - b);\n } else if (scaleType === 'log') {\n const [d0, d1] = extent(values as number[]);\n return [d0 === 0 ? 1e-5 : d0, d1];\n }\n return extent(values);\n}\n\nfunction calculateDomain(\n data: TilejsonResult,\n name: string,\n scaleType: ScaleType,\n scaleLength?: number\n) {\n if (data.tilestats) {\n // Tileset data type\n const {attributes} = data.tilestats.layers[0];\n const attribute = attributes.find((a: any) => a.attribute === name);\n if (attribute) {\n return domainFromAttribute(attribute, scaleType, scaleLength as number);\n }\n }\n\n return [0, 1];\n}\n\nfunction normalizeAccessor(accessor: any, data: any) {\n if (data.features || data.tilestats || data.raster_metadata) {\n return (object: any, info: any) => {\n if (object) {\n return accessor(object.properties || object.__source.object.properties);\n }\n\n const {data, index} = info;\n const proxy = createBinaryProxy(data, index);\n return accessor(proxy);\n };\n }\n return accessor;\n}\n\nexport function opacityToAlpha(opacity?: number) {\n return opacity !== undefined\n ? Math.round(255 * Math.pow(opacity, 1 / 2.2))\n : 255;\n}\n\nfunction getAccessorKeys(name: string, aggregation?: string | null): string[] {\n let keys = [name];\n if (aggregation) {\n // Snowflake will capitalized the keys, need to check lower and upper case version\n keys = keys.concat(\n [aggregation, aggregation.toUpperCase()].map((a) => `${name}_${a}`)\n );\n }\n return keys;\n}\n\nfunction findAccessorKey(keys: string[], properties: any): string[] {\n for (const key of keys) {\n if (key in properties) {\n return [key];\n }\n }\n\n // If data doesn't contain any valid keys, return all keys to run search\n // on next feature\n return keys;\n}\n\nexport function getColorAccessor(\n {name, colorColumn}: VisualChannelField,\n scaleType: ScaleType,\n {aggregation, range}: {aggregation?: string; range: ColorRange},\n opacity: number | undefined,\n data: TilejsonResult\n): {\n accessor: any;\n domain: number[] | string[];\n scaleDomain: number[] | string[];\n range: string[];\n} {\n const {scale, domain} = calculateLayerScale(\n colorColumn || name,\n colorColumn ? 'identity' : scaleType,\n range,\n data\n );\n const alpha = opacityToAlpha(opacity);\n\n let accessorKeys = getAccessorKeys(colorColumn || name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n const scaled = scale(propertyValue);\n const rgb = typeof scaled === 'string' ? hexToRGB(scaled) : scaled;\n return [...rgb, propertyValue === null ? 0 : alpha];\n };\n return {\n accessor: normalizeAccessor(accessor, data),\n scaleDomain: scale.domain(),\n domain,\n range: (scale.range() || []).map(rgbToHex),\n };\n}\n\nexport function calculateLayerScale(\n name: string,\n scaleType: ScaleType,\n range: ColorRange,\n data: TilejsonResult\n): {scale: D3Scale; domain: string[] | number[]} {\n let scaleDomain: number[] | string[] | undefined;\n let scaleColors: string[] = [];\n const {colors} = range;\n\n const domain = calculateDomain(data, name, scaleType, colors.length);\n if (scaleType !== 'identity') {\n if (range.colorMap) {\n const {colorMap} = range;\n scaleDomain = [];\n colorMap.forEach(([value, color]) => {\n (scaleDomain as any[]).push(value);\n scaleColors.push(color);\n });\n } else {\n if (scaleType === 'custom' && range.uiCustomScaleType === 'logarithmic') {\n const [min, max] = domain as number[];\n scaleDomain = getLog10ScaleSteps({\n min,\n max,\n steps: colors.length,\n });\n\n scaleColors = colors;\n } else {\n scaleColors = colors;\n }\n }\n }\n return {\n scale: createColorScale(\n scaleType,\n scaleDomain || domain,\n scaleColors.map(hexToRGB),\n UNKNOWN_COLOR_RGB\n ),\n domain,\n };\n}\n\nexport function createColorScale<T>(\n scaleType: ScaleType,\n domain: string[] | number[],\n range: T[],\n unknown: T\n) {\n const scale = SCALE_FUNCS[scaleType]();\n scale.domain(domain);\n scale.range(range);\n scale.unknown!(unknown as any);\n\n return scale;\n}\n\nconst FALLBACK_ICON =\n 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';\n\nexport function getIconUrlAccessor(\n field: VisualChannelField | null | undefined,\n range: CustomMarkersRange | null | undefined,\n {\n fallbackUrl,\n maxIconSize,\n useMaskedIcons,\n }: {\n fallbackUrl?: string | null;\n maxIconSize: number;\n useMaskedIcons?: boolean;\n },\n data: any\n) {\n const urlToUnpackedIcon = (url: string) => ({\n id: `${url}@@${maxIconSize}`,\n url,\n width: maxIconSize,\n height: maxIconSize,\n mask: useMaskedIcons,\n });\n let unknownValue = fallbackUrl || FALLBACK_ICON;\n\n if (range?.othersMarker) {\n unknownValue = range.othersMarker;\n }\n\n const unknownIcon = urlToUnpackedIcon(unknownValue);\n if (!range || !field) {\n return () => unknownIcon;\n }\n\n const mapping: Record<string, any> = {};\n for (const {value, markerUrl} of range.markerMap) {\n if (markerUrl) {\n mapping[value] = urlToUnpackedIcon(markerUrl);\n }\n }\n\n const accessor = (properties: any) => {\n const propertyValue = properties[field.name];\n return mapping[propertyValue] || unknownIcon;\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport function getMaxMarkerSize(\n visConfig: VisConfig,\n visualChannels: VisualChannels\n): number {\n const {radiusRange, radius} = visConfig;\n const {radiusField, sizeField} = visualChannels;\n const field = radiusField || sizeField;\n return Math.ceil(radiusRange && field ? radiusRange[1] : radius);\n}\n\ntype Accessor = number | ((d: any, i: any) => number);\nexport function negateAccessor(accessor: Accessor): Accessor {\n if (typeof accessor === 'function') {\n return (d: any, i: any) => -accessor(d, i);\n }\n return -accessor;\n}\n\nexport function getSizeAccessor(\n {name}: VisualChannelField,\n scaleType: ScaleType | undefined,\n aggregation: string | null | undefined,\n range: number[] | undefined,\n data: TilejsonResult\n): {\n accessor: any;\n domain: number[];\n scaleDomain: number[];\n range: number[] | undefined;\n} {\n const scale = scaleType ? SCALE_FUNCS[scaleType]() : identity;\n let domain: number[] = [];\n if (scaleType && range) {\n if (aggregation !== AggregationTypes.Count) {\n domain = calculateDomain(data, name, scaleType) as number[];\n (scale as D3Scale).domain(domain);\n } else {\n domain = (scale as D3Scale).domain();\n }\n (scale as D3Scale).range(range);\n }\n\n let accessorKeys = getAccessorKeys(name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n return scale(propertyValue);\n };\n return {\n accessor: normalizeAccessor(accessor, data),\n domain,\n scaleDomain: domain,\n range,\n };\n}\n\nconst FORMATS: Record<string, (value: any) => string> = {\n date: formatDate,\n integer: d3Format('i'),\n float: d3Format('.5f'),\n timestamp: formatTimestamp,\n default: String,\n};\n\nexport function getTextAccessor({name, type}: VisualChannelField, data: any) {\n const format = FORMATS[type] || FORMATS.default;\n const accessor = (properties: any) => {\n return format(properties[name]);\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport {domainFromValues as _domainFromValues};\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterRadius(\n properties: {[column: string]: number},\n stats: Record<string, {min: number; max: number}>,\n radiusRange: [number, number],\n column: string\n): number {\n const {min, max} = stats[column];\n const value = properties[column];\n\n // When there's a single cluster on the screen, min and max are equivalent, so we should return the maximum radius\n if (min === max) return radiusRange[1];\n\n const normalizedValue = (value - min) / (max - min);\n return radiusRange[0] + normalizedValue * (radiusRange[1] - radiusRange[0]);\n}\n\n/** @privateRemarks Source: Builder */\nexport function getDefaultAggregationExpColumnAliasForLayerType(\n layerType: LayerType,\n provider: ProviderType,\n schema: SchemaField[]\n): string {\n if (schema && layerType === 'clusterTile') {\n return getColumnAliasForAggregationExp(\n getDefaultColumnFromSchemaForAggregationExp(schema),\n 'count',\n provider\n );\n } else {\n return DEFAULT_AGGREGATION_EXP_ALIAS;\n }\n}\n\n/** @privateRemarks Source: Builder */\nfunction getColumnAliasForAggregationExp(\n name: string,\n aggregation: string,\n provider: ProviderType\n) {\n const columnAlias = `${name}_${aggregation}`;\n return provider === 'snowflake' ? columnAlias.toUpperCase() : columnAlias;\n}\n\n/** @privateRemarks Source: Builder */\nfunction getDefaultColumnFromSchemaForAggregationExp(\n schema: SchemaField[]\n): string {\n return schema ? schema[0].name : '';\n}\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterTextFontSize(radius: number): number {\n if (radius >= 80) return 24;\n if (radius >= 72) return 24;\n if (radius >= 56) return 20;\n if (radius >= 40) return 16;\n if (radius >= 24) return 13;\n if (radius >= 8) return 11;\n return 11;\n}\n","import type {BinaryFeature} from '@loaders.gl/schema';\nimport type {Dataset} from './types.js';\ntype Properties = BinaryFeature['properties'];\ntype NumericProps = BinaryFeature['numericProps'];\n\n// Returns a Proxy object that allows accessing binary data\n// as if it were JSON properties\nexport function createBinaryProxy(\n data: {numericProps: NumericProps; properties: Properties[]},\n index: number\n) {\n const {properties, numericProps} = data;\n return new Proxy(properties[index] || {}, {\n get(target, property) {\n if (property in numericProps) {\n return numericProps[property as string].value[index];\n }\n return target[property as any];\n },\n\n has(target, property) {\n return property in numericProps || property in target;\n },\n\n ownKeys(target) {\n return [...Object.keys(numericProps), ...Reflect.ownKeys(target)];\n },\n\n getOwnPropertyDescriptor() {\n return {enumerable: true, configurable: true};\n },\n });\n}\n\nexport function scaleIdentity() {\n let unknown: any;\n\n function scale(x: any) {\n return x === null ? unknown : x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = (d: any) => d;\n\n scale.unknown = (u: any) => {\n if (u) {\n unknown = u;\n }\n\n return unknown;\n };\n\n scale.copy = () => {\n const scaleCopy = scaleIdentity();\n scaleCopy.unknown(unknown);\n return scaleCopy;\n };\n\n return scale;\n}\n\nexport function isRemoteCalculationSupported(dataset: Dataset) {\n if (dataset?.type === 'tileset' || dataset.providerId === 'databricks') {\n return false;\n }\n\n return true;\n}\n\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n year: '2-digit',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function formatDate(value: string | number | Date): string {\n return DATE_FORMATTER.format(new Date(value));\n}\n\nexport function formatTimestamp(value: string | number | Date): string {\n return String(Math.floor(new Date(value).getTime() / 1000));\n}\n\nfunction roundedPow10(exp: number) {\n // Math.pow(10, less than 4) generates \"0.0...009999999999999999\" instead of \"0.0...01\"\n // round it ...\n const raw = Math.pow(10, exp);\n if (exp < 0) {\n const shift = Math.pow(10, -exp);\n return Math.round(raw * shift) / shift;\n }\n return raw;\n}\n\n/**\n * Create domain for D3 threshold scale with logarithmic steps.\n *\n * If min is 0, it starts with max and goes down to fill color scale.\n * If max is Infinity, it starts with 10 and goes up to fill color scale.\n * Othersise it starts on first power of 10 that is greater than min.\n *\n * Generates `steps-1` entries, as this is what d3 threshold scale expects\n *\n * @see https://d3js.org/d3-scale/threshold\n */\nexport function getLog10ScaleSteps({\n min,\n max,\n steps,\n}: {\n min: number;\n max: number;\n steps: number;\n}): number[] {\n if (min === 0) {\n if (max === Infinity) {\n // count aggregations have [0, Infinity]\n // that will yield [10, 100, 1000, ...]\n return [...Array(steps - 1)].map((_v, i) => roundedPow10(i + 1));\n }\n // if stats.min = 0, we only can attempt to start from max and decrease powers until\n // we use all color buckets ...\n const maxLog = Math.log10(max);\n const endExponent = Math.ceil(maxLog);\n const startExponent = endExponent - steps + 1;\n return [...Array(steps - 1)].map((_v, i) =>\n roundedPow10(startExponent + i)\n );\n } else {\n const minLog = Math.log10(min);\n const startExponent =\n Math.ceil(minLog) === minLog ? minLog + 1 : Math.ceil(minLog);\n\n return [...Array(steps - 1)].map((_v, i) =>\n roundedPow10(startExponent + i)\n );\n }\n}\n","import type {RasterMetadata, RasterMetadataBand} from '../sources/types.js';\n\nimport {\n createVecExprEvaluator,\n type VecExprResult,\n type VecExprVecLike,\n} from './vec-expr-evaluator.js';\nimport type {\n ColorBand,\n ColorRange,\n MapLayerConfig,\n RasterLayerConfigColorBand,\n VisualChannels,\n} from './types.js';\nimport {createColorScale, type ScaleType} from './layer-map.js';\nimport {getLog10ScaleSteps} from './utils.js';\n\nconst UNKNOWN_COLOR = [134, 141, 145];\n\nconst RASTER_COLOR_BANDS = ['red', 'green', 'blue'] as const;\n\nfunction getHasDataPredicate(noData: number | string | undefined) {\n if (noData === 'nan') {\n return (v: number) => !isNaN(v);\n }\n if (typeof noData === 'string') {\n noData = parseFloat(noData);\n }\n if (typeof noData === 'number') {\n return (v: number) => v !== noData && !isNaN(v);\n }\n\n return () => true;\n}\n\n// this is data as seen in RasterLayer\ntype RasterLayerData = {\n blockSize: number;\n cells: BinaryDataCells;\n};\n\n// this is data as seen in RasterColumnLayer - the one that actually renders pixels\n// (binary data is just wrapped)\ntype RasterColumnLayerData = {\n length: number; // number of pixels\n data: RasterLayerData;\n\n // used to store buffers directly to be used by deck.gl, so we can skip accessors\n attributes?: Record<string, ArrayLike<number>>;\n\n // temporary storage for expression results filled in dataTransform\n expressionEvalContext?: Record<string, ArrayLike<number>>;\n customExpressionResults?: Record<string, VecExprResult>;\n};\n\ntype BinaryDataCells = {\n numericProps: Record<string, {value: VecExprVecLike}>;\n};\n\nfunction createRasterColumnLayerDataTransform(\n transform: (dataWrapped: RasterColumnLayerData) => RasterColumnLayerData\n) {\n return (data: RasterLayerData | RasterColumnLayerData) => {\n if (!data || !('data' in data) || !data?.data?.cells?.numericProps) {\n // we're in RasterLayer, or we've got invalid data\n return data as RasterLayerData;\n }\n // we only transform data when in RasterColumnLayer\n return transform(data);\n };\n}\n\nfunction createEvaluationContext(\n numericProps: Record<string, {value: VecExprVecLike}>,\n noData: number | string | undefined\n) {\n // Optimization note\n // Seems like Array.from(256k+typed array takes even 15ms), so _we_ can afford to copy the array if we really don't need it to\n // only copy values to array only if we really see nodata in all bands\n const hasData = getHasDataPredicate(noData);\n const bands = Object.entries(numericProps).map(([bandName, {value}]) => ({\n bandName,\n values: value,\n copied: false,\n }));\n\n const length = bands[0].values.length;\n\n for (let i = 0; i < length; i++) {\n let hasSomeData = false;\n for (let j = 0; j < bands.length; j++) {\n hasSomeData = hasSomeData || hasData(bands[j].values[i]);\n }\n if (!hasSomeData) {\n for (let j = 0; j < bands.length; j++) {\n if (!bands[j].copied) {\n bands[j].copied = true;\n bands[j].values = Array.from(bands[j].values);\n }\n bands[j].values[i] = NaN;\n }\n }\n }\n\n const context = bands.reduce(\n (agg, {bandName, values}) => {\n agg[bandName] = values;\n return agg;\n },\n {} as Record<string, ArrayLike<number>>\n );\n return context;\n}\n\nfunction createExprDataTransform({\n colorBand,\n rasterMetadata,\n usedSymbols,\n}: {\n colorBand: RasterLayerConfigColorBand | null | undefined;\n rasterMetadata: RasterMetadata;\n usedSymbols: string[];\n}) {\n if (!colorBand || !colorBand.type || colorBand.type === 'none') {\n return undefined;\n }\n\n const expr = colorBand?.type === 'expression' ? colorBand.value : undefined;\n const vecExprEvaluator = expr ? createVecExprEvaluator(expr) : undefined;\n\n const dataTransform = createRasterColumnLayerDataTransform(\n (dataWrapped: RasterColumnLayerData) => {\n const data = dataWrapped.data;\n if (expr) {\n const cachedResult = dataWrapped.customExpressionResults?.[expr];\n if (cachedResult) {\n return dataWrapped;\n }\n }\n\n let context = dataWrapped.expressionEvalContext;\n if (!context) {\n const usedNumericProps = usedSymbols.reduce(\n (acc, symbol) => {\n acc[symbol] = data.cells.numericProps[symbol];\n return acc;\n },\n {} as Record<string, {value: VecExprVecLike}>\n );\n context = createEvaluationContext(\n usedNumericProps,\n rasterMetadata.nodata\n );\n dataWrapped = {\n ...dataWrapped,\n expressionEvalContext: context,\n };\n }\n\n if (!vecExprEvaluator || !expr) return dataWrapped;\n\n const evalResult = vecExprEvaluator(context);\n return {\n ...dataWrapped,\n customExpressionResults: {\n ...dataWrapped.customExpressionResults,\n [expr]: evalResult,\n },\n };\n }\n );\n return dataTransform;\n}\n\nfunction combineDataTransforms<T>(\n dataTransforms: (((data: T) => T) | undefined)[]\n): ((data: T) => T) | undefined {\n const actualTransforms = dataTransforms.filter((v) => v) as ((\n data: T\n ) => T)[];\n\n if (actualTransforms.length === 0) return undefined;\n if (actualTransforms.length === 1) return actualTransforms[0];\n\n return (data: T) =>\n actualTransforms.reduce(\n (aggData, transformFun) => transformFun(aggData),\n data\n );\n}\n\nfunction createRgbToColorBufferDataTransform({\n bandDefs,\n attribute,\n}: {\n bandDefs: Partial<Record<ColorBand, RasterLayerConfigColorBand>>;\n attribute: string;\n}) {\n return createRasterColumnLayerDataTransform(\n (dataWrapped: RasterColumnLayerData) => {\n const length = dataWrapped.length;\n\n const getBandBufferOrValue = (colorBand?: RasterLayerConfigColorBand) => {\n if (colorBand?.type === 'expression') {\n return dataWrapped.customExpressionResults?.[colorBand.value];\n }\n if (colorBand?.type === 'band') {\n // we could use original band, but this one is already cleared from nodata if needed\n return dataWrapped.expressionEvalContext?.[colorBand.value];\n }\n return 0;\n };\n\n const red = getBandBufferOrValue(bandDefs.red);\n const green = getBandBufferOrValue(bandDefs.green);\n const blue = getBandBufferOrValue(bandDefs.blue);\n\n const colorBuffer = new Uint8Array(length * 4);\n for (\n let inputIndex = 0, outputIndex = 0;\n inputIndex < length;\n inputIndex++, outputIndex += 4\n ) {\n const redRaw =\n typeof red === 'number' ? red : red ? red[inputIndex] : NaN;\n const greenRaw =\n typeof green === 'number' ? green : green ? green[inputIndex] : NaN;\n const blueRaw =\n typeof blue === 'number' ? blue : blue ? blue[inputIndex] : NaN;\n\n if (isNaN(redRaw) && isNaN(greenRaw) && isNaN(blueRaw)) {\n // skip pixel\n bufferSetRgba(colorBuffer, outputIndex, 0, 0, 0, 0);\n } else {\n bufferSetRgba(\n colorBuffer,\n outputIndex,\n redRaw,\n greenRaw,\n blueRaw,\n 255\n );\n }\n }\n\n // clear cached buffers\n // This transform is applied last -after expression & band evaluators which store and\n // cache values for _this_ transform.\n // Now, _assuming_ this is last transform we can clear those buffers.\n dataWrapped.customExpressionResults = undefined;\n dataWrapped.expressionEvalContext = undefined;\n\n return {\n ...dataWrapped,\n attributes: {\n [attribute]: colorBuffer,\n },\n };\n }\n );\n}\n\nfunction getUsedSymbols(colorBands: RasterLayerConfigColorBand[]) {\n return Array.from(\n colorBands.reduce((symbols, band) => {\n if (band.type === 'expression') {\n const expressionSymbols =\n createVecExprEvaluator(band.value)?.symbols || [];\n expressionSymbols.forEach((symbol) => symbols.add(symbol));\n }\n if (band.type === 'band') {\n symbols.add(band.value);\n }\n return symbols;\n }, new Set<string>())\n );\n}\n\nexport function getRasterTileLayerStylePropsRgb({\n layerConfig,\n rasterMetadata,\n visualChannels,\n}: {\n layerConfig: MapLayerConfig;\n rasterMetadata: RasterMetadata;\n visualChannels: VisualChannels;\n}) {\n const {visConfig} = layerConfig;\n const {colorBands} = visConfig;\n\n const bandDefs = {\n red: colorBands?.find((band) => band.band === 'red'),\n green: colorBands?.find((band) => band.band === 'green'),\n blue: colorBands?.find((band) => band.band === 'blue'),\n };\n\n const rgbToInstanceFillColorsDataTransform =\n createRgbToColorBufferDataTransform({\n bandDefs,\n attribute: 'instanceFillColors',\n });\n\n const usedSymbols = colorBands ? getUsedSymbols(colorBands) : [];\n const bandTransforms = RASTER_COLOR_BANDS.map((band) =>\n createExprDataTransform({\n colorBand: bandDefs[band],\n rasterMetadata,\n usedSymbols,\n })\n );\n const combinedDataTransform = combineDataTransforms([\n ...bandTransforms,\n rgbToInstanceFillColorsDataTransform,\n ]);\n\n return {\n dataTransform: combinedDataTransform as () => any,\n updateTriggers: getRasterTileLayerUpdateTriggers({\n layerConfig,\n visualChannels,\n }),\n };\n}\n\nfunction createBandColorScaleDataTransform({\n bandName,\n scaleFun,\n nodata,\n attribute,\n}: {\n bandName: string;\n scaleFun: (v: number) => number[];\n nodata: number | string | undefined;\n attribute: string;\n}) {\n const hasData = getHasDataPredicate(nodata);\n\n return createRasterColumnLayerDataTransform(\n (dataWrapped: RasterColumnLayerData) => {\n const length = dataWrapped.length;\n const bandBuffer = dataWrapped.data.cells.numericProps[bandName].value;\n const colorBuffer = new Uint8Array(length * 4);\n\n for (let i = 0; i < length; i++) {\n const rawValue = bandBuffer[i];\n if (!hasData(rawValue)) {\n // skip pixel\n bufferSetRgba(colorBuffer, i * 4, 0, 0, 0, 0);\n } else {\n const colorRgb = scaleFun(rawValue);\n bufferSetRgba(\n colorBuffer,\n i * 4,\n colorRgb[0],\n colorRgb[1],\n colorRgb[2],\n 255\n );\n }\n }\n return {\n ...dataWrapped,\n attributes: {\n [attribute]: colorBuffer,\n },\n };\n }\n );\n}\n\nexport function domainFromRasterMetadataBand(\n band: RasterMetadataBand,\n scaleType: ScaleType,\n colorRange: ColorRange\n) {\n if (scaleType === 'ordinal') {\n return colorRange.colorMap?.map(([value]) => value) || [];\n }\n if (scaleType === 'custom') {\n if (colorRange.uiCustomScaleType === 'logarithmic') {\n return getLog10ScaleSteps({\n min: band.stats.min,\n max: band.stats.max,\n steps: colorRange.colors.length,\n });\n } else {\n // actually custom, read colorMap\n return colorRange.colorMap?.map(([value]) => value) || [];\n }\n }\n const scaleLength = colorRange.colors.length;\n if (scaleType === 'quantile') {\n const quantiles = band.stats.quantiles?.[scaleLength];\n if (!quantiles) {\n return [0, 1];\n }\n return [band.stats.min, ...quantiles, band.stats.max];\n }\n return [band.stats.min, band.stats.max];\n}\n\n/**\n * Get RasterLayerStyle props for ColorRange and UniqueValues modes\n *\n * Effectively, applies selected color scale applied to one band.\n */\nexport function getRasterTileLayerStylePropsScaledBand({\n layerConfig,\n rasterMetadata,\n visualChannels,\n}: {\n layerConfig: MapLayerConfig;\n visualChannels: VisualChannels;\n rasterMetadata: RasterMetadata;\n}) {\n const {visConfig} = layerConfig;\n const {colorField} = visualChannels;\n const {rasterStyleType} = visConfig;\n\n const colorRange =\n rasterStyleType === 'ColorRange'\n ? visConfig.colorRange\n : visConfig.uniqueValuesColorRange;\n const scaleType =\n rasterStyleType === 'ColorRange' ? visualChannels.colorScale : 'ordinal';\n const bandInfo = rasterMetadata.bands.find(\n (band) => band.name === colorField?.name\n );\n\n if (!colorField?.name || !scaleType || !colorRange || !bandInfo) {\n return {};\n }\n\n const domain = domainFromRasterMetadataBand(bandInfo, scaleType, colorRange);\n\n const scaleFun = createColorScale(\n scaleType,\n domain,\n colorRange.colors.map(hexToRGB),\n UNKNOWN_COLOR\n );\n\n const bandColorScaleDataTransform = createBandColorScaleDataTransform({\n bandName: bandInfo.name,\n scaleFun,\n nodata: bandInfo?.nodata ?? rasterMetadata.nodata,\n attribute: 'instanceFillColors',\n });\n\n return {\n dataTransform: bandColorScaleDataTransform as () => any,\n updateTriggers: getRasterTileLayerUpdateTriggers({\n layerConfig,\n visualChannels,\n }),\n };\n}\n\nexport function getRasterTileLayerStyleProps({\n layerConfig,\n visualChannels,\n rasterMetadata,\n}: {\n layerConfig: MapLayerConfig;\n visualChannels: VisualChannels;\n rasterMetadata: RasterMetadata;\n}) {\n const {visConfig} = layerConfig;\n const {rasterStyleType} = visConfig;\n\n if (rasterStyleType === 'Rgb') {\n return getRasterTileLayerStylePropsRgb({\n layerConfig,\n rasterMetadata,\n visualChannels,\n });\n } else {\n return getRasterTileLayerStylePropsScaledBand({\n layerConfig,\n rasterMetadata,\n visualChannels,\n });\n }\n}\n\nexport function getRasterTileLayerUpdateTriggers({\n layerConfig,\n visualChannels,\n}: {\n layerConfig: MapLayerConfig;\n visualChannels: VisualChannels;\n}) {\n const {visConfig} = layerConfig;\n const {rasterStyleType} = visConfig;\n const getFillColorUpdateTriggers: Record<string, unknown> = {\n rasterStyleType,\n };\n if (rasterStyleType === 'ColorRange') {\n getFillColorUpdateTriggers.colorRange = visConfig.colorRange?.colors;\n getFillColorUpdateTriggers.colorMap = visConfig.colorRange?.colorMap;\n getFillColorUpdateTriggers.colorScale = visualChannels.colorScale;\n getFillColorUpdateTriggers.colorFieldId = visualChannels.colorField?.name;\n } else if (rasterStyleType === 'UniqueValues') {\n getFillColorUpdateTriggers.colorMap =\n visConfig.uniqueValuesColorRange?.colorMap;\n getFillColorUpdateTriggers.colorFieldId = visualChannels.colorField?.name;\n } else if (rasterStyleType === 'Rgb') {\n getFillColorUpdateTriggers.colorBands = visConfig.colorBands;\n }\n\n return {\n getFillColor: getFillColorUpdateTriggers,\n };\n}\n\nfunction bufferSetRgba(\n target: VecExprVecLike,\n index: number,\n r: number,\n g: number,\n b: number,\n a: number\n) {\n target[index + 0] = r;\n target[index + 1] = g;\n target[index + 2] = b;\n target[index + 3] = a;\n}\n\nfunction hexToRGB(hexColor: string): [number, number, number] {\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n\n return [r, g, b];\n}\n","import type {ColorParameters} from '@luma.gl/core';\nimport {\n calculateClusterRadius,\n calculateClusterTextFontSize,\n getDefaultAggregationExpColumnAliasForLayerType,\n getLayerProps,\n getColorAccessor,\n getSizeAccessor,\n getTextAccessor,\n opacityToAlpha,\n getIconUrlAccessor,\n negateAccessor,\n getMaxMarkerSize,\n type LayerType,\n OPACITY_MAP,\n TEXT_NUMBER_FORMATTER,\n TEXT_LABEL_INDEX,\n TEXT_OUTLINE_OPACITY,\n type ScaleType,\n} from './layer-map.js';\n\nimport {assert, isEmptyObject} from '../utils.js';\nimport type {Filters} from '../types.js';\nimport type {\n KeplerMapConfig,\n MapLayerConfig,\n VisualChannels,\n VisConfig,\n MapConfigLayer,\n Dataset,\n VisualChannelField,\n} from './types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\nimport {\n getRasterTileLayerStylePropsRgb,\n getRasterTileLayerStylePropsScaledBand,\n} from './raster-layer.js';\nimport type {TilejsonResult} from '../sources/types.js';\n\nexport type Scale = {\n type: ScaleType;\n field: VisualChannelField;\n\n /** Natural domain of the scale, as defined by the data */\n domain: string[] | number[];\n\n /** Domain of the user to construct d3 scale */\n scaleDomain?: string[] | number[];\n range?: string[] | number[];\n};\n\nexport type ScaleKey =\n | 'fillColor'\n | 'pointRadius'\n | 'lineColor'\n | 'elevation'\n | 'weight';\n\nexport type Scales = Partial<Record<ScaleKey, Scale>>;\n\nexport type LayerDescriptor = {\n type: LayerType;\n props: Record<string, any>;\n filters?: Filters;\n scales: Scales;\n};\n\nexport type ParseMapResult = {\n /** Map id. */\n id: string;\n\n /** Title of map. */\n title: string;\n\n /** Description of map. */\n description?: string;\n createdAt: string;\n updatedAt: string;\n initialViewState: any;\n\n /** @deprecated Use `basemap`. */\n mapStyle: any;\n popupSettings: any;\n token: string;\n\n layers: LayerDescriptor[];\n};\n\nexport function getLayerDescriptor({\n mapConfig,\n layer,\n dataset,\n}: {\n mapConfig: KeplerMapConfig;\n layer: MapConfigLayer;\n dataset: Dataset;\n}) {\n const {filters, visState} = mapConfig;\n const {layerBlending, interactionConfig} = visState;\n const {id, type, config, visualChannels} = layer;\n const {data, id: datasetId} = dataset;\n\n const {propMap, defaultProps} = getLayerProps(type, config, dataset);\n\n const styleProps = createStyleProps(config, propMap);\n\n const {channelProps, scales} = createChannelProps(\n id,\n type,\n config,\n visualChannels,\n data,\n dataset\n );\n const layerDescriptor: LayerDescriptor = {\n type,\n filters:\n isEmptyObject(filters) || isRemoteCalculationSupported(dataset)\n ? undefined\n : filters[datasetId],\n props: {\n id,\n data,\n ...defaultProps,\n ...createInteractionProps(interactionConfig),\n ...styleProps,\n ...channelProps,\n ...createParametersProp(layerBlending, styleProps.parameters || {}), // Must come after style\n ...createLoadOptions(data.accessToken),\n },\n scales,\n };\n return layerDescriptor;\n}\n\nexport function parseMap(json: any) {\n const {keplerMapConfig, datasets, token} = json;\n assert(keplerMapConfig.version === 'v1', 'Only support Kepler v1');\n const mapConfig = keplerMapConfig.config as KeplerMapConfig;\n const {mapState, mapStyle, popupSettings, legendSettings, visState} =\n mapConfig;\n const {layers} = visState;\n\n const layersReverse = [...layers].reverse();\n return {\n id: json.id,\n title: json.title,\n description: json.description,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n initialViewState: mapState,\n /** @deprecated Use `basemap`. */\n mapStyle,\n popupSettings,\n legendSettings,\n token,\n layers: layersReverse.map((layer: MapConfigLayer) => {\n try {\n const {dataId} = layer.config;\n const dataset: Dataset | null = datasets.find(\n (d: any) => d.id === dataId\n );\n assert(dataset, `No dataset matching dataId: ${dataId}`);\n const layerDescriptor = getLayerDescriptor({\n mapConfig,\n layer,\n dataset,\n });\n return layerDescriptor;\n } catch (e: any) {\n console.error(e.message);\n return undefined;\n }\n }),\n };\n}\n\nfunction createParametersProp(\n layerBlending: string,\n parameters: ColorParameters\n) {\n if (layerBlending === 'additive') {\n parameters.blendColorSrcFactor = parameters.blendAlphaSrcFactor =\n 'src-alpha';\n parameters.blendColorDstFactor = parameters.blendAlphaDstFactor =\n 'dst-alpha';\n parameters.blendColorOperation = parameters.blendAlphaOperation = 'add';\n } else if (layerBlending === 'subtractive') {\n parameters.blendColorSrcFactor = 'one';\n parameters.blendColorDstFactor = 'one-minus-dst-color';\n parameters.blendAlphaSrcFactor = 'src-alpha';\n parameters.blendAlphaDstFactor = 'dst-alpha';\n parameters.blendColorOperation = 'subtract';\n parameters.blendAlphaOperation = 'add';\n }\n\n return Object.keys(parameters).length ? {parameters} : {};\n}\n\nfunction createInteractionProps(interactionConfig: any) {\n const pickable = interactionConfig && interactionConfig.tooltip.enabled;\n return {\n autoHighlight: pickable,\n pickable,\n };\n}\n\nfunction mapProps(source: any, target: any, mapping: any) {\n for (const sourceKey in mapping) {\n const sourceValue = source[sourceKey];\n const targetKey = mapping[sourceKey];\n if (sourceValue === undefined) {\n continue;\n }\n if (typeof targetKey === 'string') {\n target[targetKey] = sourceValue;\n } else if (typeof targetKey === 'function') {\n const [key, value] = Object.entries(targetKey(sourceValue))[0];\n target[key] = value;\n } else if (typeof targetKey === 'object') {\n // Nested definition, recurse down one level (also handles arrays)\n mapProps(sourceValue, target, targetKey);\n }\n }\n}\n\nfunction createStyleProps(config: MapLayerConfig, mapping: any) {\n const result: Record<string, any> = {};\n mapProps(config, result, mapping);\n\n // Kepler format sometimes omits strokeColor. TODO: remove once we can rely on\n // `strokeColor` always being set when `stroke: true`.\n if (result.stroked && !result.getLineColor) {\n result.getLineColor = result.getFillColor;\n }\n\n for (const colorAccessor in OPACITY_MAP) {\n if (Array.isArray(result[colorAccessor])) {\n const color = [...result[colorAccessor]];\n const opacityKey = OPACITY_MAP[colorAccessor];\n const opacity = config.visConfig[opacityKey as keyof VisConfig] as number;\n color[3] = opacityToAlpha(opacity);\n result[colorAccessor] = color;\n }\n }\n\n result.highlightColor = config.visConfig.enable3d\n ? [255, 255, 255, 60]\n : [252, 242, 26, 255];\n return result;\n}\n\nfunction createChannelProps(\n id: string,\n layerType: LayerType,\n config: MapLayerConfig,\n visualChannels: VisualChannels,\n data: TilejsonResult,\n dataset: Dataset\n): {\n channelProps: Record<string, any>;\n scales: Partial<Record<ScaleKey, Scale>>;\n} {\n if (layerType === 'raster') {\n const rasterMetadata = data.raster_metadata;\n if (!rasterMetadata) {\n return {\n channelProps: {},\n scales: {},\n };\n }\n const rasterStyleType = config.visConfig.rasterStyleType;\n if (rasterStyleType === 'Rgb') {\n return {\n channelProps: getRasterTileLayerStylePropsRgb({\n layerConfig: config,\n rasterMetadata,\n visualChannels,\n }),\n scales: {}, // TODO\n };\n } else {\n return {\n channelProps: getRasterTileLayerStylePropsScaledBand({\n layerConfig: config,\n visualChannels,\n rasterMetadata,\n }),\n scales: {\n // TODO\n },\n };\n }\n }\n const {textLabel, visConfig} = config;\n const result: Record<string, any> = {};\n const updateTriggers: Record<string, any> = {};\n\n const scales: Record<string, Scale> = {};\n\n // fill color\n {\n const {colorField, colorScale} = visualChannels;\n const {colorRange, colorAggregation} = visConfig;\n if (colorField && colorScale && colorRange) {\n const {accessor, ...scaleProps} = getColorAccessor(\n colorField,\n colorScale,\n {aggregation: colorAggregation, range: colorRange},\n visConfig.opacity,\n data\n );\n result.getFillColor = accessor;\n scales.fillColor = updateTriggers.getFillColor = {\n field: colorField,\n type: colorScale,\n ...scaleProps,\n };\n } else {\n scales.fillColor = {} as any;\n }\n }\n\n if (layerType === 'clusterTile') {\n const aggregationExpAlias = getDefaultAggregationExpColumnAliasForLayerType(\n layerType,\n dataset.providerId,\n data.schema\n );\n\n result.pointType = visConfig.isTextVisible ? 'circle+text' : 'circle';\n result.clusterLevel = visConfig.clusterLevel;\n\n result.getWeight = (d: any) => {\n return d.properties[aggregationExpAlias];\n };\n\n updateTriggers.getWeight = aggregationExpAlias;\n\n result.getPointRadius = (d: any, info: any) => {\n return calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n };\n updateTriggers.getPointRadius = {\n aggregationExpAlias,\n radiusRange: visConfig.radiusRange,\n };\n\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n\n result.getText = (d: any) =>\n TEXT_NUMBER_FORMATTER.format(d.properties[aggregationExpAlias]);\n\n updateTriggers.getText = aggregationExpAlias;\n\n result.getTextColor = config.textLabel[TEXT_LABEL_INDEX].color;\n result.textOutlineColor = [\n ...(config.textLabel[TEXT_LABEL_INDEX].outlineColor as number[]),\n TEXT_OUTLINE_OPACITY,\n ];\n result.textOutlineWidth = 5;\n result.textSizeUnits = 'pixels';\n\n result.getTextSize = (d: any, info: any) => {\n const radius = calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n return calculateClusterTextFontSize(radius);\n };\n\n updateTriggers.getTextSize = {\n aggregationExpAlias,\n radiusRange: visConfig.radiusRange,\n };\n }\n\n // point radius\n {\n const radiusRange = visConfig.radiusRange;\n const {radiusField, radiusScale} = visualChannels;\n if (radiusField && radiusRange && radiusScale) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n radiusField,\n radiusScale,\n visConfig.radiusAggregation,\n radiusRange,\n data\n );\n result.getPointRadius = accessor;\n scales.pointRadius = updateTriggers.getPointRadius = {\n field: radiusField,\n type: radiusScale,\n ...scaleProps,\n };\n }\n }\n\n // stroke/ouline color\n {\n const strokeColorRange = visConfig.strokeColorRange;\n const {strokeColorScale, strokeColorField} = visualChannels;\n if (strokeColorField && strokeColorRange && strokeColorScale) {\n const {strokeColorAggregation: aggregation} = visConfig;\n const opacity =\n visConfig.strokeOpacity !== undefined ? visConfig.strokeOpacity : 1;\n\n const {accessor, ...scaleProps} = getColorAccessor(\n strokeColorField,\n strokeColorScale,\n {aggregation, range: strokeColorRange},\n opacity,\n data\n );\n result.getLineColor = accessor;\n scales.lineColor = updateTriggers.getLineColor = {\n field: strokeColorField,\n type: strokeColorScale,\n ...scaleProps,\n };\n }\n }\n\n // stroke/line width\n {\n const {sizeField: strokeWidthField, sizeScale: strokeWidthScale} =\n visualChannels;\n const {sizeRange, sizeAggregation} = visConfig;\n\n if (strokeWidthField && sizeRange) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n strokeWidthField,\n strokeWidthScale,\n sizeAggregation,\n sizeRange,\n data\n );\n result.getLineWidth = accessor;\n scales.lineWidth = updateTriggers.getLineWidth = {\n field: strokeWidthField,\n type: strokeWidthScale || 'identity',\n ...scaleProps,\n };\n }\n }\n\n // height / elevation\n {\n const {enable3d, heightRange} = visConfig;\n const {heightField, heightScale} = visualChannels;\n if (heightField && heightRange && enable3d) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n heightField,\n heightScale,\n visConfig.heightAggregation,\n heightRange,\n data\n );\n result.getElevation = accessor;\n scales.elevation = updateTriggers.getElevation = {\n field: heightField,\n type: heightScale || 'identity',\n ...scaleProps,\n };\n }\n }\n\n // weight\n {\n const {weightField} = visualChannels;\n const {weightAggregation} = visConfig;\n if (weightField && weightAggregation) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n weightField,\n undefined,\n weightAggregation,\n undefined,\n data\n );\n result.getWeight = accessor;\n scales.weight = updateTriggers.getWeight = {\n field: weightField,\n type: 'identity' as ScaleType,\n ...scaleProps,\n };\n }\n }\n\n if (visConfig.customMarkers) {\n const maxIconSize = getMaxMarkerSize(visConfig, visualChannels);\n const {getPointRadius, getFillColor} = result;\n const {\n customMarkersUrl,\n customMarkersRange,\n filled: useMaskedIcons,\n } = visConfig;\n\n result.pointType = 'icon';\n result.getIcon = getIconUrlAccessor(\n visualChannels.customMarkersField,\n customMarkersRange,\n {fallbackUrl: customMarkersUrl, maxIconSize, useMaskedIcons},\n data\n );\n updateTriggers.getIcon = {\n customMarkersUrl,\n customMarkersRange,\n maxIconSize,\n useMaskedIcons,\n };\n result._subLayerProps = {\n 'points-icon': {\n loadOptions: {\n image: {\n type: 'imagebitmap',\n },\n imagebitmap: {\n resizeWidth: maxIconSize,\n resizeHeight: maxIconSize,\n resizeQuality: 'high',\n },\n },\n },\n };\n\n if (getFillColor && useMaskedIcons) {\n result.getIconColor = getFillColor;\n updateTriggers.getIconColor = updateTriggers.getFillColor;\n }\n\n if (getPointRadius) {\n result.getIconSize = getPointRadius;\n updateTriggers.getIconSize = updateTriggers.getPointRadius;\n }\n\n if (visualChannels.rotationField) {\n const {accessor} = getSizeAccessor(\n visualChannels.rotationField,\n undefined,\n null,\n undefined,\n data\n );\n result.getIconAngle = negateAccessor(accessor);\n updateTriggers.getIconAngle = updateTriggers.getRotationField;\n }\n } else if (layerType === 'tileset') {\n result.pointType = 'circle';\n }\n\n if (textLabel && textLabel.length && textLabel[0].field) {\n const [mainLabel, secondaryLabel] = textLabel;\n const collisionGroup = id;\n\n ({\n alignment: result.getTextAlignmentBaseline,\n anchor: result.getTextAnchor,\n color: result.getTextColor,\n outlineColor: result.textOutlineColor,\n size: result.textSizeScale,\n } = mainLabel);\n const {\n color: getSecondaryColor,\n field: secondaryField,\n outlineColor: secondaryOutlineColor,\n size: secondarySizeScale,\n } = secondaryLabel || {};\n\n result.getText = mainLabel.field && getTextAccessor(mainLabel.field, data);\n const getSecondaryText =\n secondaryField && getTextAccessor(secondaryField, data);\n\n result.pointType = `${result.pointType}+text`;\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n result.textOutlineWidth = 3;\n\n result._subLayerProps = {\n ...result._subLayerProps,\n 'points-text': {\n collisionEnabled: true,\n collisionGroup,\n\n // getPointRadius already has radiusScale baked in, so only pass one or the other\n ...(result.getPointRadius\n ? {getRadius: result.getPointRadius}\n : {radiusScale: visConfig.radius}),\n\n ...(secondaryField && {\n getSecondaryText,\n getSecondaryColor,\n secondarySizeScale,\n secondaryOutlineColor,\n }),\n },\n };\n }\n\n return {\n channelProps: {\n ...result,\n updateTriggers,\n },\n scales,\n };\n}\n\nfunction createLoadOptions(accessToken: string) {\n return {\n loadOptions: {fetch: {headers: {Authorization: `Bearer ${accessToken}`}}},\n };\n}\n","import {\n GOOGLE_BASEMAPS,\n CARTO_MAP_STYLES,\n applyLayerGroupFilters,\n fetchStyle,\n getStyleUrl,\n someLayerGroupsDisabled,\n} from './basemap-styles.js';\nimport type {Basemap, KeplerMapConfig, MapLibreBasemapProps} from './types.js';\nimport type {APIErrorContext} from '../api/index.js';\n\nconst CUSTOM_STYLE_ID_PREFIX = 'custom:';\nconst DEFAULT_CARTO_STYLE = 'positron';\n\n// Subset of type from @deck.gl/core to avoid adding dependency\ntype MapViewState = {\n /** Longitude of the map center */\n longitude: number;\n /** Latitude of the map center */\n latitude: number;\n /** Zoom level */\n zoom: number;\n /** Pitch (tilt) of the map, in degrees. `0` looks top down */\n pitch?: number;\n /** Bearing (rotation) of the map, in degrees. `0` is north up */\n bearing?: number;\n};\n\nfunction mapLibreViewpros(\n config: KeplerMapConfig\n): Omit<MapLibreBasemapProps, 'style'> {\n const {longitude, latitude, ...rest} = config.mapState as MapViewState;\n return {\n center: [longitude, latitude],\n ...rest,\n };\n}\n\n/**\n * Get basemap properties for Carto map.\n *\n * For maplibre-based basemaps it returns style or style URL that can be used with `maplibregl.Map` compatible component.\n * * style url is returned for non-filtered standard Carto basemaps or if user used style URL directly in configuration\n * * filtered style object returned for Carto basemaps with layer groups filtered\n *\n * For Google-maps base maps, it returns options that can be used with `google.maps.Map` constructor.\n */\nexport async function fetchBasemapProps({\n config,\n errorContext,\n\n applyLayerFilters = true,\n}: {\n config: KeplerMapConfig;\n\n /** By default `fetchBasemapProps` applies layers filters to style. Set this to `false` to disable it. */\n applyLayerFilters?: boolean;\n errorContext?: APIErrorContext;\n}): Promise<Basemap | null> {\n const {mapStyle} = config;\n const styleType = mapStyle.styleType || DEFAULT_CARTO_STYLE;\n if (styleType.startsWith(CUSTOM_STYLE_ID_PREFIX)) {\n const currentCustomStyle = config.customBaseMaps?.customStyle;\n if (currentCustomStyle) {\n return {\n type: 'maplibre',\n props: {\n style: currentCustomStyle.style || currentCustomStyle.url,\n ...mapLibreViewpros(config),\n },\n attribution: currentCustomStyle.customAttribution,\n };\n }\n }\n\n if (CARTO_MAP_STYLES.includes(styleType)) {\n const {visibleLayerGroups} = mapStyle;\n const styleUrl = getStyleUrl(styleType);\n let style = styleUrl;\n let rawStyle = styleUrl;\n if (\n applyLayerFilters &&\n visibleLayerGroups &&\n someLayerGroupsDisabled(visibleLayerGroups)\n ) {\n rawStyle = await fetchStyle({styleUrl, errorContext});\n style = applyLayerGroupFilters(rawStyle, visibleLayerGroups);\n }\n return {\n type: 'maplibre',\n props: {\n style,\n ...mapLibreViewpros(config),\n },\n visibleLayerGroups,\n rawStyle,\n };\n }\n const googleBasemapDef = GOOGLE_BASEMAPS[styleType];\n if (googleBasemapDef) {\n const {mapState} = config;\n return {\n type: 'google-maps',\n props: {\n ...googleBasemapDef,\n center: {lat: mapState.latitude, lng: mapState.longitude},\n zoom: mapState.zoom + 1,\n tilt: mapState.pitch,\n heading: mapState.bearing,\n },\n };\n }\n return {\n type: 'maplibre',\n props: {\n style: getStyleUrl(DEFAULT_CARTO_STYLE),\n ...mapLibreViewpros(config),\n },\n };\n}\n","import type {Dataset} from './types.js';\nimport {SpatialIndex, SpatialIndexColumn} from '../constants.js';\nimport type {\n QuerySourceOptions,\n TableSourceOptions,\n TilejsonResult,\n TileResolution,\n} from '../sources/types.js';\nimport {\n DEFAULT_AGGREGATION_EXP,\n DEFAULT_AGGREGATION_RES_LEVEL_H3,\n DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n DEFAULT_TILE_RESOLUTION,\n REDUCED_QUERIES_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n h3QuerySource,\n type H3QuerySourceOptions,\n h3TableSource,\n type H3TableSourceOptions,\n quadbinQuerySource,\n type QuadbinQuerySourceOptions,\n quadbinTableSource,\n type QuadbinTableSourceOptions,\n rasterSource,\n vectorQuerySource,\n type VectorQuerySourceOptions,\n vectorTableSource,\n type VectorTableSourceOptions,\n vectorTilesetSource,\n type VectorTilesetSourceOptions,\n} from '../sources/index.js';\nimport type {Filter} from '../types.js';\n\ntype FetchDatasetOptions = {\n accessToken: string;\n apiBaseUrl: string;\n connection: string;\n headers?: Record<string, string>;\n localCache?: {\n cacheControl: 'no-cache'[];\n };\n maxLengthURL?: number;\n};\n\ntype FetchDataset = {\n dataset: Dataset;\n filters?: Filter;\n options: FetchDatasetOptions;\n};\n\n// Copy of getCartoSource from cloud-native:\n// https://github.com/CartoDB/cloud-native/blob/main/workspace-www/src/features/common/utils/cartoDeckGL.ts#L79\nexport function configureSource({\n dataset,\n filters,\n options,\n}: FetchDataset): Promise<TilejsonResult> {\n const {\n geoColumn,\n columns,\n type,\n source,\n queryParameters,\n aggregationExp,\n aggregationResLevel: originalAggregationResLevel,\n } = dataset;\n const sourceOptions = getSourceOptions(options);\n const spatialDataColumn = getColumnNameFromGeoColumn(geoColumn) || undefined;\n const spatialIndex = geoColumn\n ? getSpatialIndexFromGeoColumn(geoColumn)\n : undefined;\n const tileResolution = getDynamicTileResolution(spatialIndex);\n const isH3 = spatialIndex === SpatialIndex.H3;\n const isQuadbin = spatialIndex === SpatialIndex.QUADBIN;\n let aggregationResLevel = originalAggregationResLevel;\n\n if (typeof originalAggregationResLevel !== 'number' && isH3) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3;\n } else if (typeof originalAggregationResLevel !== 'number' && isQuadbin) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN;\n }\n\n const spatialIndexOptions = {\n aggregationExp: !aggregationExp ? DEFAULT_AGGREGATION_EXP : aggregationExp,\n aggregationResLevel: scaleAggregationResLevel(\n aggregationResLevel,\n tileResolution\n ),\n spatialDataColumn,\n ...(filters && {filters}),\n } as H3QuerySourceOptions;\n const tilesetOptions = {\n ...sourceOptions,\n tableName: source,\n } as VectorTilesetSourceOptions;\n const tableOptions = {\n ...sourceOptions,\n tableName: source,\n tileResolution,\n } as TableSourceOptions;\n const queryOptions = {\n ...sourceOptions,\n sqlQuery: source,\n tileResolution,\n ...(queryParameters && {queryParameters}),\n } as QuerySourceOptions;\n const vectorOptions = {\n spatialDataColumn,\n ...(columns && {columns}),\n ...(filters && {filters}),\n ...(aggregationExp && {aggregationExp}),\n } as VectorTableSourceOptions;\n\n if (type === 'raster') {\n return rasterSource({\n ...sourceOptions,\n tableName: source,\n ...(filters && {filters: filters as any}),\n });\n }\n if (type === 'tileset') {\n return vectorTilesetSource({...tilesetOptions});\n }\n\n if (type === 'table') {\n if (isH3) {\n return h3TableSource({\n ...(tableOptions as H3TableSourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinTableSource({\n ...(tableOptions as QuadbinTableSourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorTableSource({\n ...(tableOptions as VectorTableSourceOptions),\n ...vectorOptions,\n });\n }\n }\n\n if (type === 'query') {\n if (isH3) {\n return h3QuerySource({\n ...(queryOptions as H3QuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinQuerySource({\n ...(queryOptions as QuadbinQuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorQuerySource({\n ...(queryOptions as VectorQuerySourceOptions),\n ...vectorOptions,\n });\n }\n }\n throw new Error(`Invalid source type: ${type}`);\n}\n\nfunction getSourceOptions({\n accessToken,\n apiBaseUrl,\n connection,\n headers,\n maxLengthURL,\n}: FetchDatasetOptions) {\n return {\n accessToken,\n connectionName: connection,\n apiBaseUrl,\n headers,\n maxLengthURL,\n ...(headers?.['Cache-Control']?.includes('no-cache') && {\n localCache: {\n cacheControl: ['no-cache'] as 'no-cache'[],\n },\n }),\n };\n}\n\n/**\n * Returns default tile resolution for dynamic tilesets, based on layer configuration\n * Result is not applicable for static tilesets, for which tile resolution is defined\n * by tilejson.\n */\nfunction getDynamicTileResolution(\n spatialIndex?: SpatialIndex | null\n): TileResolution {\n // TODO: Support increased tile size and resolution for dynamic H3 spatial indexes.\n if (spatialIndex !== SpatialIndex.H3) {\n return REDUCED_QUERIES_TILE_RESOLUTION;\n }\n\n return DEFAULT_TILE_RESOLUTION;\n}\n\n/**\n * @internal\n * State of `aggregationResLevel` in the UI and backend config is based on an assumption of\n * 512x512px tiles. Because we may change tile resolution for performance goals, the\n * `aggregationResLevel` passed to the deck.gl layer must be scaled with tile resolution.\n */\nexport function scaleAggregationResLevel(\n aggregationResLevel: number,\n tileResolution: number\n): number | undefined {\n if (typeof aggregationResLevel !== 'number') return;\n return aggregationResLevel - Math.log2(0.5 / tileResolution);\n}\n\n/**\n * @internal\n */\nexport function getColumnNameFromGeoColumn(\n geoColumn: string | null | undefined\n) {\n if (!geoColumn) {\n return geoColumn;\n }\n const parts = geoColumn.split(':');\n return parts.length === 1 ? parts[0] : parts.length === 2 ? parts[1] : null;\n}\n\n/**\n * @internal\n */\nexport function getSpatialIndexFromGeoColumn(geoColumn: string) {\n const spatialIndexToSearch = geoColumn.split(':')[0];\n\n for (const index of Object.values(SpatialIndex)) {\n if (SpatialIndexColumn[index].includes(spatialIndexToSearch)) {\n return index;\n }\n }\n return null;\n}\n","import {DEFAULT_API_BASE_URL} from '../constants.js';\n\nimport {\n type APIErrorContext,\n CartoAPIError,\n buildPublicMapUrl,\n buildStatsUrl,\n requestWithParameters,\n} from '../api/index.js';\n\nimport {type ParseMapResult, parseMap} from './parse-map.js';\nimport {assert} from '../utils.js';\nimport type {Basemap, Dataset, KeplerMapConfig} from './types.js';\nimport {fetchBasemapProps} from './basemap.js';\nimport {configureSource} from './source.js';\nimport type {Filters} from '../types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\n\n/* global clearInterval, setInterval, URL */\nasync function _fetchMapDataset(\n dataset: Dataset,\n filters: Filters,\n context: _FetchMapContext\n) {\n const {connectionName} = dataset;\n const cache: {value?: number} = {};\n const configuredSource = configureSource({\n dataset,\n filters: isRemoteCalculationSupported(dataset) ? filters : undefined,\n options: {\n ...context,\n connection: connectionName,\n headers: context.headers,\n accessToken: context.accessToken!,\n apiBaseUrl: context.apiBaseUrl,\n maxLengthURL: context.maxLengthURL,\n },\n });\n dataset.data = await configuredSource;\n\n let cacheChanged = true;\n if (cache.value) {\n cacheChanged = dataset.cache !== cache.value;\n dataset.cache = cache.value;\n }\n\n return cacheChanged;\n}\n\nasync function _fetchTilestats(\n attribute: string,\n dataset: Dataset,\n context: _FetchMapContext\n) {\n const {connectionName, data, id, source, type, queryParameters} = dataset;\n const {apiBaseUrl} = context;\n const errorContext: APIErrorContext = {\n requestType: 'Tile stats',\n connection: connectionName,\n type,\n source,\n };\n if (!('tilestats' in data)) {\n throw new CartoAPIError(\n new Error(`Invalid dataset for tilestats: ${id}`),\n errorContext\n );\n }\n\n const baseUrl = buildStatsUrl({attribute, apiBaseUrl, ...dataset});\n const client = new URLSearchParams(data.tiles[0]).get('client');\n const headers = {Authorization: `Bearer ${context.accessToken}`};\n const parameters: Record<string, string> = {};\n if (client) {\n parameters.client = client;\n }\n if (type === 'query') {\n parameters.q = source;\n if (queryParameters) {\n parameters.queryParameters = JSON.stringify(queryParameters);\n }\n }\n const stats = await requestWithParameters({\n baseUrl,\n headers,\n parameters,\n errorContext,\n maxLengthURL: context.maxLengthURL,\n });\n\n // Replace tilestats for attribute with value from API\n const {attributes} = data.tilestats.layers[0];\n const index = attributes.findIndex((d) => d.attribute === attribute);\n attributes[index] = stats;\n return true;\n}\n\nasync function fillInMapDatasets(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const {filters} = keplerMapConfig.config as KeplerMapConfig;\n const promises = datasets.map((dataset) =>\n _fetchMapDataset(dataset, filters[dataset.id], context)\n );\n return await Promise.all(promises);\n}\n\nasync function fillInTileStats(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const attributes: {attribute: string; dataset: any}[] = [];\n const {layers} = keplerMapConfig.config.visState;\n for (const layer of layers) {\n for (const channel of Object.keys(layer.visualChannels)) {\n const attribute = layer.visualChannels[channel]?.name;\n if (attribute) {\n const dataset = datasets.find((d) => d.id === layer.config.dataId);\n if (dataset && dataset.type !== 'tileset' && dataset.data.tilestats) {\n // Only fetch stats for QUERY & TABLE map types\n attributes.push({attribute, dataset});\n }\n }\n }\n }\n // Remove duplicates to avoid repeated requests\n const filteredAttributes: {attribute: string; dataset: any}[] = [];\n for (const a of attributes) {\n if (\n !filteredAttributes.find(\n ({attribute, dataset}) =>\n attribute === a.attribute && dataset === a.dataset\n )\n ) {\n filteredAttributes.push(a);\n }\n }\n\n const promises = filteredAttributes.map(({attribute, dataset}) =>\n _fetchTilestats(attribute, dataset, context)\n );\n return await Promise.all(promises);\n}\n\nexport type FetchMapOptions = {\n /**\n * CARTO platform access token. Only required for private maps.\n */\n accessToken?: string;\n\n /**\n * Base URL of the CARTO Maps API.\n *\n * Example for account located in EU-west region: `https://gcp-eu-west1.api.carto.com`\n *\n * @default https://gcp-us-east1.api.carto.com\n */\n apiBaseUrl?: string;\n\n /**\n * Identifier of map created in CARTO Builder.\n */\n cartoMapId: string;\n clientId?: string;\n\n /**\n * Custom HTTP headers added to map instantiation and data requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Interval in seconds at which to autoRefresh the data. If provided, `onNewData` must also be provided.\n */\n autoRefresh?: number;\n\n /**\n * Callback function that will be invoked whenever data in layers is changed. If provided, `autoRefresh` must also be provided.\n */\n onNewData?: (map: any) => void;\n\n /**\n * Maximum URL character length. Above this limit, requests use POST.\n * Used to avoid browser and CDN limits.\n * @default {@link DEFAULT_MAX_LENGTH_URL}\n */\n maxLengthURL?: number;\n};\n\n/**\n * Context reused while fetching and updating a map with fetchMap().\n */\ntype _FetchMapContext = {apiBaseUrl: string} & Pick<\n FetchMapOptions,\n 'accessToken' | 'clientId' | 'headers' | 'maxLengthURL'\n>;\n\nexport type FetchMapResult = ParseMapResult & {\n /**\n * Basemap properties.\n */\n basemap: Basemap | null;\n stopAutoRefresh?: () => void;\n};\n\nexport async function fetchMap({\n accessToken,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n cartoMapId,\n clientId,\n headers,\n autoRefresh,\n onNewData,\n maxLengthURL,\n}: FetchMapOptions): Promise<FetchMapResult> {\n assert(\n cartoMapId,\n 'Must define CARTO map id: fetchMap({cartoMapId: \"XXXX-XXXX-XXXX\"})'\n );\n\n if (accessToken) {\n headers = {Authorization: `Bearer ${accessToken}`, ...headers};\n }\n\n if (autoRefresh || onNewData) {\n assert(onNewData, 'Must define `onNewData` when using autoRefresh');\n assert(typeof onNewData === 'function', '`onNewData` must be a function');\n assert(\n typeof autoRefresh === 'number' && autoRefresh > 0,\n '`autoRefresh` must be a positive number'\n );\n }\n\n const baseUrl = buildPublicMapUrl({apiBaseUrl, cartoMapId});\n const errorContext: APIErrorContext = {\n requestType: 'Public map',\n mapId: cartoMapId,\n };\n const map = await requestWithParameters({\n baseUrl,\n headers,\n errorContext,\n maxLengthURL,\n });\n const context: _FetchMapContext = {\n accessToken: map.token || accessToken,\n apiBaseUrl,\n clientId,\n headers,\n maxLengthURL,\n };\n\n // Periodically check if the data has changed. Note that this\n // will not update when a map is published.\n let stopAutoRefresh: (() => void) | undefined;\n if (autoRefresh) {\n const intervalId = setInterval(async () => {\n const changed = await fillInMapDatasets(map, {\n ...context,\n headers: {\n ...headers,\n 'If-Modified-Since': new Date().toUTCString(),\n },\n });\n if (onNewData && changed.some((v) => v === true)) {\n onNewData(parseMap(map));\n }\n }, autoRefresh * 1000);\n stopAutoRefresh = () => {\n clearInterval(intervalId);\n };\n }\n\n const geojsonLayers = map.keplerMapConfig.config.visState.layers.filter(\n ({type}: {type: string}) => type === 'geojson' || type === 'point'\n );\n const geojsonDatasetIds = geojsonLayers.map(\n ({config}: {config: any}) => config.dataId\n );\n map.datasets.forEach((dataset: any) => {\n if (geojsonDatasetIds.includes(dataset.id)) {\n const {config} = geojsonLayers.find(\n ({config}: {config: any}) => config.dataId === dataset.id\n );\n dataset.format = 'geojson';\n // Support for very old maps. geoColumn was not stored in the past\n if (!dataset.geoColumn && config.columns.geojson) {\n dataset.geoColumn = config.columns.geojson;\n }\n }\n });\n\n const [basemap] = await Promise.all([\n fetchBasemapProps({config: map.keplerMapConfig.config, errorContext}),\n\n // Mutates map.datasets so that dataset.data contains data\n fillInMapDatasets(map, context),\n ]);\n\n // Mutates attributes in visualChannels to contain tile stats\n await fillInTileStats(map, context);\n\n const out = {...parseMap(map), basemap, ...{stopAutoRefresh}};\n\n const textLayers = out.layers.filter((layer: any) => {\n const pointType = layer.props?.pointType || '';\n return pointType.includes('text');\n });\n\n /* global FontFace, window, document */\n if (\n textLayers.length &&\n window.FontFace &&\n !document.fonts.check('12px Inter')\n ) {\n // Fetch font needed for labels\n const font = new FontFace(\n 'Inter',\n 'url(https://fonts.gstatic.com/s/inter/v12/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2)'\n );\n await font.load().then((f) => document.fonts.add(f));\n }\n\n return out as FetchMapResult;\n}\n","import * as polyclip from \"polyclip-ts\";\nimport { multiPolygon, polygon } from \"@turf/helpers\";\nimport { geomEach } from \"@turf/meta\";\nimport {\n FeatureCollection,\n Feature,\n Polygon,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n * Takes a collection of input polygons and returns a combined polygon. If the\n * input polygons are not contiguous, this function returns a multi-polygon\n * feature.\n *\n * @function\n * @param {FeatureCollection<Polygon|MultiPolygon>} features input polygon features\n * @param {Object} [options={}] Optional Parameters\n * @param {GeoJsonProperties} [options.properties={}] properties to assign to output feature\n * @returns {Feature<(Polygon|MultiPolygon)>|null} a combined polygon or multi-polygon feature, or null if there were no input polygons to combine\n * @example\n *\n * const poly1 = turf.polygon(\n * [\n * [\n * [-82.574787, 35.594087],\n * [-82.574787, 35.615581],\n * [-82.545261, 35.615581],\n * [-82.545261, 35.594087],\n * [-82.574787, 35.594087],\n * ],\n * ],\n * { fill: \"#0f0\" }\n * );\n *\n * const poly2 = turf.polygon(\n * [\n * [\n * [-82.560024, 35.585153],\n * [-82.560024, 35.602602],\n * [-82.52964, 35.602602],\n * [-82.52964, 35.585153],\n * [-82.560024, 35.585153],\n * ],\n * ],\n * );\n *\n * const union = turf.union(turf.featureCollection([poly1, poly2]));\n *\n * //addToMap\n * const addToMap = { poly1, poly2, union };\n *\n * poly1.properties.fill = \"#0f0\";\n * poly2.properties.fill = \"#00f\";\n * union.properties.stroke = \"red\";\n * union.properties[\"stroke-width\"] = 4;\n * union.properties.fill = \"transparent\";\n */\nfunction union<P extends GeoJsonProperties = GeoJsonProperties>(\n features: FeatureCollection<Polygon | MultiPolygon>,\n options: { properties?: P } = {}\n): Feature<Polygon | MultiPolygon, P> | null {\n const geoms: polyclip.Geom[] = [];\n geomEach(features, (geom) => {\n geoms.push(geom.coordinates as polyclip.Geom);\n });\n\n if (geoms.length < 2) {\n throw new Error(\"Must have at least 2 geometries\");\n }\n\n const unioned = polyclip.union(geoms[0], ...geoms.slice(1));\n if (unioned.length === 0) return null;\n if (unioned.length === 1) return polygon(unioned[0], options.properties);\n else return multiPolygon(unioned, options.properties);\n}\n\nexport { union };\nexport default union;\n","import bboxClip from '@turf/bbox-clip';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport union from '@turf/union';\nimport {getType} from '@turf/invariant';\nimport {polygon, multiPolygon, feature, featureCollection} from '@turf/helpers';\nimport type {BBox, Geometry, MultiPolygon, Polygon, Position} from 'geojson';\nimport type {SpatialFilter} from './types.js';\n\n/**\n * Returns a {@link SpatialFilter} for a given viewport, typically obtained\n * from deck.gl's `viewport.getBounds()` method ([west, south, east, north]).\n * If the viewport covers the entire world (to some margin of error in Web\n * Mercator space), `undefined` is returned instead.\n *\n * If the viewport extends beyond longitude range [-180, +180], the polygon\n * may be reformatted for compatibility with CARTO APIs.\n */\nexport function createViewportSpatialFilter(\n viewport: BBox\n): SpatialFilter | undefined {\n if (_isGlobalViewport(viewport)) {\n return;\n }\n return createPolygonSpatialFilter(bboxPolygon(viewport).geometry);\n}\n\n/**\n * Returns a {@link SpatialFilter} for a given {@link Polygon} or\n * {@link MultiPolygon}. If the polygon(s) extend outside longitude\n * range [-180, +180], the result may be reformatted for compatibility\n * with CARTO APIs.\n */\nexport function createPolygonSpatialFilter(\n spatialFilter: Polygon | MultiPolygon\n): SpatialFilter | undefined {\n return (spatialFilter && _normalizeGeometry(spatialFilter)) || undefined;\n}\n\n/**\n * Check if a viewport is large enough to represent a global coverage.\n * In this case the spatial filter parameter for widget calculation is removed.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _isGlobalViewport(viewport: BBox) {\n const [minx, miny, maxx, maxy] = viewport;\n return maxx - minx > 179.5 * 2 && maxy - miny > 85.05 * 2;\n}\n\n/**\n * Normalized a geometry, coming from a mask or a viewport. The parts\n * spanning outside longitude range [-180, +180] are clipped and \"folded\"\n * back to the valid range and unioned to the polygons inide that range.\n *\n * It results in a Polygon or MultiPolygon strictly inside the validity range.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _normalizeGeometry(\n geometry: Polygon | MultiPolygon\n): Polygon | MultiPolygon | null {\n const WORLD = [-180, -90, +180, +90] as BBox;\n const worldClip = _clean(\n bboxClip(geometry, WORLD).geometry as Polygon | MultiPolygon\n );\n\n const geometryTxWest = _tx(geometry, 360);\n const geometryTxEast = _tx(geometry, -360);\n\n let result: Polygon | MultiPolygon | null = worldClip;\n\n if (result && geometryTxWest) {\n const worldWestClip = _clean(\n bboxClip(geometryTxWest, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldWestClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldWestClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n if (result && geometryTxEast) {\n const worldEastClip = _clean(\n bboxClip(geometryTxEast, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldEastClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldEastClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n return result;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanPolygonCoords(cc: Position[][]) {\n const coords = cc.filter((c) => c.length > 0);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanMultiPolygonCoords(ccc: Position[][][]) {\n const coords = ccc.map(_cleanPolygonCoords).filter((cc) => cc);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _clean(\n geometry: Polygon | MultiPolygon | null\n): Polygon | MultiPolygon | null {\n if (!geometry) {\n return null;\n }\n\n if (_isPolygon(geometry)) {\n const coords = _cleanPolygonCoords(geometry.coordinates);\n return coords ? polygon(coords).geometry : null;\n }\n\n if (_isMultiPolygon(geometry)) {\n const coords = _cleanMultiPolygonCoords(geometry.coordinates);\n return coords ? multiPolygon(coords as Position[][][]).geometry : null;\n }\n\n return null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txContourCoords(cc: Position[], distance: number) {\n return cc.map((c) => [c[0] + distance, c[1]]);\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txPolygonCoords(ccc: Position[][], distance: number) {\n return ccc.map((cc) => _txContourCoords(cc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txMultiPolygonCoords(cccc: Position[][][], distance: number) {\n return cccc.map((ccc) => _txPolygonCoords(ccc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _tx(geometry: Polygon | MultiPolygon, distance: number) {\n if (geometry && getType(geometry) === 'Polygon') {\n const coords = _txPolygonCoords(\n (geometry as Polygon).coordinates,\n distance\n );\n return polygon(coords).geometry;\n } else if (geometry && getType(geometry) === 'MultiPolygon') {\n const coords = _txMultiPolygonCoords(\n (geometry as MultiPolygon).coordinates,\n distance\n );\n return multiPolygon(coords).geometry;\n } else {\n return null;\n }\n}\n\nfunction _isPolygon(geometry: Geometry): geometry is Polygon {\n return getType(geometry) === 'Polygon';\n}\n\nfunction _isMultiPolygon(geometry: Geometry): geometry is MultiPolygon {\n return getType(geometry) === 'MultiPolygon';\n}\n","// Default tile display size in deck.gl, in viewport pixels. May differ\n// from size or resolution assumed when generating the tile data,\nconst DEFAULT_TILE_SIZE = 512;\n\n// Relative scale factor (0 = no biasing, 2 = a few hexagons cover view)\nconst BIAS = 2;\n\n/**\n * Resolution conversion function. Takes a WebMercatorViewport and returns\n * a H3 resolution such that the screen space size of the hexagons is\n * \"similar\" to the given tileSize on screen. Intended for use with deck.gl.\n * @internal\n * @privateRemarks Source: https://github.com/visgl/deck.gl/blob/master/modules/carto/src/layers/h3-tileset-2d.ts\n */\nexport function _getHexagonResolution(\n viewport: {zoom: number; latitude: number},\n tileSize: number\n): number {\n // Difference in given tile size compared to deck's internal 512px tile size,\n // expressed as an offset to the viewport zoom.\n const zoomOffset = Math.log2(tileSize / DEFAULT_TILE_SIZE);\n const hexagonScaleFactor = (2 / 3) * (viewport.zoom - zoomOffset);\n const latitudeScaleFactor = Math.log(\n 1 / Math.cos((Math.PI * viewport.latitude) / 180)\n );\n\n // Clip and bias\n return Math.max(\n 0,\n Math.floor(hexagonScaleFactor + latitudeScaleFactor - BIAS)\n );\n}\n","/** Flags 'empty' values in a Uint32Array index. */\nconst EMPTY_U32 = 2 ** 32 - 1;\n\n/**\n * Custom Set-like interface optimized for BigUint64 cell IDs. Unlike Set,\n * limited in most JavaScript runtimes to ~16M entries, this implementation\n * can support up to `n = 2^32 - 1` (4 billion) entries, with lookups in\n * amortized O(1) time.\n */\nexport class CellSet {\n /** List of cells stored by the set. Stored by reference, without copying. */\n private cells: bigint[];\n\n /** DataView representing a single cell ID. Pre-allocated to reduce memory during queries. */\n private cellView = new DataView(new ArrayBuffer(8));\n\n /** Hash table, mapping a hash index (computed) to an index in the 'cells' array. */\n private hashTable: Uint32Array;\n\n constructor(cells: bigint[]) {\n this.cells = cells;\n\n // Pre-allocate hash table for queries.\n this.hashTable = new Uint32Array(hashBuckets(cells.length)).fill(EMPTY_U32);\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n this.hashTable[this.hashLookup(cells[cellIndex])] = cellIndex;\n }\n }\n\n has(cell: bigint): boolean {\n const hashIndex = this.hashLookup(cell);\n return this.hashTable[hashIndex] !== EMPTY_U32;\n }\n\n private hashLookup(cell: bigint): number {\n // Hash implementation operates on 32-bit chunks, so write the cell ID\n // into a pre-allocated DataView for easier iteration.\n this.cellView.setBigUint64(0, cell);\n const hashval = hash(this.cellView);\n const hashmod = this.hashTable.length - 1;\n let bucket = hashval & hashmod;\n\n // Find the first bucket in the hash table where either (a) no cell\n // is yet stored, or (b) the stored cell and the query cell are equal.\n for (let probe = 0; probe <= hashmod; probe++) {\n const cellIndex = this.hashTable[bucket];\n\n if (cellIndex === EMPTY_U32 || cell === this.cells[cellIndex]) {\n return bucket;\n }\n\n bucket = (bucket + probe + 1) & hashmod; // Hash collision; quadratic probing.\n }\n\n throw new Error('Hash table full.'); // Unreachable.\n }\n}\n\n/**\n * MurmurHash2\n *\n * References:\n * - https://github.com/mikolalysenko/murmurhash-js/blob/f19136e9f9c17f8cddc216ca3d44ec7c5c502f60/murmurhash2_gc.js#L14\n * - https://github.com/zeux/meshoptimizer/blob/e47e1be6d3d9513153188216455bdbed40a206ef/src/indexgenerator.cpp#L12\n */\nfunction hash(view: DataView, h = 0): number {\n const m = 0x5bd1e995;\n const r = 24;\n\n for (let i = 0, il = view.byteLength / 4; i < il; i++) {\n let k = view.getUint32(i * 4);\n\n k = Math.imul(k, m) >>> 0;\n k = (k ^ (k >> r)) >>> 0;\n k = Math.imul(k, m) >>> 0;\n\n h = Math.imul(h, m) >>> 0;\n h = (h ^ k) >>> 0;\n }\n\n return h;\n}\n\nfunction hashBuckets(initialCount: number) {\n let buckets = 1;\n while (buckets < initialCount + initialCount / 4) {\n buckets *= 2;\n }\n return buckets;\n}\n"],"mappings":"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","names":["identity","v","FilterType","ApiVersion","TileFormat","SpatialIndex","Provider","stringRegExp","feature","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","polygon","u2","point","polygon","bbox","compare","featureId","ringId","eventId","intersection","sweeplineIntersections","intersection","featureId","bbox","lineString","polygon","feature","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","bbox","multiLineString","lineString","polygon","multiPolygon","bbox","isPointOnLineSegment","epsilon","isLineOnLine","isLineInPoly","isPolyInPoly","point","compareCoords","lineString","polygon","clone","BigNumber","v","sum","compare","format","min","max","compare","compare","v","u","set","node","v","eps","bbox","point","Segment","pt","nextPt","SplayTreeSet","evt","BigNumber","intersection","intersection","TRANSFORM_FN","transformPoint","transformMultiPoint","transformLineString","transformMultiLineString","transformPolygon","transformMultiPolygon","bbox","getPoints","multiLineString","lineString","polygon","multiPolygon","bbox","intersect","feature","intersection","bbox","featureId","intersection","getResolution","getResolution","intersection","SchemaFieldType","assert","isObject","field","assert","v","feature","assert","FILTER_TYPES","operation","assert","sum","feature","operation","v","min","max","operation","group","operation","operation","feature","feature","_GeojsonEquality","_a","_b","isObject","equals","isPointOnLineSegment","point","precision","operation","assert","bbox","RasterBandColorinterp","ErrorCode","length","node","min","max","key","values","keyof","group","f","compare","key","min","max","scale","u","min","max","identity","v","config","min","data","scale","rgb","color","max","min","max","UNKNOWN_COLOR","v","length","hexToRGB","config","defaultProps","assert","color","config","client","assert","v","config","union","cc"]}
1
+ {"version":3,"sources":["../node_modules/thenby/thenBy.module.js","../src/client.ts","../src/constants.ts","../src/utils/makeIntervalComplete.ts","../src/filters/FilterTypes.ts","../src/filters/Filter.ts","../node_modules/robust-predicates/esm/util.js","../node_modules/robust-predicates/esm/orient2d.js","../node_modules/robust-predicates/esm/orient3d.js","../node_modules/robust-predicates/esm/incircle.js","../node_modules/robust-predicates/esm/insphere.js","../node_modules/point-in-polygon-hao/dist/esm/index.js","../node_modules/@turf/helpers/index.ts","../node_modules/@turf/invariant/index.ts","../node_modules/@turf/boolean-point-in-polygon/index.ts","../node_modules/sweepline-intersections/dist/sweeplineIntersections.esm.js","../node_modules/@turf/line-intersect/index.ts","../node_modules/@turf/line-intersect/lib/sweepline-intersections-export.ts","../node_modules/@turf/meta/index.js","../node_modules/@turf/polygon-to-line/index.ts","../node_modules/@turf/boolean-disjoint/index.ts","../node_modules/@turf/boolean-intersects/index.ts","../src/filters/geosjonFeatures.ts","../node_modules/@math.gl/core/src/lib/common.ts","../node_modules/@math.gl/web-mercator/src/assert.ts","../node_modules/@math.gl/web-mercator/src/web-mercator-utils.ts","../node_modules/@math.gl/web-mercator/src/get-bounds.ts","../src/utils/transformTileCoordsToWGS84.ts","../node_modules/@turf/bbox-polygon/index.ts","../node_modules/@turf/bbox/index.ts","../node_modules/@turf/boolean-point-on-line/index.ts","../node_modules/@turf/boolean-within/index.ts","../node_modules/bignumber.js/bignumber.mjs","../node_modules/splaytree-ts/src/index.ts","../node_modules/polyclip-ts/src/geom-in.ts","../node_modules/polyclip-ts/src/constant.ts","../node_modules/polyclip-ts/src/compare.ts","../node_modules/polyclip-ts/src/orient.ts","../node_modules/polyclip-ts/src/snap.ts","../node_modules/polyclip-ts/src/identity.ts","../node_modules/polyclip-ts/src/precision.ts","../node_modules/polyclip-ts/src/bbox.ts","../node_modules/polyclip-ts/src/operation.ts","../node_modules/polyclip-ts/src/vector.ts","../node_modules/polyclip-ts/src/sweep-event.ts","../node_modules/polyclip-ts/src/geom-out.ts","../node_modules/polyclip-ts/src/sweep-line.ts","../node_modules/polyclip-ts/src/segment.ts","../node_modules/polyclip-ts/src/index.ts","../node_modules/@turf/intersect/index.ts","../src/utils/transformToTileCoords.ts","../src/filters/tileIntersection.ts","../node_modules/@turf/bbox-clip/index.ts","../node_modules/@turf/bbox-clip/lib/lineclip.ts","../src/filters/tileFeaturesGeometries.ts","../src/filters/tileFeaturesSpatialIndex.ts","../src/constants-internal.ts","../src/filters/tileFeaturesRaster.ts","../src/types.ts","../src/utils.ts","../src/filters/tileFeatures.ts","../src/deck/get-data-filter-extension-props.ts","../src/api/carto-api-error.ts","../src/api/endpoints.ts","../src/api/request-with-parameters.ts","../src/sources/base-source.ts","../src/sources/boundary-query-source.ts","../src/sources/boundary-table-source.ts","../src/widget-sources/widget-source.ts","../src/models/common.ts","../src/models/model.ts","../src/filters.ts","../src/widget-sources/constants.ts","../src/widget-sources/widget-remote-source.ts","../src/widget-sources/widget-query-source.ts","../src/operations/aggregation.ts","../src/operations/applySorting.ts","../src/operations/groupBy.ts","../src/utils/dateUtils.ts","../src/operations/groupByDate.ts","../src/operations/histogram.ts","../src/operations/scatterPlot.ts","../node_modules/geojson-equality-ts/index.ts","../node_modules/@turf/clean-coords/index.ts","../node_modules/@turf/boolean-equal/index.ts","../src/widget-sources/widget-tileset-source-impl.ts","../src/widget-sources/widget-tileset-source.ts","../src/widget-sources/widget-raster-source.ts","../src/widget-sources/widget-table-source.ts","../src/sources/h3-query-source.ts","../src/sources/h3-table-source.ts","../src/utils/getTileFormat.ts","../src/sources/h3-tileset-source.ts","../src/sources/quadbin-query-source.ts","../src/sources/quadbin-table-source.ts","../src/sources/quadbin-tileset-source.ts","../src/sources/raster-source.ts","../src/sources/trajectory-query-source.ts","../src/sources/trajectory-table-source.ts","../src/sources/vector-query-source.ts","../src/sources/vector-table-source.ts","../src/sources/vector-tileset-source.ts","../src/sources/constants.ts","../src/sources/index.ts","../src/api/query.ts","../src/fetch-map/basemap-styles.ts","../src/fetch-map/vec-expr-evaluator.ts","../node_modules/d3-array/src/ascending.js","../node_modules/d3-array/src/extent.js","../node_modules/internmap/src/index.js","../node_modules/d3-array/src/identity.js","../node_modules/d3-array/src/group.js","../node_modules/d3-array/src/permute.js","../node_modules/d3-array/src/sort.js","../node_modules/d3-array/src/groupSort.js","../node_modules/d3-color/src/define.js","../node_modules/d3-color/src/color.js","../src/fetch-map/layer-map.ts","../src/fetch-map/utils.ts","../src/fetch-map/raster-layer.ts","../src/fetch-map/parse-map.ts","../src/fetch-map/basemap.ts","../src/fetch-map/source.ts","../src/fetch-map/fetch-map.ts","../node_modules/@turf/union/index.ts","../src/geo.ts","../src/spatial-index.ts","../src/utils/CellSet.ts"],"sourcesContent":["/***\n Copyright 2013 Teun Duynstee\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nmodule.exports = (function() {\n\n function identity(v){return v;}\n\n function ignoreCase(v){return typeof(v)===\"string\" ? v.toLowerCase() : v;}\n\n function makeCompareFunction(f, opt){\n opt = typeof(opt)===\"object\" ? opt : {direction:opt};\n \n if(typeof(f)!=\"function\"){\n var prop = f;\n // make unary function\n f = function(v1){return !!v1[prop] ? v1[prop] : \"\";}\n }\n if(f.length === 1) {\n // f is a unary function mapping a single item to its sort score\n var uf = f;\n var preprocess = opt.ignoreCase?ignoreCase:identity;\n var cmp = opt.cmp || function(v1,v2) {return v1 < v2 ? -1 : v1 > v2 ? 1 : 0;}\n f = function(v1,v2) {return cmp(preprocess(uf(v1)), preprocess(uf(v2)));}\n }\n const descTokens = {\"-1\":'', desc:''};\n if(opt.direction in descTokens) return function(v1,v2){return -f(v1,v2)};\n return f;\n }\n\n /* adds a secondary compare function to the target function (`this` context)\n which is applied in case the first one returns 0 (equal)\n returns a new compare function, which has a `thenBy` method as well */\n function tb(func, opt) {\n /* should get value false for the first call. This can be done by calling the \n exported function, or the firstBy property on it (for es6 module compatibility)\n */\n var x = (typeof(this) == \"function\" && !this.firstBy) ? this : false;\n var y = makeCompareFunction(func, opt);\n var f = x ? function(a, b) {\n return x(a,b) || y(a,b);\n }\n : y;\n f.thenBy = tb;\n return f;\n }\n tb.firstBy = tb;\n return tb;\n})();\n","/**\n * @internal\n * @privateRemarks Source: @carto/react-core, @carto/constants, @deck.gl/carto\n */\nlet client = 'deck-gl-carto';\n\n/**\n * Returns current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function getClient() {\n return client;\n}\n\n/**\n * Sets current client ID, used to categorize API requests. For internal use only.\n *\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function setClient(c: string) {\n client = c;\n}\n","/**\n * Defines a comparator used when matching a column's values against given filter values.\n *\n * Example:\n *\n * ```javascript\n * import { FilterType } from '@carto/api-client';\n * const filters = {\n * column_name: { [FilterType.IN]: { values: ['a', 'b', 'c'] } }\n * };\n * ```\n *\n * @privateRemarks Source: @carto/react-api, @deck.gl/carto\n */\nexport enum FilterType {\n IN = 'in',\n /** [a, b] both are included. */\n BETWEEN = 'between',\n /** [a, b) a is included, b is not. */\n CLOSED_OPEN = 'closed_open',\n TIME = 'time',\n STRING_SEARCH = 'stringSearch',\n}\n\n/** @privateRemarks Source: @carto/constants */\nexport enum ApiVersion {\n V1 = 'v1',\n V2 = 'v2',\n V3 = 'v3',\n}\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_API_BASE_URL = 'https://gcp-us-east1.api.carto.com';\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum TileFormat {\n MVT = 'mvt',\n JSON = 'json',\n GEOJSON = 'geojson',\n BINARY = 'binary',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum SpatialIndex {\n H3 = 'h3',\n QUADBIN = 'quadbin',\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport enum Provider {\n BIGQUERY = 'bigquery',\n REDSHIFT = 'redshift',\n POSTGRES = 'postgres',\n SNOWFLAKE = 'snowflake',\n DATABRICKS = 'databricks',\n DATABRICKS_REST = 'databricksRest',\n}\n\nexport const SpatialIndexColumn = Object.freeze({\n [SpatialIndex.H3]: ['h3', 'hex', 'h3id', 'hex_id', 'h3hex'],\n [SpatialIndex.QUADBIN]: ['quadbin'],\n});\n\n/**\n * Enum like container for all types of aggregations available for widgets.\n */\nexport const AggregationTypes = {\n Count: 'count' as const,\n Avg: 'avg' as const,\n Min: 'min' as const,\n Max: 'max' as const,\n Sum: 'sum' as const,\n Custom: 'custom' as const,\n} as const;\n","import type {FilterInterval, FilterIntervalComplete} from '../types.js';\n\nexport function makeIntervalComplete(\n intervals: FilterInterval[]\n): FilterIntervalComplete[] {\n return intervals.map((val) => {\n if (val[0] === undefined || val[0] === null) {\n return [Number.MIN_SAFE_INTEGER, val[1]];\n }\n\n if (val[1] === undefined || val[1] === null) {\n return [val[0], Number.MAX_SAFE_INTEGER];\n }\n\n return val;\n }) as FilterIntervalComplete[];\n}\n","import {FilterType} from '../constants.js';\nimport type {FilterInterval, StringSearchOptions} from '../types.js';\nimport {makeIntervalComplete} from '../utils/makeIntervalComplete.js';\n\nexport type FilterFunction = (\n filterValues: unknown[],\n featureValue: unknown,\n params?: Record<string, unknown>\n) => boolean;\n\nexport const filterFunctions: Record<FilterType, FilterFunction> = {\n [FilterType.IN]: filterIn,\n [FilterType.BETWEEN]: filterBetween,\n [FilterType.TIME]: filterTime,\n [FilterType.CLOSED_OPEN]: filterClosedOpen,\n [FilterType.STRING_SEARCH]: filterStringSearch,\n};\n\nfunction filterIn(filterValues: unknown[], featureValue: unknown): boolean {\n return filterValues.includes(featureValue);\n}\n\n// FilterTypes.BETWEEN\nfunction filterBetween(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) <= upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as FilterInterval[]).some(\n checkRange\n );\n}\n\nfunction filterTime(filterValues: unknown[], featureValue: unknown) {\n const featureValueAsTimestamp = new Date(featureValue as number).getTime();\n if (isFinite(featureValueAsTimestamp)) {\n return filterBetween(filterValues, featureValueAsTimestamp);\n } else {\n throw new Error(`Column used to filter by time isn't well formatted.`);\n }\n}\n\n// FilterTypes.CLOSED_OPEN\nfunction filterClosedOpen(\n filterValues: unknown[],\n featureValue: unknown\n): boolean {\n const checkRange = (range: [number, number]) => {\n const [lowerBound, upperBound] = range;\n return (\n (featureValue as number) >= lowerBound &&\n (featureValue as number) < upperBound\n );\n };\n\n return makeIntervalComplete(filterValues as [number, number][]).some(\n checkRange\n );\n}\n\n// FilterTypes.STRING_SEARCH\nfunction filterStringSearch(\n filterValues: unknown[],\n featureValue: unknown,\n params: StringSearchOptions = {}\n): boolean {\n const normalizedFeatureValue = normalize(featureValue, params);\n const stringRegExp = params.useRegExp\n ? filterValues\n : filterValues.map((filterValue) => {\n let stringRegExp = escapeRegExp(normalize(filterValue, params));\n\n if (params.mustStart) stringRegExp = `^${stringRegExp}`;\n if (params.mustEnd) stringRegExp = `${stringRegExp}$`;\n\n return stringRegExp;\n });\n\n const regex = new RegExp(\n stringRegExp.join('|'),\n params.caseSensitive ? 'g' : 'gi'\n );\n return !!normalizedFeatureValue.match(regex);\n}\n\n// Aux\nconst specialCharRegExp = /[.*+?^${}()|[\\]\\\\]/g;\nconst normalizeRegExp = /\\p{Diacritic}/gu;\n\nfunction escapeRegExp(value: string) {\n return value.replace(specialCharRegExp, '\\\\$&');\n}\n\nfunction normalize(data: unknown, params: StringSearchOptions) {\n let normalizedData = String(data);\n if (!params.keepSpecialCharacters)\n normalizedData = normalizedData\n .normalize('NFD')\n .replace(normalizeRegExp, '');\n\n return normalizedData;\n}\n","import {filterFunctions} from './FilterTypes.js';\nimport type {Filter, FilterLogicalOperator, Filters} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {FilterType} from '../constants.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {BinaryFeature} from '@loaders.gl/schema';\n\nconst LOGICAL_OPERATOR_METHODS: Record<\n FilterLogicalOperator,\n 'every' | 'some'\n> = {\n and: 'every',\n or: 'some',\n};\n\nfunction passesFilter(\n columns: string[],\n filters: Filters,\n feature: FeatureData,\n filtersLogicalOperator: FilterLogicalOperator\n): boolean {\n const method = LOGICAL_OPERATOR_METHODS[filtersLogicalOperator];\n return columns[method]((column) => {\n const columnFilters = filters[column];\n const columnFilterTypes = Object.keys(columnFilters) as FilterType[];\n\n if (!feature || feature[column] === null || feature[column] === undefined) {\n return false;\n }\n\n return columnFilterTypes.every((filter) => {\n const filterFunction = filterFunctions[filter];\n\n if (!filterFunction) {\n throw new Error(`\"${filter}\" filter is not implemented.`);\n }\n\n return filterFunction(\n columnFilters[filter]!.values,\n feature[column],\n (columnFilters[filter] as Filter[FilterType.STRING_SEARCH])!.params\n );\n });\n });\n}\n\n/**\n * @internal\n * @privateRemarks Exported for use in @deck.gl/carto's getDataFilterExtensionProps.\n */\nexport function _buildFeatureFilter({\n filters = {},\n type = 'boolean',\n filtersLogicalOperator = 'and',\n}: {\n filters?: Filters;\n type?: 'number' | 'boolean';\n filtersLogicalOperator?: FilterLogicalOperator;\n}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => (type === 'number' ? 1 : true);\n }\n\n return (feature: Feature | FeatureData) => {\n const f = feature.properties || feature;\n const featurePassesFilter = passesFilter(\n columns,\n filters,\n f as FeatureData,\n filtersLogicalOperator\n );\n\n return type === 'number'\n ? Number(featurePassesFilter)\n : featurePassesFilter;\n };\n}\n\n/**\n * Apply certain filters to a collection of features.\n * @internal\n */\nexport function applyFilters(\n features: FeatureData[],\n filters: Filters,\n filtersLogicalOperator: FilterLogicalOperator\n) {\n return Object.keys(filters).length\n ? features.filter(_buildFeatureFilter({filters, filtersLogicalOperator}))\n : features;\n}\n\n/**\n * Binary.\n * @internal\n */\nexport function buildBinaryFeatureFilter({filters = {}}: {filters: Filters}) {\n const columns = Object.keys(filters);\n\n if (!columns.length) {\n return () => 1;\n }\n\n return (featureIdIdx: number, binaryData: BinaryFeature) =>\n passesFilterUsingBinary(columns, filters, featureIdIdx, binaryData);\n}\n\nfunction getValueFromNumericProps(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n return binaryData.numericProps?.[column]?.value[featureIdIdx];\n}\n\nfunction getValueFromProperties(\n featureIdIdx: number,\n binaryData: BinaryFeature,\n {column}: {column: string}\n) {\n const propertyIdx = binaryData.featureIds.value[featureIdIdx];\n return (binaryData.properties[propertyIdx] as Record<string, unknown>)?.[\n column\n ];\n}\n\nconst GET_VALUE_BY_BINARY_PROP = {\n properties: getValueFromProperties,\n numericProps: getValueFromNumericProps,\n};\n\nfunction getBinaryPropertyByFilterValues(filterValues: unknown[]) {\n return typeof filterValues.flat()[0] === 'string'\n ? 'properties'\n : 'numericProps';\n}\n\nfunction getFeatureValue(\n featureIdIdx: number,\n binaryData: any,\n filter: {type: FilterType; column: string; values: unknown[]}\n) {\n const {column, values} = filter;\n const binaryProp = getBinaryPropertyByFilterValues(values);\n const getFeatureValueFn = GET_VALUE_BY_BINARY_PROP[binaryProp];\n return getFeatureValueFn(featureIdIdx, binaryData, {column});\n}\n\nfunction passesFilterUsingBinary(\n columns: string[],\n filters: Filters,\n featureIdIdx: number,\n binaryData: BinaryFeature\n) {\n return columns.every((column) => {\n const columnFilters = filters[column];\n\n return Object.entries(columnFilters).every(([type, {values}]) => {\n const filterFn = filterFunctions[type as FilterType];\n if (!filterFn) {\n throw new Error(`\"${type}\" filter is not implemented.`);\n }\n\n if (!values) return 0;\n\n const featureValue = getFeatureValue(featureIdIdx, binaryData, {\n type: type as FilterType,\n column,\n values,\n });\n\n if (featureValue === undefined || featureValue === null) return 0;\n\n return filterFn(values, featureValue);\n });\n });\n}\n","export const epsilon = 1.1102230246251565e-16;\nexport const splitter = 134217729;\nexport const resulterrbound = (3 + 8 * epsilon) * epsilon;\n\n// fast_expansion_sum_zeroelim routine from oritinal code\nexport function sum(elen, e, flen, f, h) {\n let Q, Qnew, hh, bvirt;\n let enow = e[0];\n let fnow = f[0];\n let eindex = 0;\n let findex = 0;\n if ((fnow > enow) === (fnow > -enow)) {\n Q = enow;\n enow = e[++eindex];\n } else {\n Q = fnow;\n fnow = f[++findex];\n }\n let hindex = 0;\n if (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = enow + Q;\n hh = Q - (Qnew - enow);\n enow = e[++eindex];\n } else {\n Qnew = fnow + Q;\n hh = Q - (Qnew - fnow);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n while (eindex < elen && findex < flen) {\n if ((fnow > enow) === (fnow > -enow)) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n } else {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n }\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n }\n while (eindex < elen) {\n Qnew = Q + enow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (enow - bvirt);\n enow = e[++eindex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n while (findex < flen) {\n Qnew = Q + fnow;\n bvirt = Qnew - Q;\n hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n fnow = f[++findex];\n Q = Qnew;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function sum_three(alen, a, blen, b, clen, c, tmp, out) {\n return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);\n}\n\n// scale_expansion_zeroelim routine from oritinal code\nexport function scale(elen, e, b, h) {\n let Q, sum, hh, product1, product0;\n let bvirt, c, ahi, alo, bhi, blo;\n\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n let enow = e[0];\n Q = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);\n let hindex = 0;\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n for (let i = 1; i < elen; i++) {\n enow = e[i];\n product1 = enow * b;\n c = splitter * enow;\n ahi = c - (c - enow);\n alo = enow - ahi;\n product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);\n sum = Q + product0;\n bvirt = sum - Q;\n hh = Q - (sum - bvirt) + (product0 - bvirt);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n Q = product1 + sum;\n hh = sum - (Q - product1);\n if (hh !== 0) {\n h[hindex++] = hh;\n }\n }\n if (Q !== 0 || hindex === 0) {\n h[hindex++] = Q;\n }\n return hindex;\n}\n\nexport function negate(elen, e) {\n for (let i = 0; i < elen; i++) e[i] = -e[i];\n return elen;\n}\n\nexport function estimate(elen, e) {\n let Q = e[0];\n for (let i = 1; i < elen; i++) Q += e[i];\n return Q;\n}\n\nexport function vec(n) {\n return new Float64Array(n);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum} from './util.js';\n\nconst ccwerrboundA = (3 + 16 * epsilon) * epsilon;\nconst ccwerrboundB = (2 + 12 * epsilon) * epsilon;\nconst ccwerrboundC = (9 + 64 * epsilon) * epsilon * epsilon;\n\nconst B = vec(4);\nconst C1 = vec(8);\nconst C2 = vec(12);\nconst D = vec(16);\nconst u = vec(4);\n\nfunction orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n let acxtail, acytail, bcxtail, bcytail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const acx = ax - cx;\n const bcx = bx - cx;\n const acy = ay - cy;\n const bcy = by - cy;\n\n s1 = acx * bcy;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcx;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n B[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n B[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n B[3] = u3;\n\n let det = estimate(4, B);\n let errbound = ccwerrboundB * detsum;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - acx;\n acxtail = ax - (acx + bvirt) + (bvirt - cx);\n bvirt = bx - bcx;\n bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n bvirt = ay - acy;\n acytail = ay - (acy + bvirt) + (bvirt - cy);\n bvirt = by - bcy;\n bcytail = by - (bcy + bvirt) + (bvirt - cy);\n\n if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n return det;\n }\n\n errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);\n if (det >= errbound || -det >= errbound) return det;\n\n s1 = acxtail * bcy;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcy;\n bhi = c - (c - bcy);\n blo = bcy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcx;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcx;\n bhi = c - (c - bcx);\n blo = bcx - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C1len = sum(4, B, 4, u, C1);\n\n s1 = acx * bcytail;\n c = splitter * acx;\n ahi = c - (c - acx);\n alo = acx - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acy * bcxtail;\n c = splitter * acy;\n ahi = c - (c - acy);\n alo = acy - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const C2len = sum(C1len, C1, 4, u, C2);\n\n s1 = acxtail * bcytail;\n c = splitter * acxtail;\n ahi = c - (c - acxtail);\n alo = acxtail - ahi;\n c = splitter * bcytail;\n bhi = c - (c - bcytail);\n blo = bcytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = acytail * bcxtail;\n c = splitter * acytail;\n ahi = c - (c - acytail);\n alo = acytail - ahi;\n c = splitter * bcxtail;\n bhi = c - (c - bcxtail);\n blo = bcxtail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n u[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n u[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n const Dlen = sum(C2len, C2, 4, u, D);\n\n return D[Dlen - 1];\n}\n\nexport function orient2d(ax, ay, bx, by, cx, cy) {\n const detleft = (ay - cy) * (bx - cx);\n const detright = (ax - cx) * (by - cy);\n const det = detleft - detright;\n\n const detsum = Math.abs(detleft + detright);\n if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n\n return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n}\n\nexport function orient2dfast(ax, ay, bx, by, cx, cy) {\n return (ay - cy) * (bx - cx) - (ax - cx) * (by - cy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, scale} from './util.js';\n\nconst o3derrboundA = (7 + 56 * epsilon) * epsilon;\nconst o3derrboundB = (3 + 28 * epsilon) * epsilon;\nconst o3derrboundC = (26 + 288 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst at_b = vec(4);\nconst at_c = vec(4);\nconst bt_c = vec(4);\nconst bt_a = vec(4);\nconst ct_a = vec(4);\nconst ct_b = vec(4);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abt = vec(8);\nconst u = vec(4);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _16 = vec(8);\nconst _12 = vec(12);\n\nlet fin = vec(192);\nlet fin2 = vec(192);\n\nfunction finadd(finlen, alen, a) {\n finlen = sum(finlen, fin, alen, a, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction tailinit(xtail, ytail, ax, ay, bx, by, a, b) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3, negate;\n if (xtail === 0) {\n if (ytail === 0) {\n a[0] = 0;\n b[0] = 0;\n return 1;\n } else {\n negate = -ytail;\n s1 = negate * ax;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n }\n } else {\n if (ytail === 0) {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n a[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n a[1] = s1;\n negate = -xtail;\n s1 = negate * by;\n c = splitter * negate;\n ahi = c - (c - negate);\n alo = negate - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n b[0] = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n b[1] = s1;\n return 2;\n } else {\n s1 = xtail * ay;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ytail * ax;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * ax;\n bhi = c - (c - ax);\n blo = ax - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n a[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n a[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n a[2] = _j - (u3 - bvirt) + (_i - bvirt);\n a[3] = u3;\n s1 = ytail * bx;\n c = splitter * ytail;\n ahi = c - (c - ytail);\n alo = ytail - ahi;\n c = splitter * bx;\n bhi = c - (c - bx);\n blo = bx - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = xtail * by;\n c = splitter * xtail;\n ahi = c - (c - xtail);\n alo = xtail - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n b[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n b[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n b[2] = _j - (u3 - bvirt) + (_i - bvirt);\n b[3] = u3;\n return 4;\n }\n }\n}\n\nfunction tailadd(finlen, a, b, k, z) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, u3;\n s1 = a * b;\n c = splitter * a;\n ahi = c - (c - a);\n alo = a - ahi;\n c = splitter * b;\n bhi = c - (c - b);\n blo = b - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n c = splitter * k;\n bhi = c - (c - k);\n blo = k - bhi;\n _i = s0 * k;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * k;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n if (z !== 0) {\n c = splitter * z;\n bhi = c - (c - z);\n blo = z - bhi;\n _i = s0 * z;\n c = splitter * s0;\n ahi = c - (c - s0);\n alo = s0 - ahi;\n u[0] = alo * blo - (_i - ahi * bhi - alo * bhi - ahi * blo);\n _j = s1 * z;\n c = splitter * s1;\n ahi = c - (c - s1);\n alo = s1 - ahi;\n _0 = alo * blo - (_j - ahi * bhi - alo * bhi - ahi * blo);\n _k = _i + _0;\n bvirt = _k - _i;\n u[1] = _i - (_k - bvirt) + (_0 - bvirt);\n u3 = _j + _k;\n u[2] = _k - (u3 - _j);\n u[3] = u3;\n finlen = finadd(finlen, 4, u);\n }\n return finlen;\n}\n\nfunction orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail;\n let adytail, bdytail, cdytail;\n let adztail, bdztail, cdztail;\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _k, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n scale(4, bc, adz, _8), _8,\n scale(4, ca, bdz, _8b), _8b, _16), _16,\n scale(4, ab, cdz, _8), _8, fin);\n\n let det = estimate(finlen, fin);\n let errbound = o3derrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n bvirt = az - adz;\n adztail = az - (adz + bvirt) + (bvirt - dz);\n bvirt = bz - bdz;\n bdztail = bz - (bdz + bvirt) + (bvirt - dz);\n bvirt = cz - cdz;\n cdztail = cz - (cdz + bvirt) + (bvirt - dz);\n\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&\n adytail === 0 && bdytail === 0 && cdytail === 0 &&\n adztail === 0 && bdztail === 0 && cdztail === 0) {\n return det;\n }\n\n errbound = o3derrboundC * permanent + resulterrbound * Math.abs(det);\n det +=\n adz * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) + adztail * (bdx * cdy - bdy * cdx) +\n bdz * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) + bdztail * (cdx * ady - cdy * adx) +\n cdz * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) + cdztail * (adx * bdy - ady * bdx);\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n const at_len = tailinit(adxtail, adytail, bdx, bdy, cdx, cdy, at_b, at_c);\n const bt_len = tailinit(bdxtail, bdytail, cdx, cdy, adx, ady, bt_c, bt_a);\n const ct_len = tailinit(cdxtail, cdytail, adx, ady, bdx, bdy, ct_a, ct_b);\n\n const bctlen = sum(bt_len, bt_c, ct_len, ct_b, bct);\n finlen = finadd(finlen, scale(bctlen, bct, adz, _16), _16);\n\n const catlen = sum(ct_len, ct_a, at_len, at_c, cat);\n finlen = finadd(finlen, scale(catlen, cat, bdz, _16), _16);\n\n const abtlen = sum(at_len, at_b, bt_len, bt_a, abt);\n finlen = finadd(finlen, scale(abtlen, abt, cdz, _16), _16);\n\n if (adztail !== 0) {\n finlen = finadd(finlen, scale(4, bc, adztail, _12), _12);\n finlen = finadd(finlen, scale(bctlen, bct, adztail, _16), _16);\n }\n if (bdztail !== 0) {\n finlen = finadd(finlen, scale(4, ca, bdztail, _12), _12);\n finlen = finadd(finlen, scale(catlen, cat, bdztail, _16), _16);\n }\n if (cdztail !== 0) {\n finlen = finadd(finlen, scale(4, ab, cdztail, _12), _12);\n finlen = finadd(finlen, scale(abtlen, abt, cdztail, _16), _16);\n }\n\n if (adxtail !== 0) {\n if (bdytail !== 0) {\n finlen = tailadd(finlen, adxtail, bdytail, cdz, cdztail);\n }\n if (cdytail !== 0) {\n finlen = tailadd(finlen, -adxtail, cdytail, bdz, bdztail);\n }\n }\n if (bdxtail !== 0) {\n if (cdytail !== 0) {\n finlen = tailadd(finlen, bdxtail, cdytail, adz, adztail);\n }\n if (adytail !== 0) {\n finlen = tailadd(finlen, -bdxtail, adytail, cdz, cdztail);\n }\n }\n if (cdxtail !== 0) {\n if (adytail !== 0) {\n finlen = tailadd(finlen, cdxtail, adytail, bdz, bdztail);\n }\n if (bdytail !== 0) {\n finlen = tailadd(finlen, -cdxtail, bdytail, adz, adztail);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function orient3d(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n\n const det =\n adz * (bdxcdy - cdxbdy) +\n bdz * (cdxady - adxcdy) +\n cdz * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);\n\n const errbound = o3derrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n\n return orient3dadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, permanent);\n}\n\nexport function orient3dfast(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n const adz = az - dz;\n const bdz = bz - dz;\n const cdz = cz - dz;\n\n return adx * (bdy * cdz - bdz * cdy) +\n bdx * (cdy * adz - cdz * ady) +\n cdx * (ady * bdz - adz * bdy);\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale} from './util.js';\n\nconst iccerrboundA = (10 + 96 * epsilon) * epsilon;\nconst iccerrboundB = (4 + 48 * epsilon) * epsilon;\nconst iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;\n\nconst bc = vec(4);\nconst ca = vec(4);\nconst ab = vec(4);\nconst aa = vec(4);\nconst bb = vec(4);\nconst cc = vec(4);\nconst u = vec(4);\nconst v = vec(4);\nconst axtbc = vec(8);\nconst aytbc = vec(8);\nconst bxtca = vec(8);\nconst bytca = vec(8);\nconst cxtab = vec(8);\nconst cytab = vec(8);\nconst abt = vec(8);\nconst bct = vec(8);\nconst cat = vec(8);\nconst abtt = vec(4);\nconst bctt = vec(4);\nconst catt = vec(4);\n\nconst _8 = vec(8);\nconst _16 = vec(16);\nconst _16b = vec(16);\nconst _16c = vec(16);\nconst _32 = vec(32);\nconst _32b = vec(32);\nconst _48 = vec(48);\nconst _64 = vec(64);\n\nlet fin = vec(1152);\nlet fin2 = vec(1152);\n\nfunction finadd(finlen, a, alen) {\n finlen = sum(finlen, fin, a, alen, fin2);\n const tmp = fin; fin = fin2; fin2 = tmp;\n return finlen;\n}\n\nfunction incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {\n let finlen;\n let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;\n let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;\n let abtlen, bctlen, catlen;\n let abttlen, bcttlen, cattlen;\n let n1, n0;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n s1 = bdx * cdy;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * bdy;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cdx * ady;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * cdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ca[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ca[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ca[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ca[3] = u3;\n s1 = adx * bdy;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * ady;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n\n finlen = sum(\n sum(\n sum(\n scale(scale(4, bc, adx, _8), _8, adx, _16), _16,\n scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,\n sum(\n scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,\n scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,\n sum(\n scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,\n scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);\n\n let det = estimate(finlen, fin);\n let errbound = iccerrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - adx;\n adxtail = ax - (adx + bvirt) + (bvirt - dx);\n bvirt = ay - ady;\n adytail = ay - (ady + bvirt) + (bvirt - dy);\n bvirt = bx - bdx;\n bdxtail = bx - (bdx + bvirt) + (bvirt - dx);\n bvirt = by - bdy;\n bdytail = by - (bdy + bvirt) + (bvirt - dy);\n bvirt = cx - cdx;\n cdxtail = cx - (cdx + bvirt) + (bvirt - dx);\n bvirt = cy - cdy;\n cdytail = cy - (cdy + bvirt) + (bvirt - dy);\n if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {\n return det;\n }\n\n errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);\n det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +\n 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +\n ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +\n 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +\n ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +\n 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = adx * adx;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = ady * ady;\n c = splitter * ady;\n ahi = c - (c - ady);\n alo = ady - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n aa[2] = _j - (u3 - bvirt) + (_i - bvirt);\n aa[3] = u3;\n }\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = bdx * bdx;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = bdy * bdy;\n c = splitter * bdy;\n ahi = c - (c - bdy);\n alo = bdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bb[3] = u3;\n }\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = cdx * cdx;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);\n t1 = cdy * cdy;\n c = splitter * cdy;\n ahi = c - (c - cdy);\n alo = cdy - ahi;\n t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);\n _i = s0 + t0;\n bvirt = _i - s0;\n cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cc[3] = u3;\n }\n\n if (adxtail !== 0) {\n axtbclen = scale(4, bc, adxtail, axtbc);\n finlen = finadd(finlen, sum_three(\n scale(axtbclen, axtbc, 2 * adx, _16), _16,\n scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,\n scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);\n }\n if (adytail !== 0) {\n aytbclen = scale(4, bc, adytail, aytbc);\n finlen = finadd(finlen, sum_three(\n scale(aytbclen, aytbc, 2 * ady, _16), _16,\n scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,\n scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);\n }\n if (bdxtail !== 0) {\n bxtcalen = scale(4, ca, bdxtail, bxtca);\n finlen = finadd(finlen, sum_three(\n scale(bxtcalen, bxtca, 2 * bdx, _16), _16,\n scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,\n scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);\n }\n if (bdytail !== 0) {\n bytcalen = scale(4, ca, bdytail, bytca);\n finlen = finadd(finlen, sum_three(\n scale(bytcalen, bytca, 2 * bdy, _16), _16,\n scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,\n scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);\n }\n if (cdxtail !== 0) {\n cxtablen = scale(4, ab, cdxtail, cxtab);\n finlen = finadd(finlen, sum_three(\n scale(cxtablen, cxtab, 2 * cdx, _16), _16,\n scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,\n scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);\n }\n if (cdytail !== 0) {\n cytablen = scale(4, ab, cdytail, cytab);\n finlen = finadd(finlen, sum_three(\n scale(cytablen, cytab, 2 * cdy, _16), _16,\n scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,\n scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);\n }\n\n if (adxtail !== 0 || adytail !== 0) {\n if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {\n s1 = bdxtail * cdy;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdy;\n bhi = c - (c - cdy);\n blo = cdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * cdytail;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n s1 = cdxtail * -bdy;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * -bdy;\n bhi = c - (c - -bdy);\n blo = -bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * -bdytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * -bdytail;\n bhi = c - (c - -bdytail);\n blo = -bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n bctlen = sum(4, u, 4, v, bct);\n s1 = bdxtail * cdytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdxtail * bdytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bctt[3] = u3;\n bcttlen = 4;\n } else {\n bct[0] = 0;\n bctlen = 1;\n bctt[0] = 0;\n bcttlen = 1;\n }\n if (adxtail !== 0) {\n const len = scale(bctlen, bct, adxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(axtbclen, axtbc, adxtail, _16), _16,\n scale(len, _16c, 2 * adx, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * adx, _16), _16,\n scale(len2, _8, adxtail, _16b), _16b,\n scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);\n\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);\n }\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);\n }\n }\n if (adytail !== 0) {\n const len = scale(bctlen, bct, adytail, _16c);\n finlen = finadd(finlen, sum(\n scale(aytbclen, aytbc, adytail, _16), _16,\n scale(len, _16c, 2 * ady, _32), _32, _48), _48);\n\n const len2 = scale(bcttlen, bctt, adytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * ady, _16), _16,\n scale(len2, _8, adytail, _16b), _16b,\n scale(len, _16c, adytail, _32), _32, _32b, _64), _64);\n }\n }\n if (bdxtail !== 0 || bdytail !== 0) {\n if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {\n s1 = cdxtail * ady;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * ady;\n bhi = c - (c - ady);\n blo = ady - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cdx * adytail;\n c = splitter * cdx;\n ahi = c - (c - cdx);\n alo = cdx - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -cdy;\n n0 = -cdytail;\n s1 = adxtail * n1;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * n0;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n catlen = sum(4, u, 4, v, cat);\n s1 = cdxtail * adytail;\n c = splitter * cdxtail;\n ahi = c - (c - cdxtail);\n alo = cdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adxtail * cdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * cdytail;\n bhi = c - (c - cdytail);\n blo = cdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n catt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n catt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n catt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n catt[3] = u3;\n cattlen = 4;\n } else {\n cat[0] = 0;\n catlen = 1;\n catt[0] = 0;\n cattlen = 1;\n }\n if (bdxtail !== 0) {\n const len = scale(catlen, cat, bdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(bxtcalen, bxtca, bdxtail, _16), _16,\n scale(len, _16c, 2 * bdx, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdx, _16), _16,\n scale(len2, _8, bdxtail, _16b), _16b,\n scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);\n\n if (cdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);\n }\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);\n }\n }\n if (bdytail !== 0) {\n const len = scale(catlen, cat, bdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(bytcalen, bytca, bdytail, _16), _16,\n scale(len, _16c, 2 * bdy, _32), _32, _48), _48);\n\n const len2 = scale(cattlen, catt, bdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * bdy, _16), _16,\n scale(len2, _8, bdytail, _16b), _16b,\n scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);\n }\n }\n if (cdxtail !== 0 || cdytail !== 0) {\n if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {\n s1 = adxtail * bdy;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdy;\n bhi = c - (c - bdy);\n blo = bdy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = adx * bdytail;\n c = splitter * adx;\n ahi = c - (c - adx);\n alo = adx - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n u[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n u[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n u[3] = u3;\n n1 = -ady;\n n0 = -adytail;\n s1 = bdxtail * n1;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * n1;\n bhi = c - (c - n1);\n blo = n1 - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdx * n0;\n c = splitter * bdx;\n ahi = c - (c - bdx);\n alo = bdx - ahi;\n c = splitter * n0;\n bhi = c - (c - n0);\n blo = n0 - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 + t0;\n bvirt = _i - s0;\n v[0] = s0 - (_i - bvirt) + (t0 - bvirt);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 + t1;\n bvirt = _i - _0;\n v[1] = _0 - (_i - bvirt) + (t1 - bvirt);\n u3 = _j + _i;\n bvirt = u3 - _j;\n v[2] = _j - (u3 - bvirt) + (_i - bvirt);\n v[3] = u3;\n abtlen = sum(4, u, 4, v, abt);\n s1 = adxtail * bdytail;\n c = splitter * adxtail;\n ahi = c - (c - adxtail);\n alo = adxtail - ahi;\n c = splitter * bdytail;\n bhi = c - (c - bdytail);\n blo = bdytail - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bdxtail * adytail;\n c = splitter * bdxtail;\n ahi = c - (c - bdxtail);\n alo = bdxtail - ahi;\n c = splitter * adytail;\n bhi = c - (c - adytail);\n blo = adytail - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);\n abtt[3] = u3;\n abttlen = 4;\n } else {\n abt[0] = 0;\n abtlen = 1;\n abtt[0] = 0;\n abttlen = 1;\n }\n if (cdxtail !== 0) {\n const len = scale(abtlen, abt, cdxtail, _16c);\n finlen = finadd(finlen, sum(\n scale(cxtablen, cxtab, cdxtail, _16), _16,\n scale(len, _16c, 2 * cdx, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdxtail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdx, _16), _16,\n scale(len2, _8, cdxtail, _16b), _16b,\n scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);\n\n if (adytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);\n }\n if (bdytail !== 0) {\n finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);\n }\n }\n if (cdytail !== 0) {\n const len = scale(abtlen, abt, cdytail, _16c);\n finlen = finadd(finlen, sum(\n scale(cytablen, cytab, cdytail, _16), _16,\n scale(len, _16c, 2 * cdy, _32), _32, _48), _48);\n\n const len2 = scale(abttlen, abtt, cdytail, _8);\n finlen = finadd(finlen, sum_three(\n scale(len2, _8, 2 * cdy, _16), _16,\n scale(len2, _8, cdytail, _16b), _16b,\n scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);\n }\n }\n\n return fin[finlen - 1];\n}\n\nexport function incircle(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const bdx = bx - dx;\n const cdx = cx - dx;\n const ady = ay - dy;\n const bdy = by - dy;\n const cdy = cy - dy;\n\n const bdxcdy = bdx * cdy;\n const cdxbdy = cdx * bdy;\n const alift = adx * adx + ady * ady;\n\n const cdxady = cdx * ady;\n const adxcdy = adx * cdy;\n const blift = bdx * bdx + bdy * bdy;\n\n const adxbdy = adx * bdy;\n const bdxady = bdx * ady;\n const clift = cdx * cdx + cdy * cdy;\n\n const det =\n alift * (bdxcdy - cdxbdy) +\n blift * (cdxady - adxcdy) +\n clift * (adxbdy - bdxady);\n\n const permanent =\n (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +\n (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +\n (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;\n\n const errbound = iccerrboundA * permanent;\n\n if (det > errbound || -det > errbound) {\n return det;\n }\n return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);\n}\n\nexport function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {\n const adx = ax - dx;\n const ady = ay - dy;\n const bdx = bx - dx;\n const bdy = by - dy;\n const cdx = cx - dx;\n const cdy = cy - dy;\n\n const abdet = adx * bdy - bdx * ady;\n const bcdet = bdx * cdy - cdx * bdy;\n const cadet = cdx * ady - adx * cdy;\n const alift = adx * adx + ady * ady;\n const blift = bdx * bdx + bdy * bdy;\n const clift = cdx * cdx + cdy * cdy;\n\n return alift * bcdet + blift * cadet + clift * abdet;\n}\n","import {epsilon, splitter, resulterrbound, estimate, vec, sum, sum_three, scale, negate} from './util.js';\n\nconst isperrboundA = (16 + 224 * epsilon) * epsilon;\nconst isperrboundB = (5 + 72 * epsilon) * epsilon;\nconst isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;\n\nconst ab = vec(4);\nconst bc = vec(4);\nconst cd = vec(4);\nconst de = vec(4);\nconst ea = vec(4);\nconst ac = vec(4);\nconst bd = vec(4);\nconst ce = vec(4);\nconst da = vec(4);\nconst eb = vec(4);\n\nconst abc = vec(24);\nconst bcd = vec(24);\nconst cde = vec(24);\nconst dea = vec(24);\nconst eab = vec(24);\nconst abd = vec(24);\nconst bce = vec(24);\nconst cda = vec(24);\nconst deb = vec(24);\nconst eac = vec(24);\n\nconst adet = vec(1152);\nconst bdet = vec(1152);\nconst cdet = vec(1152);\nconst ddet = vec(1152);\nconst edet = vec(1152);\nconst abdet = vec(2304);\nconst cddet = vec(2304);\nconst cdedet = vec(3456);\nconst deter = vec(5760);\n\nconst _8 = vec(8);\nconst _8b = vec(8);\nconst _8c = vec(8);\nconst _16 = vec(16);\nconst _24 = vec(24);\nconst _48 = vec(48);\nconst _48b = vec(48);\nconst _96 = vec(96);\nconst _192 = vec(192);\nconst _384x = vec(384);\nconst _384y = vec(384);\nconst _384z = vec(384);\nconst _768 = vec(768);\n\nfunction sum_three_scale(a, b, c, az, bz, cz, out) {\n return sum_three(\n scale(4, a, az, _8), _8,\n scale(4, b, bz, _8b), _8b,\n scale(4, c, cz, _8c), _8c, _16, out);\n}\n\nfunction liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {\n const len = sum(\n sum(alen, a, blen, b, _48), _48,\n negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);\n\n return sum_three(\n scale(scale(len, _96, x, _192), _192, x, _384x), _384x,\n scale(scale(len, _96, y, _192), _192, y, _384y), _384y,\n scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);\n}\n\nfunction insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;\n\n s1 = ax * by;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ay;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ab[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ab[3] = u3;\n s1 = bx * cy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * by;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bc[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bc[3] = u3;\n s1 = cx * dy;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * cy;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n cd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n cd[3] = u3;\n s1 = dx * ey;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * dy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n de[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n de[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n de[2] = _j - (u3 - bvirt) + (_i - bvirt);\n de[3] = u3;\n s1 = ex * ay;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * ey;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ea[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ea[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ea[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ea[3] = u3;\n s1 = ax * cy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cx * ay;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ac[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ac[3] = u3;\n s1 = bx * dy;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dx * by;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n bd[2] = _j - (u3 - bvirt) + (_i - bvirt);\n bd[3] = u3;\n s1 = cx * ey;\n c = splitter * cx;\n ahi = c - (c - cx);\n alo = cx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ex * cy;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * cy;\n bhi = c - (c - cy);\n blo = cy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ce[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ce[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n ce[2] = _j - (u3 - bvirt) + (_i - bvirt);\n ce[3] = u3;\n s1 = dx * ay;\n c = splitter * dx;\n ahi = c - (c - dx);\n alo = dx - ahi;\n c = splitter * ay;\n bhi = c - (c - ay);\n blo = ay - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = ax * dy;\n c = splitter * ax;\n ahi = c - (c - ax);\n alo = ax - ahi;\n c = splitter * dy;\n bhi = c - (c - dy);\n blo = dy - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n da[2] = _j - (u3 - bvirt) + (_i - bvirt);\n da[3] = u3;\n s1 = ex * by;\n c = splitter * ex;\n ahi = c - (c - ex);\n alo = ex - ahi;\n c = splitter * by;\n bhi = c - (c - by);\n blo = by - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bx * ey;\n c = splitter * bx;\n ahi = c - (c - bx);\n alo = bx - ahi;\n c = splitter * ey;\n bhi = c - (c - ey);\n blo = ey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n eb[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n eb[1] = _0 - (_i + bvirt) + (bvirt - t1);\n u3 = _j + _i;\n bvirt = u3 - _j;\n eb[2] = _j - (u3 - bvirt) + (_i - bvirt);\n eb[3] = u3;\n\n const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);\n const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);\n const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);\n const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);\n const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);\n const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);\n const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);\n const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);\n const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);\n const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);\n\n const deterlen = sum_three(\n liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,\n liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,\n sum_three(\n liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,\n liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,\n liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);\n\n return deter[deterlen - 1];\n}\n\nconst xdet = vec(96);\nconst ydet = vec(96);\nconst zdet = vec(96);\nconst fin = vec(1152);\n\nfunction liftadapt(a, b, c, az, bz, cz, x, y, z, out) {\n const len = sum_three_scale(a, b, c, az, bz, cz, _24);\n return sum_three(\n scale(scale(len, _24, x, _48), _48, x, xdet), xdet,\n scale(scale(len, _24, y, _48), _48, y, ydet), ydet,\n scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);\n}\n\nfunction insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {\n let ab3, bc3, cd3, da3, ac3, bd3;\n\n let aextail, bextail, cextail, dextail;\n let aeytail, beytail, ceytail, deytail;\n let aeztail, beztail, ceztail, deztail;\n\n let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;\n\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n s1 = aex * bey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = bex * aey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ab[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ab[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ab3 = _j + _i;\n bvirt = ab3 - _j;\n ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);\n ab[3] = ab3;\n s1 = bex * cey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * bey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bc[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bc[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bc3 = _j + _i;\n bvirt = bc3 - _j;\n bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);\n bc[3] = bc3;\n s1 = cex * dey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * cey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n cd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n cd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n cd3 = _j + _i;\n bvirt = cd3 - _j;\n cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);\n cd[3] = cd3;\n s1 = dex * aey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = aex * dey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n da[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n da[1] = _0 - (_i + bvirt) + (bvirt - t1);\n da3 = _j + _i;\n bvirt = da3 - _j;\n da[2] = _j - (da3 - bvirt) + (_i - bvirt);\n da[3] = da3;\n s1 = aex * cey;\n c = splitter * aex;\n ahi = c - (c - aex);\n alo = aex - ahi;\n c = splitter * cey;\n bhi = c - (c - cey);\n blo = cey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = cex * aey;\n c = splitter * cex;\n ahi = c - (c - cex);\n alo = cex - ahi;\n c = splitter * aey;\n bhi = c - (c - aey);\n blo = aey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n ac[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n ac[1] = _0 - (_i + bvirt) + (bvirt - t1);\n ac3 = _j + _i;\n bvirt = ac3 - _j;\n ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);\n ac[3] = ac3;\n s1 = bex * dey;\n c = splitter * bex;\n ahi = c - (c - bex);\n alo = bex - ahi;\n c = splitter * dey;\n bhi = c - (c - dey);\n blo = dey - bhi;\n s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n t1 = dex * bey;\n c = splitter * dex;\n ahi = c - (c - dex);\n alo = dex - ahi;\n c = splitter * bey;\n bhi = c - (c - bey);\n blo = bey - bhi;\n t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);\n _i = s0 - t0;\n bvirt = s0 - _i;\n bd[0] = s0 - (_i + bvirt) + (bvirt - t0);\n _j = s1 + _i;\n bvirt = _j - s1;\n _0 = s1 - (_j - bvirt) + (_i - bvirt);\n _i = _0 - t1;\n bvirt = _0 - _i;\n bd[1] = _0 - (_i + bvirt) + (bvirt - t1);\n bd3 = _j + _i;\n bvirt = bd3 - _j;\n bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);\n bd[3] = bd3;\n\n const finlen = sum(\n sum(\n negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,\n liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,\n sum(\n negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,\n liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);\n\n let det = estimate(finlen, fin);\n let errbound = isperrboundB * permanent;\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n bvirt = ax - aex;\n aextail = ax - (aex + bvirt) + (bvirt - ex);\n bvirt = ay - aey;\n aeytail = ay - (aey + bvirt) + (bvirt - ey);\n bvirt = az - aez;\n aeztail = az - (aez + bvirt) + (bvirt - ez);\n bvirt = bx - bex;\n bextail = bx - (bex + bvirt) + (bvirt - ex);\n bvirt = by - bey;\n beytail = by - (bey + bvirt) + (bvirt - ey);\n bvirt = bz - bez;\n beztail = bz - (bez + bvirt) + (bvirt - ez);\n bvirt = cx - cex;\n cextail = cx - (cex + bvirt) + (bvirt - ex);\n bvirt = cy - cey;\n ceytail = cy - (cey + bvirt) + (bvirt - ey);\n bvirt = cz - cez;\n ceztail = cz - (cez + bvirt) + (bvirt - ez);\n bvirt = dx - dex;\n dextail = dx - (dex + bvirt) + (bvirt - ex);\n bvirt = dy - dey;\n deytail = dy - (dey + bvirt) + (bvirt - ey);\n bvirt = dz - dez;\n deztail = dz - (dez + bvirt) + (bvirt - ez);\n if (aextail === 0 && aeytail === 0 && aeztail === 0 &&\n bextail === 0 && beytail === 0 && beztail === 0 &&\n cextail === 0 && ceytail === 0 && ceztail === 0 &&\n dextail === 0 && deytail === 0 && deztail === 0) {\n return det;\n }\n\n errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);\n\n const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);\n const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);\n const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);\n const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);\n const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);\n const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);\n det +=\n (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +\n (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *\n ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -\n ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +\n (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *\n ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +\n 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +\n (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -\n ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +\n (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));\n\n if (det >= errbound || -det >= errbound) {\n return det;\n }\n\n return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);\n}\n\nexport function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {\n const aex = ax - ex;\n const bex = bx - ex;\n const cex = cx - ex;\n const dex = dx - ex;\n const aey = ay - ey;\n const bey = by - ey;\n const cey = cy - ey;\n const dey = dy - ey;\n const aez = az - ez;\n const bez = bz - ez;\n const cez = cz - ez;\n const dez = dz - ez;\n\n const aexbey = aex * bey;\n const bexaey = bex * aey;\n const ab = aexbey - bexaey;\n const bexcey = bex * cey;\n const cexbey = cex * bey;\n const bc = bexcey - cexbey;\n const cexdey = cex * dey;\n const dexcey = dex * cey;\n const cd = cexdey - dexcey;\n const dexaey = dex * aey;\n const aexdey = aex * dey;\n const da = dexaey - aexdey;\n const aexcey = aex * cey;\n const cexaey = cex * aey;\n const ac = aexcey - cexaey;\n const bexdey = bex * dey;\n const dexbey = dex * bey;\n const bd = bexdey - dexbey;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n const det =\n (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +\n (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));\n\n const aezplus = Math.abs(aez);\n const bezplus = Math.abs(bez);\n const cezplus = Math.abs(cez);\n const dezplus = Math.abs(dez);\n const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);\n const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);\n const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);\n const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);\n const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);\n const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);\n const permanent =\n (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +\n (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +\n (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +\n (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;\n\n const errbound = isperrboundA * permanent;\n if (det > errbound || -det > errbound) {\n return det;\n }\n return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);\n}\n\nexport function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {\n const aex = pax - pex;\n const bex = pbx - pex;\n const cex = pcx - pex;\n const dex = pdx - pex;\n const aey = pay - pey;\n const bey = pby - pey;\n const cey = pcy - pey;\n const dey = pdy - pey;\n const aez = paz - pez;\n const bez = pbz - pez;\n const cez = pcz - pez;\n const dez = pdz - pez;\n\n const ab = aex * bey - bex * aey;\n const bc = bex * cey - cex * bey;\n const cd = cex * dey - dex * cey;\n const da = dex * aey - aex * dey;\n const ac = aex * cey - cex * aey;\n const bd = bex * dey - dex * bey;\n\n const abc = aez * bc - bez * ac + cez * ab;\n const bcd = bez * cd - cez * bd + dez * bc;\n const cda = cez * da + dez * ac + aez * cd;\n const dab = dez * ab + aez * bd + bez * da;\n\n const alift = aex * aex + aey * aey + aez * aez;\n const blift = bex * bex + bey * bey + bez * bez;\n const clift = cex * cex + cey * cey + cez * cez;\n const dlift = dex * dex + dey * dey + dez * dez;\n\n return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);\n}\n","import { orient2d } from 'robust-predicates';\n\nfunction pointInPolygon(p, polygon) {\n var i;\n var ii;\n var k = 0;\n var f;\n var u1;\n var v1;\n var u2;\n var v2;\n var currentP;\n var nextP;\n\n var x = p[0];\n var y = p[1];\n\n var numContours = polygon.length;\n for (i = 0; i < numContours; i++) {\n ii = 0;\n var contour = polygon[i];\n var contourLen = contour.length - 1;\n\n currentP = contour[0];\n if (currentP[0] !== contour[contourLen][0] &&\n currentP[1] !== contour[contourLen][1]) {\n throw new Error('First and last coordinates in a ring must be the same')\n }\n\n u1 = currentP[0] - x;\n v1 = currentP[1] - y;\n\n for (ii; ii < contourLen; ii++) {\n nextP = contour[ii + 1];\n\n u2 = nextP[0] - x;\n v2 = nextP[1] - y;\n\n if (v1 === 0 && v2 === 0) {\n if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) { return 0 }\n } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) {\n f = orient2d(u1, u2, v1, v2, 0, 0);\n if (f === 0) { return 0 }\n if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) { k++; }\n }\n currentP = nextP;\n v1 = v2;\n u1 = u2;\n }\n }\n\n if (k % 2 === 0) { return false }\n return true\n}\n\nexport { pointInPolygon as default };\n","import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in kilometers. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n","import {\n Feature,\n FeatureCollection,\n Geometry,\n LineString,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { isNumber } from \"@turf/helpers\";\n\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @function\n * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nfunction getCoord(coord: Feature<Point> | Point | number[]): number[] {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n\n if (!Array.isArray(coord)) {\n if (\n coord.type === \"Feature\" &&\n coord.geometry !== null &&\n coord.geometry.type === \"Point\"\n ) {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (\n Array.isArray(coord) &&\n coord.length >= 2 &&\n !Array.isArray(coord[0]) &&\n !Array.isArray(coord[1])\n ) {\n return [...coord];\n }\n\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\n\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array\n *\n * @function\n * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array\n * @returns {Array<any>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coords = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nfunction getCoords<\n G extends\n | Point\n | LineString\n | Polygon\n | MultiPoint\n | MultiLineString\n | MultiPolygon,\n>(coords: any[] | Feature<G> | G): any[] {\n if (Array.isArray(coords)) {\n return coords;\n }\n\n // Feature\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n // Geometry\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\n\n/**\n * Checks if coordinates contains a number\n *\n * @function\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nfunction containsNumber(coordinates: any[]): boolean {\n if (\n coordinates.length > 1 &&\n isNumber(coordinates[0]) &&\n isNumber(coordinates[1])\n ) {\n return true;\n }\n\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\n\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @function\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction geojsonType(value: any, type: string, name: string): void {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n value.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nfunction featureOf(feature: Feature<any>, type: string, name: string): void {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction collectionOf(\n featureCollection: FeatureCollection<any>,\n type: string,\n name: string\n) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n }\n}\n\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nfunction getGeom<G extends Geometry>(geojson: Feature<G> | G): G {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\n\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name=\"geojson\"] name of the variable to display in error message (unused)\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nfunction getType(\n geojson: Feature<any> | FeatureCollection<any> | Geometry,\n _name?: string\n): string {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\n\nexport {\n getCoord,\n getCoords,\n containsNumber,\n geojsonType,\n featureOf,\n collectionOf,\n getGeom,\n getType,\n};\n// No default export!\n","import pip from \"point-in-polygon-hao\";\nimport {\n BBox,\n Feature,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getGeom } from \"@turf/invariant\";\n\n// http://en.wikipedia.org/wiki/Even%E2%80%93odd_rule\n// modified from: https://github.com/substack/point-in-polygon/blob/master/index.js\n// which was modified from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html\n/**\n * Takes a {@link Point} and a {@link Polygon} or {@link MultiPolygon} and determines if the point\n * resides inside the polygon. The polygon can be convex or concave. The function accounts for holes.\n *\n * @function\n * @param {Coord} point input point\n * @param {Feature<Polygon|MultiPolygon>} polygon input polygon or multipolygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreBoundary=false] True if polygon boundary should be ignored when determining if\n * the point is inside the polygon otherwise false.\n * @returns {boolean} `true` if the Point is inside the Polygon; `false` if the Point is not inside the Polygon\n * @example\n * var pt = turf.point([-77, 44]);\n * var poly = turf.polygon([[\n * [-81, 41],\n * [-81, 47],\n * [-72, 47],\n * [-72, 41],\n * [-81, 41]\n * ]]);\n *\n * turf.booleanPointInPolygon(pt, poly);\n * //= true\n */\nfunction booleanPointInPolygon<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n point: Coord,\n polygon: Feature<G, P> | G,\n options: {\n ignoreBoundary?: boolean;\n } = {}\n) {\n // validation\n if (!point) {\n throw new Error(\"point is required\");\n }\n if (!polygon) {\n throw new Error(\"polygon is required\");\n }\n\n const pt = getCoord(point);\n const geom = getGeom(polygon);\n const type = geom.type;\n const bbox = polygon.bbox;\n let polys: any[] = geom.coordinates;\n\n // Quick elimination if point is not inside bbox\n if (bbox && inBBox(pt, bbox) === false) {\n return false;\n }\n\n if (type === \"Polygon\") {\n polys = [polys];\n }\n let result = false;\n for (var i = 0; i < polys.length; ++i) {\n const polyResult = pip(pt, polys[i]);\n if (polyResult === 0) return options.ignoreBoundary ? false : true;\n else if (polyResult) result = true;\n }\n\n return result;\n}\n\n/**\n * inBBox\n *\n * @private\n * @param {Position} pt point [x,y]\n * @param {BBox} bbox BBox [west, south, east, north]\n * @returns {boolean} true/false if point is inside BBox\n */\nfunction inBBox(pt: number[], bbox: BBox) {\n return (\n bbox[0] <= pt[0] && bbox[1] <= pt[1] && bbox[2] >= pt[0] && bbox[3] >= pt[1]\n );\n}\n\nexport { booleanPointInPolygon };\nexport default booleanPointInPolygon;\n","class TinyQueue {\n constructor(data = [], compare = defaultCompare) {\n this.data = data;\n this.length = this.data.length;\n this.compare = compare;\n\n if (this.length > 0) {\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\n }\n }\n\n push(item) {\n this.data.push(item);\n this.length++;\n this._up(this.length - 1);\n }\n\n pop() {\n if (this.length === 0) return undefined;\n\n const top = this.data[0];\n const bottom = this.data.pop();\n this.length--;\n\n if (this.length > 0) {\n this.data[0] = bottom;\n this._down(0);\n }\n\n return top;\n }\n\n peek() {\n return this.data[0];\n }\n\n _up(pos) {\n const {data, compare} = this;\n const item = data[pos];\n\n while (pos > 0) {\n const parent = (pos - 1) >> 1;\n const current = data[parent];\n if (compare(item, current) >= 0) break;\n data[pos] = current;\n pos = parent;\n }\n\n data[pos] = item;\n }\n\n _down(pos) {\n const {data, compare} = this;\n const halfLength = this.length >> 1;\n const item = data[pos];\n\n while (pos < halfLength) {\n let left = (pos << 1) + 1;\n let best = data[left];\n const right = left + 1;\n\n if (right < this.length && compare(data[right], best) < 0) {\n left = right;\n best = data[right];\n }\n if (compare(best, item) >= 0) break;\n\n data[pos] = best;\n pos = left;\n }\n\n data[pos] = item;\n }\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction checkWhichEventIsLeft (e1, e2) {\n if (e1.p.x > e2.p.x) return 1\n if (e1.p.x < e2.p.x) return -1\n\n if (e1.p.y !== e2.p.y) return e1.p.y > e2.p.y ? 1 : -1\n return 1\n}\n\nfunction checkWhichSegmentHasRightEndpointFirst (seg1, seg2) {\n if (seg1.rightSweepEvent.p.x > seg2.rightSweepEvent.p.x) return 1\n if (seg1.rightSweepEvent.p.x < seg2.rightSweepEvent.p.x) return -1\n\n if (seg1.rightSweepEvent.p.y !== seg2.rightSweepEvent.p.y) return seg1.rightSweepEvent.p.y < seg2.rightSweepEvent.p.y ? 1 : -1\n return 1\n}\n\nclass Event {\n\n constructor (p, featureId, ringId, eventId) {\n this.p = {\n x: p[0],\n y: p[1]\n };\n this.featureId = featureId;\n this.ringId = ringId;\n this.eventId = eventId;\n\n this.otherEvent = null;\n this.isLeftEndpoint = null;\n }\n\n isSamePoint (eventToCheck) {\n return this.p.x === eventToCheck.p.x && this.p.y === eventToCheck.p.y\n }\n}\n\nfunction fillEventQueue (geojson, eventQueue) {\n if (geojson.type === 'FeatureCollection') {\n const features = geojson.features;\n for (let i = 0; i < features.length; i++) {\n processFeature(features[i], eventQueue);\n }\n } else {\n processFeature(geojson, eventQueue);\n }\n}\n\nlet featureId = 0;\nlet ringId = 0;\nlet eventId = 0;\nfunction processFeature (featureOrGeometry, eventQueue) {\n const geom = featureOrGeometry.type === 'Feature' ? featureOrGeometry.geometry : featureOrGeometry;\n let coords = geom.coordinates;\n // standardise the input\n if (geom.type === 'Polygon' || geom.type === 'MultiLineString') coords = [coords];\n if (geom.type === 'LineString') coords = [[coords]];\n\n for (let i = 0; i < coords.length; i++) {\n for (let ii = 0; ii < coords[i].length; ii++) {\n let currentP = coords[i][ii][0];\n let nextP = null;\n ringId = ringId + 1;\n for (let iii = 0; iii < coords[i][ii].length - 1; iii++) {\n nextP = coords[i][ii][iii + 1];\n\n const e1 = new Event(currentP, featureId, ringId, eventId);\n const e2 = new Event(nextP, featureId, ringId, eventId + 1);\n\n e1.otherEvent = e2;\n e2.otherEvent = e1;\n\n if (checkWhichEventIsLeft(e1, e2) > 0) {\n e2.isLeftEndpoint = true;\n e1.isLeftEndpoint = false;\n } else {\n e1.isLeftEndpoint = true;\n e2.isLeftEndpoint = false;\n }\n eventQueue.push(e1);\n eventQueue.push(e2);\n\n currentP = nextP;\n eventId = eventId + 1;\n }\n }\n }\n featureId = featureId + 1;\n}\n\nclass Segment {\n\n constructor (event) {\n this.leftSweepEvent = event;\n this.rightSweepEvent = event.otherEvent;\n }\n}\n\nfunction testSegmentIntersect (seg1, seg2) {\n if (seg1 === null || seg2 === null) return false\n\n if (seg1.leftSweepEvent.ringId === seg2.leftSweepEvent.ringId &&\n (seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.rightSweepEvent.isSamePoint(seg2.rightSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.leftSweepEvent) ||\n seg1.leftSweepEvent.isSamePoint(seg2.rightSweepEvent))) return false\n\n const x1 = seg1.leftSweepEvent.p.x;\n const y1 = seg1.leftSweepEvent.p.y;\n const x2 = seg1.rightSweepEvent.p.x;\n const y2 = seg1.rightSweepEvent.p.y;\n const x3 = seg2.leftSweepEvent.p.x;\n const y3 = seg2.leftSweepEvent.p.y;\n const x4 = seg2.rightSweepEvent.p.x;\n const y4 = seg2.rightSweepEvent.p.y;\n\n const denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));\n const numeA = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));\n const numeB = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3));\n\n if (denom === 0) {\n if (numeA === 0 && numeB === 0) return false\n return false\n }\n\n const uA = numeA / denom;\n const uB = numeB / denom;\n\n if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) {\n const x = x1 + (uA * (x2 - x1));\n const y = y1 + (uA * (y2 - y1));\n return [x, y]\n }\n return false\n}\n\n// import {debugEventAndSegments, debugRemovingSegment} from './debug'\n\nfunction runCheck (eventQueue, ignoreSelfIntersections) {\n ignoreSelfIntersections = ignoreSelfIntersections ? ignoreSelfIntersections : false;\n\n const intersectionPoints = [];\n const outQueue = new TinyQueue([], checkWhichSegmentHasRightEndpointFirst);\n\n while (eventQueue.length) {\n const event = eventQueue.pop();\n if (event.isLeftEndpoint) {\n // debugEventAndSegments(event.p, outQueue.data)\n const segment = new Segment(event);\n for (let i = 0; i < outQueue.data.length; i++) {\n const otherSeg = outQueue.data[i];\n if (ignoreSelfIntersections) {\n if (otherSeg.leftSweepEvent.featureId === event.featureId) continue\n }\n const intersection = testSegmentIntersect(segment, otherSeg);\n if (intersection !== false) intersectionPoints.push(intersection);\n }\n outQueue.push(segment);\n } else if (event.isLeftEndpoint === false) {\n outQueue.pop();\n // const seg = outQueue.pop()\n // debugRemovingSegment(event.p, seg)\n }\n }\n return intersectionPoints\n}\n\nfunction sweeplineIntersections (geojson, ignoreSelfIntersections) {\n const eventQueue = new TinyQueue([], checkWhichEventIsLeft);\n fillEventQueue(geojson, eventQueue);\n return runCheck(eventQueue, ignoreSelfIntersections)\n}\n\nexport default sweeplineIntersections;\n","import { feature, featureCollection, point } from \"@turf/helpers\";\nimport {\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport type { Intersection } from \"sweepline-intersections\";\nimport { sweeplineIntersections as findIntersections } from \"./lib/sweepline-intersections-export.js\";\n\n/**\n * Takes any LineString or Polygon GeoJSON and returns the intersecting point(s).\n *\n * @function\n * @param {GeoJSON} line1 any LineString or Polygon\n * @param {GeoJSON} line2 any LineString or Polygon\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.removeDuplicates=true] remove duplicate intersections\n * @param {boolean} [options.ignoreSelfIntersections=true] ignores self-intersections on input features\n * @returns {FeatureCollection<Point>} point(s) that intersect both\n * @example\n * var line1 = turf.lineString([[126, -11], [129, -21]]);\n * var line2 = turf.lineString([[123, -18], [131, -14]]);\n * var intersects = turf.lineIntersect(line1, line2);\n *\n * //addToMap\n * var addToMap = [line1, line2, intersects]\n */\nfunction lineIntersect<\n G1 extends LineString | MultiLineString | Polygon | MultiPolygon,\n G2 extends LineString | MultiLineString | Polygon | MultiPolygon,\n>(\n line1: FeatureCollection<G1> | Feature<G1> | G1,\n line2: FeatureCollection<G2> | Feature<G2> | G2,\n options: {\n removeDuplicates?: boolean;\n ignoreSelfIntersections?: boolean;\n } = {}\n): FeatureCollection<Point> {\n const { removeDuplicates = true, ignoreSelfIntersections = true } = options;\n let features: Feature<G1 | G2>[] = [];\n if (line1.type === \"FeatureCollection\")\n features = features.concat(line1.features);\n else if (line1.type === \"Feature\") features.push(line1);\n else if (\n line1.type === \"LineString\" ||\n line1.type === \"Polygon\" ||\n line1.type === \"MultiLineString\" ||\n line1.type === \"MultiPolygon\"\n ) {\n features.push(feature(line1));\n }\n\n if (line2.type === \"FeatureCollection\")\n features = features.concat(line2.features);\n else if (line2.type === \"Feature\") features.push(line2);\n else if (\n line2.type === \"LineString\" ||\n line2.type === \"Polygon\" ||\n line2.type === \"MultiLineString\" ||\n line2.type === \"MultiPolygon\"\n ) {\n features.push(feature(line2));\n }\n\n const intersections = findIntersections(\n featureCollection(features),\n ignoreSelfIntersections\n );\n\n let results: Intersection[] = [];\n if (removeDuplicates) {\n const unique: Record<string, boolean> = {};\n intersections.forEach((intersection) => {\n const key = intersection.join(\",\");\n if (!unique[key]) {\n unique[key] = true;\n results.push(intersection);\n }\n });\n } else {\n results = intersections;\n }\n return featureCollection(results.map((r) => point(r)));\n}\n\nexport { lineIntersect };\nexport default lineIntersect;\n","// Get around problems with moduleResolution node16 and some older libraries.\n// Manifests as \"This expression is not callable ... has no call signatures\"\n// https://stackoverflow.com/a/74709714\n\nimport lib from \"sweepline-intersections\";\n\nexport const sweeplineIntersections = lib as unknown as typeof lib.default;\n","import { feature, point, lineString, isObject } from \"@turf/helpers\";\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordEachCallback} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[featureIndex].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[geomIndex]\n : geometryMaybeCollection;\n\n // Handles null Geometry -- Skips this geometry\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n\n wrapShrink =\n excludeWrapCoord &&\n (geomType === \"Polygon\" || geomType === \"MultiPolygon\")\n ? 1\n : 0;\n\n switch (geomType) {\n case null:\n break;\n case \"Point\":\n if (\n callback(\n coords,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (\n callback(\n coords[j],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (\n callback(\n coords[j][k],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (\n callback(\n coords[j][k][l],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n geometryIndex++;\n }\n multiFeatureIndex++;\n }\n break;\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++)\n if (\n coordEach(geometry.geometries[j], callback, excludeWrapCoord) ===\n false\n )\n return false;\n break;\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {number[]} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @param {coordReduceCallback} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(\n geojson,\n function (\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) {\n if (coordIndex === 0 && initialValue === undefined)\n previousValue = currentCoord;\n else\n previousValue = callback(\n previousValue,\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n },\n excludeWrapCoord\n );\n return previousValue;\n}\n\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {propEachCallback} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\nfunction propEach(geojson, callback) {\n var i;\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n break;\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeoJsonProperties} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {propReduceCallback} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentProperties;\n else\n previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature<any>} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureEachCallback} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {featureReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentFeature;\n else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @function\n * @param {AllGeoJSON} geojson any GeoJSON object\n * @returns {Array<Array<number>>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @function\n * @param {FeatureCollection|Feature|Geometry|GeometryObject|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomEachCallback} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[i].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n featureProperties = isFeatureCollection\n ? geojson.features[i].properties\n : isFeature\n ? geojson.properties\n : {};\n featureBBox = isFeatureCollection\n ? geojson.features[i].bbox\n : isFeature\n ? geojson.bbox\n : undefined;\n featureId = isFeatureCollection\n ? geojson.features[i].id\n : isFeature\n ? geojson.id\n : undefined;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[g]\n : geometryMaybeCollection;\n\n // Handle null Geometry\n if (geometry === null) {\n if (\n callback(\n null,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n continue;\n }\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\": {\n if (\n callback(\n geometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n break;\n }\n case \"GeometryCollection\": {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (\n callback(\n geometry.geometries[j],\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n }\n break;\n }\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n // Only increase `featureIndex` per each feature\n featureIndex++;\n }\n}\n\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {GeometryObject} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {GeoJsonProperties} featureProperties The current Feature Properties being processed.\n * @param {BBox} featureBBox The current Feature BBox being processed.\n * @param {Id} featureId The current Feature Id being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {geomReduceCallback} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(\n geojson,\n function (\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentGeometry;\n else\n previousValue = callback(\n previousValue,\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenEachCallback} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (\n callback(\n feature(geometry, properties, { bbox: bbox, id: id }),\n featureIndex,\n 0\n ) === false\n )\n return false;\n return;\n }\n\n var geomType;\n\n // Callback for multi-geometry\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (\n var multiFeatureIndex = 0;\n multiFeatureIndex < geometry.coordinates.length;\n multiFeatureIndex++\n ) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate,\n };\n if (\n callback(feature(geom, properties), featureIndex, multiFeatureIndex) ===\n false\n )\n return false;\n }\n });\n}\n\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection|Feature|GeometryObject|GeometryCollection|Feature<GeometryCollection>} geojson any GeoJSON object\n * @param {flattenReduceCallback} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(\n geojson,\n function (currentFeature, featureIndex, multiFeatureIndex) {\n if (\n featureIndex === 0 &&\n multiFeatureIndex === 0 &&\n initialValue === undefined\n )\n previousValue = currentFeature;\n else\n previousValue = callback(\n previousValue,\n currentFeature,\n featureIndex,\n multiFeatureIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {AllGeoJSON} geojson any GeoJSON\n * @param {segmentEachCallback} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0;\n\n // Exclude null Geometries\n if (!feature.geometry) return;\n // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return;\n\n // Generate 2-vertex line segments\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (\n coordEach(\n feature,\n function (\n currentCoord,\n coordIndex,\n featureIndexCoord,\n multiPartIndexCoord,\n geometryIndex\n ) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (\n previousCoords === undefined ||\n featureIndex > previousFeatureIndex ||\n multiPartIndexCoord > previousMultiIndex ||\n geometryIndex > prevGeomIndex\n ) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n var currentSegment = lineString(\n [previousCoords, currentCoord],\n feature.properties\n );\n if (\n callback(\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) === false\n )\n return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }\n ) === false\n )\n return false;\n });\n}\n\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {Reducer}\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {segmentReduceCallback} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(\n geojson,\n function (\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) {\n if (started === false && initialValue === undefined)\n previousValue = currentSegment;\n else\n previousValue = callback(\n previousValue,\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n );\n started = true;\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {void}\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {lineEachCallback} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @returns {void}\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false)\n return false;\n break;\n case \"Polygon\":\n for (\n var geometryIndex = 0;\n geometryIndex < coords.length;\n geometryIndex++\n ) {\n if (\n callback(\n lineString(coords[geometryIndex], feature.properties),\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n }\n break;\n }\n });\n}\n\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {Reducer} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n * @returns {Reducer}\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @function\n * @param {FeatureCollection<Lines>|Feature<Lines>|Lines|Feature<GeometryCollection>|GeometryCollection} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {Reducer} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {Reducer} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(\n geojson,\n function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentLine;\n else\n previousValue = callback(\n previousValue,\n currentLine,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature<LineString<[[10, 10], [50, 30]]>>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature<LineString<[[-10, -10], [-50, -30]]>>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature<LineString<[[-50, -30], [-30, -40]]>>\n */\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find SegmentIndex\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString(\n [coords[segmentIndex], coords[segmentIndex + 1]],\n properties,\n options\n );\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[geometryIndex][segmentIndex],\n coords[geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][segmentIndex],\n coords[multiFeatureIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex =\n coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][geometryIndex][segmentIndex],\n coords[multiFeatureIndex][geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature<Point<[10, 10]>>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature<Point<[-10, -10]>>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature<Point<[-30, -40]>>\n */\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find Coord Index\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n case \"MultiPoint\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0)\n coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0)\n coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0)\n coordIndex =\n coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(\n coords[multiFeatureIndex][geometryIndex][coordIndex],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\nexport {\n coordReduce,\n coordEach,\n propEach,\n propReduce,\n featureReduce,\n featureEach,\n coordAll,\n geomReduce,\n geomEach,\n flattenReduce,\n flattenEach,\n segmentReduce,\n segmentEach,\n lineReduce,\n lineEach,\n findSegment,\n findPoint,\n};\n","import { featureCollection, lineString, multiLineString } from \"@turf/helpers\";\nimport {\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Converts a {@link Polygon} to {@link LineString|(Multi)LineString} or {@link MultiPolygon} to a\n * {@link FeatureCollection} of {@link LineString|(Multi)LineString}.\n *\n * @function\n * @param {Feature<Polygon|MultiPolygon>} poly Feature to convert\n * @param {Object} [options={}] Optional parameters\n * @param {Object} [options.properties={}] translates GeoJSON properties to Feature\n * @returns {FeatureCollection|Feature<LineString|MultiLinestring>} converted (Multi)Polygon to (Multi)LineString\n * @example\n * var poly = turf.polygon([[[125, -30], [145, -30], [145, -20], [125, -20], [125, -30]]]);\n *\n * var line = turf.polygonToLine(poly);\n *\n * //addToMap\n * var addToMap = [line];\n */\nfunction polygonToLine<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n poly: Feature<G, P> | G,\n options: { properties?: any } = {}\n):\n | Feature<LineString | MultiLineString, P>\n | FeatureCollection<LineString | MultiLineString, P> {\n const geom: any = getGeom(poly);\n if (!options.properties && poly.type === \"Feature\") {\n options.properties = poly.properties;\n }\n switch (geom.type) {\n case \"Polygon\":\n return singlePolygonToLine(geom, options);\n case \"MultiPolygon\":\n return multiPolygonToLine(geom, options);\n default:\n throw new Error(\"invalid poly\");\n }\n}\n\n/**\n * @private\n */\nfunction singlePolygonToLine<\n G extends Polygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n poly: Feature<G, P> | G,\n options: { properties?: any } = {}\n): Feature<LineString | MultiLineString, P> {\n const geom = getGeom(poly);\n const coords: any[] = geom.coordinates;\n const properties: any = options.properties\n ? options.properties\n : poly.type === \"Feature\"\n ? poly.properties\n : {};\n\n return coordsToLine(coords, properties);\n}\n\n/**\n * @private\n */\nfunction multiPolygonToLine<\n G extends MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n multiPoly: Feature<G, P> | G,\n options: { properties?: P } = {}\n): FeatureCollection<LineString | MultiLineString, P> {\n const geom = getGeom(multiPoly);\n const coords: any[] = geom.coordinates;\n const properties: any = options.properties\n ? options.properties\n : multiPoly.type === \"Feature\"\n ? multiPoly.properties\n : {};\n\n const lines: Array<Feature<LineString | MultiLineString, P>> = [];\n coords.forEach((coord) => {\n lines.push(coordsToLine(coord, properties));\n });\n return featureCollection(lines);\n}\n\n/**\n * @private\n */\nfunction coordsToLine<P extends GeoJsonProperties = GeoJsonProperties>(\n coords: number[][][],\n properties: P\n): Feature<LineString | MultiLineString, P> {\n if (coords.length > 1) {\n return multiLineString(coords, properties);\n }\n return lineString(coords[0], properties);\n}\n\nexport { polygonToLine, coordsToLine, multiPolygonToLine, singlePolygonToLine };\nexport default polygonToLine;\n","import {\n Feature,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from \"geojson\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport { flattenEach } from \"@turf/meta\";\nimport { polygonToLine } from \"@turf/polygon-to-line\";\n\n/**\n * Boolean-disjoint returns (TRUE) if the intersection of the two geometries is an empty set.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreSelfIntersections=true] ignore self-intersections on input features\n * @returns {boolean} true if the intersection is an empty set, false otherwise\n * @example\n * var point = turf.point([2, 2]);\n * var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);\n *\n * turf.booleanDisjoint(line, point);\n * //=true\n */\nfunction booleanDisjoint(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n {\n ignoreSelfIntersections = true,\n }: {\n ignoreSelfIntersections?: boolean;\n } = { ignoreSelfIntersections: true }\n): boolean {\n let bool = true;\n flattenEach(feature1, (flatten1) => {\n flattenEach(feature2, (flatten2) => {\n if (bool === false) {\n return false;\n }\n bool = disjoint(\n flatten1.geometry,\n flatten2.geometry,\n ignoreSelfIntersections\n );\n });\n });\n return bool;\n}\n\n/**\n * Disjoint operation for simple Geometries (Point/LineString/Polygon)\n *\n * @private\n * @param {Geometry<any>} geom1 GeoJSON Geometry\n * @param {Geometry<any>} geom2 GeoJSON Geometry\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if disjoint, false otherwise\n */\nfunction disjoint(geom1: any, geom2: any, ignoreSelfIntersections: boolean) {\n switch (geom1.type) {\n case \"Point\":\n switch (geom2.type) {\n case \"Point\":\n return !compareCoords(geom1.coordinates, geom2.coordinates);\n case \"LineString\":\n return !isPointOnLine(geom2, geom1);\n case \"Polygon\":\n return !booleanPointInPolygon(geom1, geom2);\n }\n /* istanbul ignore next */\n break;\n case \"LineString\":\n switch (geom2.type) {\n case \"Point\":\n return !isPointOnLine(geom1, geom2);\n case \"LineString\":\n return !isLineOnLine(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isLineInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n /* istanbul ignore next */\n break;\n case \"Polygon\":\n switch (geom2.type) {\n case \"Point\":\n return !booleanPointInPolygon(geom2, geom1);\n case \"LineString\":\n return !isLineInPoly(geom1, geom2, ignoreSelfIntersections);\n case \"Polygon\":\n return !isPolyInPoly(geom2, geom1, ignoreSelfIntersections);\n }\n }\n return false;\n}\n\n// http://stackoverflow.com/a/11908158/1979085\nfunction isPointOnLine(lineString: LineString, pt: Point) {\n for (let i = 0; i < lineString.coordinates.length - 1; i++) {\n if (\n isPointOnLineSegment(\n lineString.coordinates[i],\n lineString.coordinates[i + 1],\n pt.coordinates\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLineOnLine(\n lineString1: LineString,\n lineString2: LineString,\n ignoreSelfIntersections: boolean\n) {\n const doLinesIntersect = lineIntersect(lineString1, lineString2, {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isLineInPoly(\n polygon: Polygon,\n lineString: LineString,\n ignoreSelfIntersections: boolean\n) {\n for (const coord of lineString.coordinates) {\n if (booleanPointInPolygon(coord, polygon)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(lineString, polygonToLine(polygon), {\n ignoreSelfIntersections,\n });\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Is Polygon (geom1) in Polygon (geom2)\n * Only takes into account outer rings\n * See http://stackoverflow.com/a/4833823/1979085\n *\n * @private\n * @param {Geometry|Feature<Polygon>} feature1 Polygon1\n * @param {Geometry|Feature<Polygon>} feature2 Polygon2\n * @param {boolean} ignoreSelfIntersections ignore self-intersections on input features\n * @returns {boolean} true if geom1 is in geom2, false otherwise\n */\nfunction isPolyInPoly(\n feature1: Polygon,\n feature2: Polygon,\n ignoreSelfIntersections: boolean\n) {\n for (const coord1 of feature1.coordinates[0]) {\n if (booleanPointInPolygon(coord1, feature2)) {\n return true;\n }\n }\n for (const coord2 of feature2.coordinates[0]) {\n if (booleanPointInPolygon(coord2, feature1)) {\n return true;\n }\n }\n const doLinesIntersect = lineIntersect(\n polygonToLine(feature1),\n polygonToLine(feature2),\n { ignoreSelfIntersections }\n );\n if (doLinesIntersect.features.length > 0) {\n return true;\n }\n return false;\n}\n\nfunction isPointOnLineSegment(\n lineSegmentStart: Position,\n lineSegmentEnd: Position,\n pt: Position\n) {\n const dxc = pt[0] - lineSegmentStart[0];\n const dyc = pt[1] - lineSegmentStart[1];\n const dxl = lineSegmentEnd[0] - lineSegmentStart[0];\n const dyl = lineSegmentEnd[1] - lineSegmentStart[1];\n const cross = dxc * dyl - dyc * dxl;\n if (cross !== 0) {\n return false;\n }\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n if (dxl > 0) {\n return lineSegmentStart[0] <= pt[0] && pt[0] <= lineSegmentEnd[0];\n } else {\n return lineSegmentEnd[0] <= pt[0] && pt[0] <= lineSegmentStart[0];\n }\n } else if (dyl > 0) {\n return lineSegmentStart[1] <= pt[1] && pt[1] <= lineSegmentEnd[1];\n } else {\n return lineSegmentEnd[1] <= pt[1] && pt[1] <= lineSegmentStart[1];\n }\n}\n\n/**\n * compareCoords\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {boolean} true if coord pairs match, false otherwise\n */\nfunction compareCoords(pair1: Position, pair2: Position) {\n return pair1[0] === pair2[0] && pair1[1] === pair2[1];\n}\n\nexport { booleanDisjoint };\nexport default booleanDisjoint;\n","import { Feature, Geometry } from \"geojson\";\nimport { booleanDisjoint } from \"@turf/boolean-disjoint\";\nimport { flattenEach } from \"@turf/meta\";\n\n/**\n * Boolean-intersects returns (TRUE) if the intersection of the two geometries is NOT an empty set.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreSelfIntersections=true] ignore self-intersections on input features\n * @returns {boolean} true if geometries intersect, false otherwise\n * @example\n * var point1 = turf.point([2, 2]);\n * var point2 = turf.point([1, 2]);\n * var line = turf.lineString([[1, 1], [1, 3], [1, 4]]);\n *\n * turf.booleanIntersects(line, point1);\n * //=false\n *\n * turf.booleanIntersects(line, point2);\n * //=true\n *\n * //addToMap\n * var addToMap = [point1, point2, line];\n * point1.properties['marker-color'] = '#f00'\n * point2.properties['marker-color'] = '#0f0'\n */\nfunction booleanIntersects(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n {\n ignoreSelfIntersections = true,\n }: {\n ignoreSelfIntersections?: boolean;\n } = {}\n) {\n let bool = false;\n flattenEach(feature1, (flatten1) => {\n flattenEach(feature2, (flatten2) => {\n if (bool === true) {\n return true;\n }\n bool = !booleanDisjoint(flatten1.geometry, flatten2.geometry, {\n ignoreSelfIntersections,\n });\n });\n });\n return bool;\n}\n\nexport { booleanIntersects };\nexport default booleanIntersects;\n","import intersects from '@turf/boolean-intersects';\nimport type {FeatureCollection} from 'geojson';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialFilter} from '../types.js';\n\nexport function geojsonFeatures({\n geojson,\n spatialFilter,\n uniqueIdProperty,\n}: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n uniqueIdProperty?: string;\n}): FeatureData[] {\n let uniqueIdx = 0;\n const map = new Map();\n\n if (!spatialFilter) {\n return [];\n }\n\n for (const feature of geojson.features) {\n const uniqueId = uniqueIdProperty\n ? feature.properties![uniqueIdProperty]\n : ++uniqueIdx;\n if (!map.has(uniqueId) && intersects(spatialFilter, feature)) {\n map.set(uniqueId, feature.properties);\n }\n }\n\n return Array.from(map.values());\n}\n","// math.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */ // radians and degrees are common variable names\n\nimport type {NumericArray} from '@math.gl/types';\n\nimport type {MathArray} from '../classes/base/math-array';\n\nconst RADIANS_TO_DEGREES = (1 / Math.PI) * 180;\nconst DEGREES_TO_RADIANS = (1 / 180) * Math.PI;\n\nexport type ConfigurationOptions = {\n EPSILON: number;\n debug?: boolean;\n precision: number;\n printTypes?: boolean;\n printDegrees?: boolean;\n printRowMajor?: boolean;\n _cartographicRadians?: boolean;\n};\n\nconst DEFAULT_CONFIG: Required<ConfigurationOptions> = {\n EPSILON: 1e-12,\n debug: false,\n precision: 4,\n printTypes: false,\n printDegrees: false,\n printRowMajor: true,\n _cartographicRadians: false\n};\n\n// We use a global field to store the config\ndeclare global {\n // eslint-disable-next-line no-var\n var mathgl: {\n config: Required<ConfigurationOptions>;\n };\n}\n\n// Configuration is truly global as of v3.6 to ensure single config even if multiple copies of math.gl\n// Multiple copies of config can be quite tricky to debug...\nglobalThis.mathgl = globalThis.mathgl || {config: {...DEFAULT_CONFIG}};\n\nexport const config = globalThis.mathgl.config;\n\nexport function configure(options: Partial<ConfigurationOptions>): ConfigurationOptions {\n // Only copy existing keys\n Object.assign(config, options);\n return config;\n}\n\n/**\n * Formats a value into a string\n * @param value\n * @param param1\n * @returns\n */\nexport function formatValue(\n value: number,\n {precision = config.precision}: {precision?: number} = {}\n): string {\n value = round(value);\n // get rid of trailing zeros\n return `${parseFloat(value.toPrecision(precision))}`;\n}\n\n/**\n * Check if value is an \"array\"\n * Returns `true` if value is either an array or a typed array\n * Note: returns `false` for `ArrayBuffer` and `DataView` instances\n * @note isTypedArray and isNumericArray are often more useful in TypeScript\n */\nexport function isArray(value: unknown): boolean {\n return Array.isArray(value) || (ArrayBuffer.isView(value) && !(value instanceof DataView));\n}\n\nexport function clone(array: NumericArray | MathArray): NumericArray {\n return 'clone' in array ? array.clone() : array.slice();\n}\n\nexport function toRadians(degrees: number): number;\nexport function toRadians(degrees: NumericArray): NumericArray;\n\nexport function toRadians(degrees: number | NumericArray): number | NumericArray {\n return radians(degrees as NumericArray);\n}\n\nexport function toDegrees(degrees: number): number;\nexport function toDegrees(degrees: NumericArray): NumericArray;\n\nexport function toDegrees(radians: number | NumericArray): number | NumericArray {\n return degrees(radians as NumericArray);\n}\n\n// GLSL math function equivalents - Works on both single values and vectors\n\n/**\n * \"GLSL equivalent\" radians: Works on single values and vectors\n */\nexport function radians(degrees: number): number;\nexport function radians(degrees: NumericArray, result?: NumericArray): NumericArray;\n\nexport function radians(\n degrees: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(degrees, (degrees) => degrees * DEGREES_TO_RADIANS, result);\n}\n\n/**\n * \"GLSL equivalent\" degrees: Works on single values and vectors\n */\nexport function degrees(radians: number): number;\nexport function degrees(radians: NumericArray, result?: NumericArray): NumericArray;\n\nexport function degrees(\n radians: number | NumericArray,\n result?: NumericArray\n): number | NumericArray {\n return map(radians, (radians) => radians * RADIANS_TO_DEGREES, result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.sin`: Works on single values and vectors\n * @deprecated\n */\nexport function sin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.sin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.cos`: Works on single values and vectors\n * @deprecated\n */\nexport function cos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.cos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.tan`: Works on single values and vectors\n * @deprecated\n */\nexport function tan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.tan(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.asin`: Works on single values and vectors\n * @deprecated\n */\nexport function asin(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.asin(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.acos`: Works on single values and vectors\n * @deprecated\n */\nexport function acos(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.acos(angle), result);\n}\n\n/**\n * \"GLSL equivalent\" of `Math.atan`: Works on single values and vectors\n * @deprecated\n */\nexport function atan(radians: number | NumericArray, result?: NumericArray): number | NumericArray {\n return map(radians, (angle) => Math.atan(angle), result);\n}\n\n/**\n * GLSL style value clamping: Works on single values and vectors\n */\nexport function clamp(value: number, min: number, max: number): number;\nexport function clamp(value: NumericArray, min: number, max: number): NumericArray;\n\nexport function clamp(\n value: number | NumericArray,\n min: number,\n max: number\n): number | NumericArray {\n return map(value, (value) => Math.max(min, Math.min(max, value)));\n}\n\n/**\n * Interpolate between two numbers or two arrays\n */\nexport function lerp(a: number, b: number, t: number): number;\nexport function lerp(a: NumericArray, b: NumericArray, t: number): NumericArray;\n\nexport function lerp(\n a: number | NumericArray,\n b: number | NumericArray,\n t: number\n): number | NumericArray {\n if (isArray(a)) {\n return (a as NumericArray).map((ai: number, i: number) => lerp(ai, (b as NumericArray)[i], t));\n }\n return t * (b as number) + (1 - t) * (a as number);\n}\n\n/* eslint-disable */\n\n/**\n * Compares any two math objects, using `equals` method if available.\n * @param a\n * @param b\n * @param epsilon\n * @returns\n */\nexport function equals(a: any, b: any, epsilon?: number): boolean {\n const oldEpsilon = config.EPSILON;\n if (epsilon) {\n config.EPSILON = epsilon;\n }\n try {\n if (a === b) {\n return true;\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n // eslint-disable-next-line max-depth\n if (!equals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n if (a && a.equals) {\n return a.equals(b);\n }\n if (b && b.equals) {\n return b.equals(a);\n }\n if (typeof a === 'number' && typeof b === 'number') {\n return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n }\n return false;\n } finally {\n config.EPSILON = oldEpsilon;\n }\n}\n\nexport function exactEquals(a: any, b: any): boolean {\n if (a === b) {\n return true;\n }\n if (a && typeof a === 'object' && b && typeof b === 'object') {\n if (a.constructor !== b.constructor) {\n return false;\n }\n if (a.exactEquals) {\n return a.exactEquals(b);\n }\n }\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; ++i) {\n if (!exactEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\n/* eslint-enable */\n\nexport function withEpsilon<T>(epsilon: number, func: () => T): T {\n const oldPrecision = config.EPSILON;\n config.EPSILON = epsilon;\n let value: T;\n try {\n value = func();\n } finally {\n config.EPSILON = oldPrecision;\n }\n return value;\n}\n\n// HELPERS\n\nfunction round(value: number): number {\n return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\n// If the array has a clone function, calls it, otherwise returns a copy\nfunction duplicateArray(array: NumericArray): NumericArray {\n // @ts-expect-error We check for math.gl class methods\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return array.clone ? (array.clone() as NumericArray) : (new Array(array.length) as number[]);\n}\n\n// If the argument value is an array, applies the func element wise,\n// otherwise applies func to the argument value\nfunction map(\n value: number | NumericArray,\n func: (x: number, index?: number, resultArray?: NumericArray) => number,\n result?: NumericArray\n): number | NumericArray {\n if (isArray(value)) {\n const array = value as NumericArray;\n result = result || duplicateArray(array);\n for (let i = 0; i < result.length && i < array.length; ++i) {\n const val = typeof value === 'number' ? value : value[i];\n result[i] = func(val, i, result);\n }\n return result;\n }\n return func(value as number);\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: unknown, message?: string): void {\n if (!condition) {\n throw new Error(message || '@math.gl/web-mercator: assertion failed.');\n }\n}\n","// TODO - THE UTILITIES IN THIS FILE SHOULD BE IMPORTED FROM WEB-MERCATOR-VIEWPORT MODULE\n\nimport {createMat4, transformVector, clamp, log2} from './math-utils';\n\nimport {mat4, vec2, vec3} from '@math.gl/core';\nimport {assert} from './assert';\n\n// CONSTANTS\nconst PI = Math.PI;\nconst PI_4 = PI / 4;\nconst DEGREES_TO_RADIANS = PI / 180;\nconst RADIANS_TO_DEGREES = 180 / PI;\nconst TILE_SIZE = 512;\n// Average circumference (40075 km equatorial, 40007 km meridional)\nconst EARTH_CIRCUMFERENCE = 40.03e6;\n// Latitude that makes a square world, 2 * atan(E ** PI) - PI / 2\nexport const MAX_LATITUDE = 85.051129;\n\n// Mapbox default altitude\nexport const DEFAULT_ALTITUDE = 1.5;\n\nexport type DistanceScales = {\n unitsPerMeter: number[];\n metersPerUnit: number[];\n unitsPerMeter2?: number[];\n unitsPerDegree: number[];\n degreesPerUnit: number[];\n unitsPerDegree2?: number[];\n};\n\n/**\n * PROJECTION MATRIX PARAMETERS\n *\n * TODO how to document mebers\n * @param fov in radians. fov is variable, depends on pitch and altitude\n * @param aspect width/height\n * @param focalDistance distance at which visual scale factor is 1\n * @param near near clipping plane\n * @param far far clipping plane\n */\ntype ProjectionParameters = {\n fov: number;\n aspect: number;\n focalDistance: number;\n near: number;\n far: number;\n};\n\n/** Logarithimic zoom to linear scale **/\nexport function zoomToScale(zoom: number): number {\n return Math.pow(2, zoom);\n}\n\n/** Linear scale to logarithimic zoom **/\nexport function scaleToZoom(scale: number): number {\n return log2(scale);\n}\n\n/**\n * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n * Performs the nonlinear part of the web mercator projection.\n * Remaining projection is done with 4x4 matrices which also handles\n * perspective.\n *\n * @param lngLat - [lng, lat] coordinates\n * Specifies a point on the sphere to project onto the map.\n * @return [x,y] coordinates.\n */\nexport function lngLatToWorld(lngLat: number[]): [number, number] {\n const [lng, lat] = lngLat;\n assert(Number.isFinite(lng));\n assert(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n\n const lambda2 = lng * DEGREES_TO_RADIANS;\n const phi2 = lat * DEGREES_TO_RADIANS;\n const x = (TILE_SIZE * (lambda2 + PI)) / (2 * PI);\n const y = (TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5)))) / (2 * PI);\n return [x, y];\n}\n\n/**\n * Unproject world point [x,y] on map onto {lat, lon} on sphere\n *\n * @param xy - array with [x,y] members\n * representing point on projected map plane\n * @return - array with [x,y] of point on sphere.\n * Has toArray method if you need a GeoJSON Array.\n * Per cartographic tradition, lat and lon are specified as degrees.\n */\nexport function worldToLngLat(xy: number[]): [number, number] {\n const [x, y] = xy;\n const lambda2 = (x / TILE_SIZE) * (2 * PI) - PI;\n const phi2 = 2 * (Math.atan(Math.exp((y / TILE_SIZE) * (2 * PI) - PI)) - PI_4);\n return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\n\n/**\n * Returns the zoom level that gives a 1 meter pixel at a certain latitude\n * 1 = C*cos(y)/2^z/TILE_SIZE = C*cos(y)/2^(z+9)\n */\nexport function getMeterZoom(options: {latitude: number}): number {\n const {latitude} = options;\n assert(Number.isFinite(latitude));\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\n\n/**\n * Calculate the conversion from meter to common units at a given latitude\n * This is a cheaper version of `getDistanceScales`\n * @param latitude center latitude in degrees\n * @returns common units per meter\n */\nexport function unitsPerMeter(latitude: number): number {\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n return TILE_SIZE / EARTH_CIRCUMFERENCE / latCosine;\n}\n\n/**\n * Calculate distance scales in meters around current lat/lon, both for\n * degrees and pixels.\n * In mercator projection mode, the distance scales vary significantly\n * with latitude.\n */\nexport function getDistanceScales(options: {\n latitude: number;\n longitude: number;\n highPrecision?: boolean;\n}): DistanceScales {\n const {latitude, longitude, highPrecision = false} = options;\n assert(Number.isFinite(latitude) && Number.isFinite(longitude));\n\n const worldSize = TILE_SIZE;\n const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n\n /**\n * Number of pixels occupied by one degree longitude around current lat/lon:\n unitsPerDegreeX = d(lngLatToWorld([lng, lat])[0])/d(lng)\n = scale * TILE_SIZE * DEGREES_TO_RADIANS / (2 * PI)\n unitsPerDegreeY = d(lngLatToWorld([lng, lat])[1])/d(lat)\n = -scale * TILE_SIZE * DEGREES_TO_RADIANS / cos(lat * DEGREES_TO_RADIANS) / (2 * PI)\n */\n const unitsPerDegreeX = worldSize / 360;\n const unitsPerDegreeY = unitsPerDegreeX / latCosine;\n\n /**\n * Number of pixels occupied by one meter around current lat/lon:\n */\n const altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n\n /**\n * LngLat: longitude -> east and latitude -> north (bottom left)\n * UTM meter offset: x -> east and y -> north (bottom left)\n * World space: x -> east and y -> south (top left)\n *\n * Y needs to be flipped when converting delta degree/meter to delta pixels\n */\n const result: DistanceScales = {\n unitsPerMeter: [altUnitsPerMeter, altUnitsPerMeter, altUnitsPerMeter],\n metersPerUnit: [1 / altUnitsPerMeter, 1 / altUnitsPerMeter, 1 / altUnitsPerMeter],\n\n unitsPerDegree: [unitsPerDegreeX, unitsPerDegreeY, altUnitsPerMeter],\n degreesPerUnit: [1 / unitsPerDegreeX, 1 / unitsPerDegreeY, 1 / altUnitsPerMeter]\n };\n\n /**\n * Taylor series 2nd order for 1/latCosine\n f'(a) * (x - a)\n = d(1/cos(lat * DEGREES_TO_RADIANS))/d(lat) * dLat\n = DEGREES_TO_RADIANS * tan(lat * DEGREES_TO_RADIANS) / cos(lat * DEGREES_TO_RADIANS) * dLat\n */\n if (highPrecision) {\n const latCosine2 = (DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS)) / latCosine;\n const unitsPerDegreeY2 = (unitsPerDegreeX * latCosine2) / 2;\n const altUnitsPerDegree2 = (worldSize / EARTH_CIRCUMFERENCE) * latCosine2;\n const altUnitsPerMeter2 = (altUnitsPerDegree2 / unitsPerDegreeY) * altUnitsPerMeter;\n\n result.unitsPerDegree2 = [0, unitsPerDegreeY2, altUnitsPerDegree2];\n result.unitsPerMeter2 = [altUnitsPerMeter2, 0, altUnitsPerMeter2];\n }\n\n // Main results, used for converting meters to latlng deltas and scaling offsets\n return result;\n}\n\n/**\n * Offset a lng/lat position by meterOffset (northing, easting)\n */\nexport function addMetersToLngLat(lngLatZ: number[], xyz: number[]): number[] {\n const [longitude, latitude, z0] = lngLatZ;\n const [x, y, z] = xyz;\n\n // eslint-disable-next-line no-shadow\n const {unitsPerMeter, unitsPerMeter2} = getDistanceScales({\n longitude,\n latitude,\n highPrecision: true\n });\n\n const worldspace = lngLatToWorld(lngLatZ);\n worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n\n const newLngLat = worldToLngLat(worldspace);\n const newZ = (z0 || 0) + (z || 0);\n\n return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\n\n/**\n *\n * view and projection matrix creation is intentionally kept compatible with\n * mapbox-gl's implementation to ensure that seamless interoperation\n * with mapbox and react-map-gl. See: https://github.com/mapbox/mapbox-gl-js\n */\nexport function getViewMatrix(options: {\n // Viewport props\n height: number;\n pitch: number;\n bearing: number;\n altitude: number;\n // Pre-calculated parameters\n scale: number;\n center?: number[];\n}): number[] {\n const {\n // Viewport props\n height,\n pitch,\n bearing,\n altitude,\n // Pre-calculated parameters\n scale,\n center\n } = options;\n // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES\n // Note that mercator world coordinates typically need to be flipped\n //\n // Note: As usual, matrix operation orders should be read in reverse\n // since vectors will be multiplied from the right during transformation\n const vm = createMat4();\n\n // Move camera to altitude (along the pitch & bearing direction)\n mat4.translate(vm, vm, [0, 0, -altitude]);\n\n // Rotate by bearing, and then by pitch (which tilts the view)\n mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n\n const relativeScale = scale / height;\n mat4.scale(vm, vm, [relativeScale, relativeScale, relativeScale]);\n\n if (center) {\n mat4.translate(vm, vm, vec3.negate([], center));\n }\n\n return vm;\n}\n\n/**\n * Calculates mapbox compatible projection matrix from parameters\n *\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns project parameters object\n */\nexport function getProjectionParameters(options: {\n width: number;\n height: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n pitch?: number;\n nearZMultiplier?: number;\n farZMultiplier?: number;\n}): ProjectionParameters {\n const {\n width,\n height,\n altitude,\n pitch = 0,\n offset,\n center,\n scale,\n nearZMultiplier = 1,\n farZMultiplier = 1\n } = options;\n let {fovy = altitudeToFovy(DEFAULT_ALTITUDE)} = options;\n\n // For back-compatibility allow field of view to be\n // derived from altitude\n if (altitude !== undefined) {\n fovy = altitudeToFovy(altitude);\n }\n\n const fovRadians = fovy * DEGREES_TO_RADIANS;\n const pitchRadians = pitch * DEGREES_TO_RADIANS;\n\n // Distance from camera to the target\n const focalDistance = fovyToAltitude(fovy);\n\n let cameraToSeaLevelDistance = focalDistance;\n\n if (center) {\n cameraToSeaLevelDistance += (center[2] * scale) / Math.cos(pitchRadians) / height;\n }\n\n const fovAboveCenter = fovRadians * (0.5 + (offset ? offset[1] : 0) / height);\n\n // Find the distance from the center point to the center top\n // in focal distance units using law of sines.\n const topHalfSurfaceDistance =\n (Math.sin(fovAboveCenter) * cameraToSeaLevelDistance) /\n Math.sin(clamp(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));\n\n // Calculate z distance of the farthest fragment that should be rendered.\n const furthestDistance =\n Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;\n // Matches mapbox limit\n const horizonDistance = cameraToSeaLevelDistance * 10;\n\n // Calculate z value of the farthest fragment that should be rendered.\n const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);\n\n return {\n fov: fovRadians,\n aspect: width / height,\n focalDistance,\n near: nearZMultiplier,\n far: farZ\n };\n}\n\n/**\n * CALCULATE PROJECTION MATRIX: PROJECTS FROM CAMERA (VIEW) SPACE TO CLIPSPACE\n *\n * To match mapbox's z buffer:\n * - \\<= 0.28: nearZMultiplier: 0.1, farZmultiplier: 1\n * - \\>= 0.29: nearZMultiplier: 1 / height, farZMultiplier: 1.01\n *\n * @param options Viewport options\n * @param options.width Width of \"viewport\" or window\n * @param options.height Height of \"viewport\" or window\n * @param options.scale Scale at the current zoom\n * @param options.center Offset of the target, vec3 in world space\n * @param options.offset Offset of the focal point, vec2 in screen space\n * @param options.pitch Camera angle in degrees (0 is straight down)\n * @param options.fovy field of view in degrees\n * @param options.altitude if provided, field of view is calculated using `altitudeToFovy()`\n * @param options.nearZMultiplier control z buffer\n * @param options.farZMultiplier control z buffer\n * @returns 4x4 projection matrix\n */\nexport function getProjectionMatrix(options: {\n width: number;\n height: number;\n pitch: number;\n scale?: number;\n center?: number[];\n offset?: [number, number];\n fovy?: number;\n altitude?: number;\n nearZMultiplier: number;\n farZMultiplier: number;\n}): number[] {\n const {fov, aspect, near, far} = getProjectionParameters(options);\n\n const projectionMatrix = mat4.perspective(\n [] as number[],\n fov, // fov in radians\n aspect, // aspect ratio\n near, // near plane\n far // far plane\n );\n\n return projectionMatrix;\n}\n\n/**\n *\n * Convert an altitude to field of view such that the\n * focal distance is equal to the altitude\n *\n * @param altitude - altitude of camera in screen units\n * @return fovy field of view in degrees\n */\nexport function altitudeToFovy(altitude: number): number {\n return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\n\n/**\n *\n * Convert an field of view such that the\n * focal distance is equal to the altitude\n *\n * @param fovy - field of view in degrees\n * @return altitude altitude of camera in screen units\n */\nexport function fovyToAltitude(fovy: number): number {\n return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\n\n/**\n * Project flat coordinates to pixels on screen.\n *\n * @param xyz - flat coordinate on 512*512 Mercator Zoom 0 tile\n * @param pixelProjectionMatrix - projection matrix 4x4\n * @return [x, y, depth] pixel coordinate on screen.\n */\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[];\n\n// Project flat coordinates to pixels on screen.\nexport function worldToPixels(xyz: number[], pixelProjectionMatrix: number[]): number[] {\n const [x, y, z = 0] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n\n return transformVector(pixelProjectionMatrix, [x, y, z, 1]);\n}\n\n/**\n * Unproject pixels on screen to flat coordinates.\n *\n * @param xyz - pixel coordinate on screen.\n * @param pixelUnprojectionMatrix - unprojection matrix 4x4\n * @param targetZ - if pixel coordinate does not have a 3rd component (depth),\n * targetZ is used as the elevation plane to unproject onto\n * @return [x, y, Z] flat coordinates on 512*512 Mercator Zoom 0 tile.\n */\nexport function pixelsToWorld(\n xyz: number[],\n pixelUnprojectionMatrix: number[],\n targetZ: number = 0\n): number[] {\n const [x, y, z] = xyz;\n assert(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n if (Number.isFinite(z)) {\n // Has depth component\n const coord = transformVector(pixelUnprojectionMatrix, [x, y, z, 1]);\n return coord;\n }\n\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that line with z=0\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, y, 0, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, y, 1, 1]);\n\n const z0 = coord0[2];\n const z1 = coord1[2];\n\n const t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n return vec2.lerp([] as number[], coord0, coord1, t);\n}\n","/* eslint-disable camelcase */\nimport {vec2} from '@math.gl/core';\nimport type {WebMercatorViewport} from './web-mercator-viewport';\nimport {worldToLngLat} from './web-mercator-utils';\nimport {transformVector} from './math-utils';\n\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\n/*\n * Returns the quad at the intersection of the frustum and the given z plane\n * @param {WebMercatorViewport} viewport\n * @param {Number} z - elevation in meters\n */\nexport function getBounds(viewport: WebMercatorViewport, z: number = 0): number[][] {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {width, height, unproject} = viewport;\n const unprojectOps = {targetZ: z};\n const bottomLeft = unproject([0, height], unprojectOps);\n const bottomRight = unproject([width, height], unprojectOps);\n let topLeft: number[];\n let topRight: number[];\n\n const halfFov = viewport.fovy\n ? 0.5 * viewport.fovy * DEGREES_TO_RADIANS\n : Math.atan(0.5 / viewport.altitude);\n const angleToGround = (90 - viewport.pitch) * DEGREES_TO_RADIANS;\n // The top plane is parallel to the ground if halfFov == angleToGround\n if (halfFov > angleToGround - 0.01) {\n // intersect with the far plane\n topLeft = unprojectOnFarPlane(viewport, 0, z);\n topRight = unprojectOnFarPlane(viewport, width, z);\n } else {\n // intersect with the top plane\n topLeft = unproject([0, 0], unprojectOps);\n topRight = unproject([width, 0], unprojectOps);\n }\n\n return [bottomLeft, bottomRight, topRight, topLeft];\n}\n\n/*\n * Find a point on the far clipping plane of the viewport\n * @param {WebMercatorViewport} viewport\n * @param {Number} x - projected x in screen space\n * @param {Number} targetZ - the elevation of the point in meters\n */\nfunction unprojectOnFarPlane(viewport: WebMercatorViewport, x: number, targetZ: number): number[] {\n const {pixelUnprojectionMatrix} = viewport;\n const coord0 = transformVector(pixelUnprojectionMatrix, [x, 0, 1, 1]);\n const coord1 = transformVector(pixelUnprojectionMatrix, [x, viewport.height, 1, 1]);\n\n const z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n const t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n const coord = vec2.lerp([], coord0, coord1, t);\n\n const result = worldToLngLat(coord);\n result.push(targetZ);\n return result;\n}\n","import {lerp} from '@math.gl/core';\nimport {lngLatToWorld, worldToLngLat} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform tile coords to WGS84 coordinates.\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformTileCoordsToWGS84<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = lngLatToWorld([west, north]);\n const se = lngLatToWorld([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = lerp(nw[0], se[0], pointX);\n const y = lerp(nw[1], se[1], pointY);\n\n return worldToLngLat([x, y]);\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(g, bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n","import { BBox, Feature, Polygon, GeoJsonProperties } from \"geojson\";\nimport { polygon, Id } from \"@turf/helpers\";\n\n/**\n * Takes a bbox and returns an equivalent {@link Polygon|polygon}.\n *\n * @function\n * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @param {Object} [options={}] Optional parameters\n * @param {GeoJsonProperties} [options.properties={}] Translate properties to Polygon\n * @param {string|number} [options.id={}] Translate Id to Polygon\n * @returns {Feature<Polygon>} a Polygon representation of the bounding box\n * @example\n * var bbox = [0, 0, 10, 10];\n *\n * var poly = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [poly]\n */\nfunction bboxPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n bbox: BBox,\n options: {\n properties?: P;\n id?: Id;\n } = {}\n): Feature<Polygon, P> {\n // Convert BBox positions to Numbers\n // No performance loss for including Number()\n // https://github.com/Turfjs/turf/issues/1119\n const west = Number(bbox[0]);\n const south = Number(bbox[1]);\n const east = Number(bbox[2]);\n const north = Number(bbox[3]);\n\n if (bbox.length === 6) {\n throw new Error(\n \"@turf/bbox-polygon does not support BBox with 6 positions\"\n );\n }\n\n const lowLeft = [west, south];\n const topLeft = [west, north];\n const topRight = [east, north];\n const lowRight = [east, south];\n\n return polygon(\n [[lowLeft, lowRight, topRight, topLeft, lowLeft]],\n options.properties,\n { bbox, id: options.id }\n );\n}\n\nexport { bboxPolygon };\nexport default bboxPolygon;\n","import { BBox } from \"geojson\";\nimport { AllGeoJSON } from \"@turf/helpers\";\nimport { coordEach } from \"@turf/meta\";\n\n/**\n * Calculates the bounding box for any GeoJSON object, including FeatureCollection.\n * Uses geojson.bbox if available and options.recompute is not set.\n *\n * @function\n * @param {GeoJSON} geojson any GeoJSON object\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.recompute] Whether to ignore an existing bbox property on geojson\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(\n geojson: AllGeoJSON,\n options: {\n recompute?: boolean;\n } = {}\n): BBox {\n if (geojson.bbox != null && true !== options.recompute) {\n return geojson.bbox;\n }\n const result: BBox = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, (coord) => {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\n\nexport { bbox };\nexport default bbox;\n","import { Feature, LineString } from \"geojson\";\nimport { Coord } from \"@turf/helpers\";\nimport { getCoord, getCoords } from \"@turf/invariant\";\n\n/**\n * Returns true if a point is on a line. Accepts a optional parameter to ignore the\n * start and end vertices of the linestring.\n *\n * @function\n * @param {Coord} pt GeoJSON Point\n * @param {Feature<LineString>} line GeoJSON LineString\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.ignoreEndVertices=false] whether to ignore the start and end vertices.\n * @param {number} [options.epsilon] Fractional number to compare with the cross product result. Useful for dealing with floating points such as lng/lat points\n * @returns {boolean} true/false\n * @example\n * var pt = turf.point([0, 0]);\n * var line = turf.lineString([[-1, -1],[1, 1],[1.5, 2.2]]);\n * var isPointOnLine = turf.booleanPointOnLine(pt, line);\n * //=true\n */\nfunction booleanPointOnLine(\n pt: Coord,\n line: Feature<LineString> | LineString,\n options: {\n ignoreEndVertices?: boolean;\n epsilon?: number;\n } = {}\n): boolean {\n // Normalize inputs\n const ptCoords = getCoord(pt);\n const lineCoords = getCoords(line);\n\n // Main\n for (let i = 0; i < lineCoords.length - 1; i++) {\n let ignoreBoundary: boolean | string = false;\n if (options.ignoreEndVertices) {\n if (i === 0) {\n ignoreBoundary = \"start\";\n }\n if (i === lineCoords.length - 2) {\n ignoreBoundary = \"end\";\n }\n if (i === 0 && i + 1 === lineCoords.length - 1) {\n ignoreBoundary = \"both\";\n }\n }\n if (\n isPointOnLineSegment(\n lineCoords[i],\n lineCoords[i + 1],\n ptCoords,\n ignoreBoundary,\n typeof options.epsilon === \"undefined\" ? null : options.epsilon\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\n// See http://stackoverflow.com/a/4833823/1979085\n// See https://stackoverflow.com/a/328122/1048847\n/**\n * @private\n * @param {Position} lineSegmentStart coord pair of start of line\n * @param {Position} lineSegmentEnd coord pair of end of line\n * @param {Position} pt coord pair of point to check\n * @param {boolean|string} excludeBoundary whether the point is allowed to fall on the line ends.\n * @param {number} epsilon Fractional number to compare with the cross product result. Useful for dealing with floating points such as lng/lat points\n * If true which end to ignore.\n * @returns {boolean} true/false\n */\nfunction isPointOnLineSegment(\n lineSegmentStart: number[],\n lineSegmentEnd: number[],\n pt: number[],\n excludeBoundary: string | boolean,\n epsilon: number | null\n): boolean {\n const x = pt[0];\n const y = pt[1];\n const x1 = lineSegmentStart[0];\n const y1 = lineSegmentStart[1];\n const x2 = lineSegmentEnd[0];\n const y2 = lineSegmentEnd[1];\n const dxc = pt[0] - x1;\n const dyc = pt[1] - y1;\n const dxl = x2 - x1;\n const dyl = y2 - y1;\n const cross = dxc * dyl - dyc * dxl;\n if (epsilon !== null) {\n if (Math.abs(cross) > epsilon) {\n return false;\n }\n } else if (cross !== 0) {\n return false;\n }\n\n // Special cases for zero length lines\n // https://github.com/Turfjs/turf/issues/2750\n if (Math.abs(dxl) === Math.abs(dyl) && Math.abs(dxl) === 0) {\n // Zero length line.\n if (excludeBoundary) {\n // To be on a zero length line pt has to be on the start (and end), BUT we\n // are excluding start and end from possible matches.\n return false;\n }\n if (pt[0] === lineSegmentStart[0] && pt[1] === lineSegmentStart[1]) {\n // If point is same as start (and end) it's on the line segment\n return true;\n } else {\n // Otherwise point is somewhere else\n return false;\n }\n }\n\n if (!excludeBoundary) {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 <= x && x <= x2 : x2 <= x && x <= x1;\n }\n return dyl > 0 ? y1 <= y && y <= y2 : y2 <= y && y <= y1;\n } else if (excludeBoundary === \"start\") {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 < x && x <= x2 : x2 <= x && x < x1;\n }\n return dyl > 0 ? y1 < y && y <= y2 : y2 <= y && y < y1;\n } else if (excludeBoundary === \"end\") {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 <= x && x < x2 : x2 < x && x <= x1;\n }\n return dyl > 0 ? y1 <= y && y < y2 : y2 < y && y <= y1;\n } else if (excludeBoundary === \"both\") {\n if (Math.abs(dxl) >= Math.abs(dyl)) {\n return dxl > 0 ? x1 < x && x < x2 : x2 < x && x < x1;\n }\n return dyl > 0 ? y1 < y && y < y2 : y2 < y && y < y1;\n }\n return false;\n}\n\nexport { booleanPointOnLine };\nexport default booleanPointOnLine;\n","import {\n BBox,\n Feature,\n Geometry,\n LineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { bbox as calcBbox } from \"@turf/bbox\";\nimport { booleanPointOnLine } from \"@turf/boolean-point-on-line\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Boolean-within returns true if the first geometry is completely within the second geometry.\n * The interiors of both geometries must intersect and, the interior and boundary of the primary (geometry a)\n * must not intersect the exterior of the secondary (geometry b).\n * Boolean-within returns the exact opposite result of the `@turf/boolean-contains`.\n *\n * @function\n * @param {Geometry|Feature<any>} feature1 GeoJSON Feature or Geometry\n * @param {Geometry|Feature<any>} feature2 GeoJSON Feature or Geometry\n * @returns {boolean} true/false\n * @example\n * var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);\n * var point = turf.point([1, 2]);\n *\n * turf.booleanWithin(point, line);\n * //=true\n */\nfunction booleanWithin(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry\n): boolean {\n var geom1 = getGeom(feature1);\n var geom2 = getGeom(feature2);\n var type1 = geom1.type;\n var type2 = geom2.type;\n\n switch (type1) {\n case \"Point\":\n switch (type2) {\n case \"MultiPoint\":\n return isPointInMultiPoint(geom1, geom2);\n case \"LineString\":\n return booleanPointOnLine(geom1, geom2, { ignoreEndVertices: true });\n case \"Polygon\":\n case \"MultiPolygon\":\n return booleanPointInPolygon(geom1, geom2, { ignoreBoundary: true });\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n case \"MultiPoint\":\n switch (type2) {\n case \"MultiPoint\":\n return isMultiPointInMultiPoint(geom1, geom2);\n case \"LineString\":\n return isMultiPointOnLine(geom1, geom2);\n case \"Polygon\":\n case \"MultiPolygon\":\n return isMultiPointInPoly(geom1, geom2);\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n case \"LineString\":\n switch (type2) {\n case \"LineString\":\n return isLineOnLine(geom1, geom2);\n case \"Polygon\":\n case \"MultiPolygon\":\n return isLineInPoly(geom1, geom2);\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n case \"Polygon\":\n switch (type2) {\n case \"Polygon\":\n case \"MultiPolygon\":\n return isPolyInPoly(geom1, geom2);\n default:\n throw new Error(\"feature2 \" + type2 + \" geometry not supported\");\n }\n default:\n throw new Error(\"feature1 \" + type1 + \" geometry not supported\");\n }\n}\n\nfunction isPointInMultiPoint(point: Point, multiPoint: MultiPoint) {\n var i;\n var output = false;\n for (i = 0; i < multiPoint.coordinates.length; i++) {\n if (compareCoords(multiPoint.coordinates[i], point.coordinates)) {\n output = true;\n break;\n }\n }\n return output;\n}\n\nfunction isMultiPointInMultiPoint(\n multiPoint1: MultiPoint,\n multiPoint2: MultiPoint\n) {\n for (var i = 0; i < multiPoint1.coordinates.length; i++) {\n var anyMatch = false;\n for (var i2 = 0; i2 < multiPoint2.coordinates.length; i2++) {\n if (\n compareCoords(multiPoint1.coordinates[i], multiPoint2.coordinates[i2])\n ) {\n anyMatch = true;\n }\n }\n if (!anyMatch) {\n return false;\n }\n }\n return true;\n}\n\nfunction isMultiPointOnLine(multiPoint: MultiPoint, lineString: LineString) {\n var foundInsidePoint = false;\n\n for (var i = 0; i < multiPoint.coordinates.length; i++) {\n if (!booleanPointOnLine(multiPoint.coordinates[i], lineString)) {\n return false;\n }\n if (!foundInsidePoint) {\n foundInsidePoint = booleanPointOnLine(\n multiPoint.coordinates[i],\n lineString,\n { ignoreEndVertices: true }\n );\n }\n }\n return foundInsidePoint;\n}\n\nfunction isMultiPointInPoly(multiPoint: MultiPoint, polygon: Polygon) {\n var output = true;\n var oneInside = false;\n var isInside = false;\n for (var i = 0; i < multiPoint.coordinates.length; i++) {\n isInside = booleanPointInPolygon(multiPoint.coordinates[i], polygon);\n if (!isInside) {\n output = false;\n break;\n }\n if (!oneInside) {\n isInside = booleanPointInPolygon(multiPoint.coordinates[i], polygon, {\n ignoreBoundary: true,\n });\n }\n }\n return output && isInside;\n}\n\nfunction isLineOnLine(lineString1: LineString, lineString2: LineString) {\n for (var i = 0; i < lineString1.coordinates.length; i++) {\n if (!booleanPointOnLine(lineString1.coordinates[i], lineString2)) {\n return false;\n }\n }\n return true;\n}\n\nfunction isLineInPoly(linestring: LineString, polygon: Polygon) {\n var polyBbox = calcBbox(polygon);\n var lineBbox = calcBbox(linestring);\n if (!doBBoxOverlap(polyBbox, lineBbox)) {\n return false;\n }\n var foundInsidePoint = false;\n\n for (var i = 0; i < linestring.coordinates.length; i++) {\n if (!booleanPointInPolygon(linestring.coordinates[i], polygon)) {\n return false;\n }\n if (!foundInsidePoint) {\n foundInsidePoint = booleanPointInPolygon(\n linestring.coordinates[i],\n polygon,\n { ignoreBoundary: true }\n );\n }\n if (!foundInsidePoint && i < linestring.coordinates.length - 1) {\n var midpoint = getMidpoint(\n linestring.coordinates[i],\n linestring.coordinates[i + 1]\n );\n foundInsidePoint = booleanPointInPolygon(midpoint, polygon, {\n ignoreBoundary: true,\n });\n }\n }\n return foundInsidePoint;\n}\n\n/**\n * Is Polygon2 in Polygon1\n * Only takes into account outer rings\n *\n * @private\n * @param {Polygon} geometry1\n * @param {Polygon|MultiPolygon} geometry2\n * @returns {boolean} true/false\n */\nfunction isPolyInPoly(geometry1: Polygon, geometry2: Polygon | MultiPolygon) {\n var poly1Bbox = calcBbox(geometry1);\n var poly2Bbox = calcBbox(geometry2);\n if (!doBBoxOverlap(poly2Bbox, poly1Bbox)) {\n return false;\n }\n for (var i = 0; i < geometry1.coordinates[0].length; i++) {\n if (!booleanPointInPolygon(geometry1.coordinates[0][i], geometry2)) {\n return false;\n }\n }\n return true;\n}\n\nfunction doBBoxOverlap(bbox1: BBox, bbox2: BBox) {\n if (bbox1[0] > bbox2[0]) return false;\n if (bbox1[2] < bbox2[2]) return false;\n if (bbox1[1] > bbox2[1]) return false;\n if (bbox1[3] < bbox2[3]) return false;\n return true;\n}\n\n/**\n * compareCoords\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {boolean} true/false if coord pairs match\n */\nfunction compareCoords(pair1: number[], pair2: number[]) {\n return pair1[0] === pair2[0] && pair1[1] === pair2[1];\n}\n\n/**\n * getMidpoint\n *\n * @private\n * @param {Position} pair1 point [x,y]\n * @param {Position} pair2 point [x,y]\n * @returns {Position} midpoint of pair1 and pair2\n */\nfunction getMidpoint(pair1: number[], pair2: number[]) {\n return [(pair1[0] + pair2[0]) / 2, (pair1[1] + pair2[1]) / 2];\n}\n\nexport { booleanWithin };\nexport default booleanWithin;\n","/*\r\n * bignumber.js v9.1.2\r\n * A JavaScript library for arbitrary-precision arithmetic.\r\n * https://github.com/MikeMcl/bignumber.js\r\n * Copyright (c) 2022 Michael Mclaughlin <M8ch88l@gmail.com>\r\n * MIT Licensed.\r\n *\r\n * BigNumber.prototype methods | BigNumber methods\r\n * |\r\n * absoluteValue abs | clone\r\n * comparedTo | config set\r\n * decimalPlaces dp | DECIMAL_PLACES\r\n * dividedBy div | ROUNDING_MODE\r\n * dividedToIntegerBy idiv | EXPONENTIAL_AT\r\n * exponentiatedBy pow | RANGE\r\n * integerValue | CRYPTO\r\n * isEqualTo eq | MODULO_MODE\r\n * isFinite | POW_PRECISION\r\n * isGreaterThan gt | FORMAT\r\n * isGreaterThanOrEqualTo gte | ALPHABET\r\n * isInteger | isBigNumber\r\n * isLessThan lt | maximum max\r\n * isLessThanOrEqualTo lte | minimum min\r\n * isNaN | random\r\n * isNegative | sum\r\n * isPositive |\r\n * isZero |\r\n * minus |\r\n * modulo mod |\r\n * multipliedBy times |\r\n * negated |\r\n * plus |\r\n * precision sd |\r\n * shiftedBy |\r\n * squareRoot sqrt |\r\n * toExponential |\r\n * toFixed |\r\n * toFormat |\r\n * toFraction |\r\n * toJSON |\r\n * toNumber |\r\n * toPrecision |\r\n * toString |\r\n * valueOf |\r\n *\r\n */\r\n\r\n\r\nvar\r\n isNumeric = /^-?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i,\r\n mathceil = Math.ceil,\r\n mathfloor = Math.floor,\r\n\r\n bignumberError = '[BigNumber Error] ',\r\n tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ',\r\n\r\n BASE = 1e14,\r\n LOG_BASE = 14,\r\n MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1\r\n // MAX_INT32 = 0x7fffffff, // 2^31 - 1\r\n POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\r\n SQRT_BASE = 1e7,\r\n\r\n // EDITABLE\r\n // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\r\n // the arguments to toExponential, toFixed, toFormat, and toPrecision.\r\n MAX = 1E9; // 0 to MAX_INT32\r\n\r\n\r\n/*\r\n * Create and return a BigNumber constructor.\r\n */\r\nfunction clone(configObject) {\r\n var div, convertBase, parseNumeric,\r\n P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null },\r\n ONE = new BigNumber(1),\r\n\r\n\r\n //----------------------------- EDITABLE CONFIG DEFAULTS -------------------------------\r\n\r\n\r\n // The default values below must be integers within the inclusive ranges stated.\r\n // The values can also be changed at run-time using BigNumber.set.\r\n\r\n // The maximum number of decimal places for operations involving division.\r\n DECIMAL_PLACES = 20, // 0 to MAX\r\n\r\n // The rounding mode used when rounding to the above decimal places, and when using\r\n // toExponential, toFixed, toFormat and toPrecision, and round (default value).\r\n // UP 0 Away from zero.\r\n // DOWN 1 Towards zero.\r\n // CEIL 2 Towards +Infinity.\r\n // FLOOR 3 Towards -Infinity.\r\n // HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n ROUNDING_MODE = 4, // 0 to 8\r\n\r\n // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\r\n\r\n // The exponent value at and beneath which toString returns exponential notation.\r\n // Number type: -7\r\n TO_EXP_NEG = -7, // 0 to -MAX\r\n\r\n // The exponent value at and above which toString returns exponential notation.\r\n // Number type: 21\r\n TO_EXP_POS = 21, // 0 to MAX\r\n\r\n // RANGE : [MIN_EXP, MAX_EXP]\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // Number type: -324 (5e-324)\r\n MIN_EXP = -1e7, // -1 to -MAX\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // Number type: 308 (1.7976931348623157e+308)\r\n // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\r\n MAX_EXP = 1e7, // 1 to MAX\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n CRYPTO = false, // true or false\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend.\r\n // This modulo mode is commonly known as 'truncated division' and is\r\n // equivalent to (a % n) in JavaScript.\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)).\r\n // The remainder is always positive.\r\n //\r\n // The truncated division, floored division, Euclidian division and IEEE 754 remainder\r\n // modes are commonly used for the modulus operation.\r\n // Although the other rounding modes can also be used, they may not give useful results.\r\n MODULO_MODE = 1, // 0 to 9\r\n\r\n // The maximum number of significant digits of the result of the exponentiatedBy operation.\r\n // If POW_PRECISION is 0, there will be unlimited significant digits.\r\n POW_PRECISION = 0, // 0 to MAX\r\n\r\n // The format specification used by the BigNumber.prototype.toFormat method.\r\n FORMAT = {\r\n prefix: '',\r\n groupSize: 3,\r\n secondaryGroupSize: 0,\r\n groupSeparator: ',',\r\n decimalSeparator: '.',\r\n fractionGroupSize: 0,\r\n fractionGroupSeparator: '\\xA0', // non-breaking space\r\n suffix: ''\r\n },\r\n\r\n // The alphabet used for base conversion. It must be at least 2 characters long, with no '+',\r\n // '-', '.', whitespace, or repeated character.\r\n // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'\r\n ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz',\r\n alphabetHasNormalDecimalDigits = true;\r\n\r\n\r\n //------------------------------------------------------------------------------------------\r\n\r\n\r\n // CONSTRUCTOR\r\n\r\n\r\n /*\r\n * The BigNumber constructor and exported function.\r\n * Create and return a new instance of a BigNumber object.\r\n *\r\n * v {number|string|BigNumber} A numeric value.\r\n * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive.\r\n */\r\n function BigNumber(v, b) {\r\n var alphabet, c, caseChanged, e, i, isNum, len, str,\r\n x = this;\r\n\r\n // Enable constructor call without `new`.\r\n if (!(x instanceof BigNumber)) return new BigNumber(v, b);\r\n\r\n if (b == null) {\r\n\r\n if (v && v._isBigNumber === true) {\r\n x.s = v.s;\r\n\r\n if (!v.c || v.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else if (v.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = v.e;\r\n x.c = v.c.slice();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if ((isNum = typeof v == 'number') && v * 0 == 0) {\r\n\r\n // Use `1 / n` to handle minus zero also.\r\n x.s = 1 / v < 0 ? (v = -v, -1) : 1;\r\n\r\n // Fast path for integers, where n < 2147483648 (2**31).\r\n if (v === ~~v) {\r\n for (e = 0, i = v; i >= 10; i /= 10, e++);\r\n\r\n if (e > MAX_EXP) {\r\n x.c = x.e = null;\r\n } else {\r\n x.e = e;\r\n x.c = [v];\r\n }\r\n\r\n return;\r\n }\r\n\r\n str = String(v);\r\n } else {\r\n\r\n if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum);\r\n\r\n x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n\r\n // Allow exponential notation to be used with base 10 argument, while\r\n // also rounding to DECIMAL_PLACES as with other bases.\r\n if (b == 10 && alphabetHasNormalDecimalDigits) {\r\n x = new BigNumber(v);\r\n return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE);\r\n }\r\n\r\n str = String(v);\r\n\r\n if (isNum = typeof v == 'number') {\r\n\r\n // Avoid potential interpretation of Infinity and NaN as base 44+ values.\r\n if (v * 0 != 0) return parseNumeric(x, str, isNum, b);\r\n\r\n x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (BigNumber.DEBUG && str.replace(/^0\\.0*|\\./, '').length > 15) {\r\n throw Error\r\n (tooManyDigits + v);\r\n }\r\n } else {\r\n x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;\r\n }\r\n\r\n alphabet = ALPHABET.slice(0, b);\r\n e = i = 0;\r\n\r\n // Check that str is a valid base b number.\r\n // Don't use RegExp, so alphabet can contain special characters.\r\n for (len = str.length; i < len; i++) {\r\n if (alphabet.indexOf(c = str.charAt(i)) < 0) {\r\n if (c == '.') {\r\n\r\n // If '.' is not the first character and it has not be found before.\r\n if (i > e) {\r\n e = len;\r\n continue;\r\n }\r\n } else if (!caseChanged) {\r\n\r\n // Allow e.g. hexadecimal 'FF' as well as 'ff'.\r\n if (str == str.toUpperCase() && (str = str.toLowerCase()) ||\r\n str == str.toLowerCase() && (str = str.toUpperCase())) {\r\n caseChanged = true;\r\n i = -1;\r\n e = 0;\r\n continue;\r\n }\r\n }\r\n\r\n return parseNumeric(x, String(v), isNum, b);\r\n }\r\n }\r\n\r\n // Prevent later check for length on converted number.\r\n isNum = false;\r\n str = convertBase(str, b, 10, x.s);\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n else e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(--len) === 48;);\r\n\r\n if (str = str.slice(i, ++len)) {\r\n len -= i;\r\n\r\n // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}'\r\n if (isNum && BigNumber.DEBUG &&\r\n len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {\r\n throw Error\r\n (tooManyDigits + (x.s * v));\r\n }\r\n\r\n // Overflow?\r\n if ((e = e - i - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n x.c = x.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n } else {\r\n x.e = e;\r\n x.c = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first element of the coefficient array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE; // i < 1\r\n\r\n if (i < len) {\r\n if (i) x.c.push(+str.slice(0, i));\r\n\r\n for (len -= LOG_BASE; i < len;) {\r\n x.c.push(+str.slice(i, i += LOG_BASE));\r\n }\r\n\r\n i = LOG_BASE - (str = str.slice(i)).length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--; str += '0');\r\n x.c.push(+str);\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n\r\n // CONSTRUCTOR PROPERTIES\r\n\r\n\r\n BigNumber.clone = clone;\r\n\r\n BigNumber.ROUND_UP = 0;\r\n BigNumber.ROUND_DOWN = 1;\r\n BigNumber.ROUND_CEIL = 2;\r\n BigNumber.ROUND_FLOOR = 3;\r\n BigNumber.ROUND_HALF_UP = 4;\r\n BigNumber.ROUND_HALF_DOWN = 5;\r\n BigNumber.ROUND_HALF_EVEN = 6;\r\n BigNumber.ROUND_HALF_CEIL = 7;\r\n BigNumber.ROUND_HALF_FLOOR = 8;\r\n BigNumber.EUCLID = 9;\r\n\r\n\r\n /*\r\n * Configure infrequently-changing library-wide settings.\r\n *\r\n * Accept an object with the following optional properties (if the value of a property is\r\n * a number, it must be an integer within the inclusive range stated):\r\n *\r\n * DECIMAL_PLACES {number} 0 to MAX\r\n * ROUNDING_MODE {number} 0 to 8\r\n * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX]\r\n * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX]\r\n * CRYPTO {boolean} true or false\r\n * MODULO_MODE {number} 0 to 9\r\n * POW_PRECISION {number} 0 to MAX\r\n * ALPHABET {string} A string of two or more unique characters which does\r\n * not contain '.'.\r\n * FORMAT {object} An object with some of the following properties:\r\n * prefix {string}\r\n * groupSize {number}\r\n * secondaryGroupSize {number}\r\n * groupSeparator {string}\r\n * decimalSeparator {string}\r\n * fractionGroupSize {number}\r\n * fractionGroupSeparator {string}\r\n * suffix {string}\r\n *\r\n * (The values assigned to the above FORMAT object properties are not checked for validity.)\r\n *\r\n * E.g.\r\n * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\r\n *\r\n * Ignore properties/parameters set to null or undefined, except for ALPHABET.\r\n *\r\n * Return an object with the properties current values.\r\n */\r\n BigNumber.config = BigNumber.set = function (obj) {\r\n var p, v;\r\n\r\n if (obj != null) {\r\n\r\n if (typeof obj == 'object') {\r\n\r\n // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n DECIMAL_PLACES = v;\r\n }\r\n\r\n // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\r\n // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 8, p);\r\n ROUNDING_MODE = v;\r\n }\r\n\r\n // EXPONENTIAL_AT {number|number[]}\r\n // Integer, -MAX to MAX inclusive or\r\n // [integer -MAX to 0 inclusive, 0 to MAX inclusive].\r\n // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, 0, p);\r\n intCheck(v[1], 0, MAX, p);\r\n TO_EXP_NEG = v[0];\r\n TO_EXP_POS = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);\r\n }\r\n }\r\n\r\n // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\r\n // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\r\n // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}'\r\n if (obj.hasOwnProperty(p = 'RANGE')) {\r\n v = obj[p];\r\n if (v && v.pop) {\r\n intCheck(v[0], -MAX, -1, p);\r\n intCheck(v[1], 1, MAX, p);\r\n MIN_EXP = v[0];\r\n MAX_EXP = v[1];\r\n } else {\r\n intCheck(v, -MAX, MAX, p);\r\n if (v) {\r\n MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' cannot be zero: ' + v);\r\n }\r\n }\r\n }\r\n\r\n // CRYPTO {boolean} true or false.\r\n // '[BigNumber Error] CRYPTO not true or false: {v}'\r\n // '[BigNumber Error] crypto unavailable'\r\n if (obj.hasOwnProperty(p = 'CRYPTO')) {\r\n v = obj[p];\r\n if (v === !!v) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n CRYPTO = v;\r\n } else {\r\n CRYPTO = !v;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n } else {\r\n CRYPTO = v;\r\n }\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' not true or false: ' + v);\r\n }\r\n }\r\n\r\n // MODULO_MODE {number} Integer, 0 to 9 inclusive.\r\n // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'MODULO_MODE')) {\r\n v = obj[p];\r\n intCheck(v, 0, 9, p);\r\n MODULO_MODE = v;\r\n }\r\n\r\n // POW_PRECISION {number} Integer, 0 to MAX inclusive.\r\n // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}'\r\n if (obj.hasOwnProperty(p = 'POW_PRECISION')) {\r\n v = obj[p];\r\n intCheck(v, 0, MAX, p);\r\n POW_PRECISION = v;\r\n }\r\n\r\n // FORMAT {object}\r\n // '[BigNumber Error] FORMAT not an object: {v}'\r\n if (obj.hasOwnProperty(p = 'FORMAT')) {\r\n v = obj[p];\r\n if (typeof v == 'object') FORMAT = v;\r\n else throw Error\r\n (bignumberError + p + ' not an object: ' + v);\r\n }\r\n\r\n // ALPHABET {string}\r\n // '[BigNumber Error] ALPHABET invalid: {v}'\r\n if (obj.hasOwnProperty(p = 'ALPHABET')) {\r\n v = obj[p];\r\n\r\n // Disallow if less than two characters,\r\n // or if it contains '+', '-', '.', whitespace, or a repeated character.\r\n if (typeof v == 'string' && !/^.?$|[+\\-.\\s]|(.).*\\1/.test(v)) {\r\n alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789';\r\n ALPHABET = v;\r\n } else {\r\n throw Error\r\n (bignumberError + p + ' invalid: ' + v);\r\n }\r\n }\r\n\r\n } else {\r\n\r\n // '[BigNumber Error] Object expected: {v}'\r\n throw Error\r\n (bignumberError + 'Object expected: ' + obj);\r\n }\r\n }\r\n\r\n return {\r\n DECIMAL_PLACES: DECIMAL_PLACES,\r\n ROUNDING_MODE: ROUNDING_MODE,\r\n EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],\r\n RANGE: [MIN_EXP, MAX_EXP],\r\n CRYPTO: CRYPTO,\r\n MODULO_MODE: MODULO_MODE,\r\n POW_PRECISION: POW_PRECISION,\r\n FORMAT: FORMAT,\r\n ALPHABET: ALPHABET\r\n };\r\n };\r\n\r\n\r\n /*\r\n * Return true if v is a BigNumber instance, otherwise return false.\r\n *\r\n * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed.\r\n *\r\n * v {any}\r\n *\r\n * '[BigNumber Error] Invalid BigNumber: {v}'\r\n */\r\n BigNumber.isBigNumber = function (v) {\r\n if (!v || v._isBigNumber !== true) return false;\r\n if (!BigNumber.DEBUG) return true;\r\n\r\n var i, n,\r\n c = v.c,\r\n e = v.e,\r\n s = v.s;\r\n\r\n out: if ({}.toString.call(c) == '[object Array]') {\r\n\r\n if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {\r\n\r\n // If the first element is zero, the BigNumber value must be zero.\r\n if (c[0] === 0) {\r\n if (e === 0 && c.length === 1) return true;\r\n break out;\r\n }\r\n\r\n // Calculate number of digits that c[0] should have, based on the exponent.\r\n i = (e + 1) % LOG_BASE;\r\n if (i < 1) i += LOG_BASE;\r\n\r\n // Calculate number of digits of c[0].\r\n //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) {\r\n if (String(c[0]).length == i) {\r\n\r\n for (i = 0; i < c.length; i++) {\r\n n = c[i];\r\n if (n < 0 || n >= BASE || n !== mathfloor(n)) break out;\r\n }\r\n\r\n // Last element cannot be zero, unless it is the only element.\r\n if (n !== 0) return true;\r\n }\r\n }\r\n\r\n // Infinity/NaN\r\n } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {\r\n return true;\r\n }\r\n\r\n throw Error\r\n (bignumberError + 'Invalid BigNumber: ' + v);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.maximum = BigNumber.max = function () {\r\n return maxOrMin(arguments, -1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.minimum = BigNumber.min = function () {\r\n return maxOrMin(arguments, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\r\n * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\r\n * zeros are produced).\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}'\r\n * '[BigNumber Error] crypto unavailable'\r\n */\r\n BigNumber.random = (function () {\r\n var pow2_53 = 0x20000000000000;\r\n\r\n // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\r\n // Check if Math.random() produces more than 32 bits of randomness.\r\n // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\r\n // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\r\n var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\r\n ? function () { return mathfloor(Math.random() * pow2_53); }\r\n : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\r\n (Math.random() * 0x800000 | 0); };\r\n\r\n return function (dp) {\r\n var a, b, e, k, v,\r\n i = 0,\r\n c = [],\r\n rand = new BigNumber(ONE);\r\n\r\n if (dp == null) dp = DECIMAL_PLACES;\r\n else intCheck(dp, 0, MAX);\r\n\r\n k = mathceil(dp / LOG_BASE);\r\n\r\n if (CRYPTO) {\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n if (crypto.getRandomValues) {\r\n\r\n a = crypto.getRandomValues(new Uint32Array(k *= 2));\r\n\r\n for (; i < k;) {\r\n\r\n // 53 bits:\r\n // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\r\n // 11111 11111111 11111111 11111111 11100000 00000000 00000000\r\n // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\r\n // 11111 11111111 11111111\r\n // 0x20000 is 2^21.\r\n v = a[i] * 0x20000 + (a[i + 1] >>> 11);\r\n\r\n // Rejection sampling:\r\n // 0 <= v < 9007199254740992\r\n // Probability that v >= 9e15, is\r\n // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\r\n if (v >= 9e15) {\r\n b = crypto.getRandomValues(new Uint32Array(2));\r\n a[i] = b[0];\r\n a[i + 1] = b[1];\r\n } else {\r\n\r\n // 0 <= v <= 8999999999999999\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 2;\r\n }\r\n }\r\n i = k / 2;\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n a = crypto.randomBytes(k *= 7);\r\n\r\n for (; i < k;) {\r\n\r\n // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\r\n // 0x100000000 is 2^32, 0x1000000 is 2^24\r\n // 11111 11111111 11111111 11111111 11111111 11111111 11111111\r\n // 0 <= v < 9007199254740992\r\n v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) +\r\n (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) +\r\n (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];\r\n\r\n if (v >= 9e15) {\r\n crypto.randomBytes(7).copy(a, i);\r\n } else {\r\n\r\n // 0 <= (v % 1e14) <= 99999999999999\r\n c.push(v % 1e14);\r\n i += 7;\r\n }\r\n }\r\n i = k / 7;\r\n } else {\r\n CRYPTO = false;\r\n throw Error\r\n (bignumberError + 'crypto unavailable');\r\n }\r\n }\r\n\r\n // Use Math.random.\r\n if (!CRYPTO) {\r\n\r\n for (; i < k;) {\r\n v = random53bitInt();\r\n if (v < 9e15) c[i++] = v % 1e14;\r\n }\r\n }\r\n\r\n k = c[--i];\r\n dp %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to dp.\r\n if (k && dp) {\r\n v = POWS_TEN[LOG_BASE - dp];\r\n c[i] = mathfloor(k / v) * v;\r\n }\r\n\r\n // Remove trailing elements which are zero.\r\n for (; c[i] === 0; c.pop(), i--);\r\n\r\n // Zero?\r\n if (i < 0) {\r\n c = [e = 0];\r\n } else {\r\n\r\n // Remove leading elements which are zero and adjust exponent accordingly.\r\n for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE);\r\n\r\n // Count the digits of the first element of c to determine leading zeros, and...\r\n for (i = 1, v = c[0]; v >= 10; v /= 10, i++);\r\n\r\n // adjust the exponent accordingly.\r\n if (i < LOG_BASE) e -= LOG_BASE - i;\r\n }\r\n\r\n rand.e = e;\r\n rand.c = c;\r\n return rand;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the sum of the arguments.\r\n *\r\n * arguments {number|string|BigNumber}\r\n */\r\n BigNumber.sum = function () {\r\n var i = 1,\r\n args = arguments,\r\n sum = new BigNumber(args[0]);\r\n for (; i < args.length;) sum = sum.plus(args[i++]);\r\n return sum;\r\n };\r\n\r\n\r\n // PRIVATE FUNCTIONS\r\n\r\n\r\n // Called by BigNumber and BigNumber.prototype.toString.\r\n convertBase = (function () {\r\n var decimal = '0123456789';\r\n\r\n /*\r\n * Convert string of baseIn to an array of numbers of baseOut.\r\n * Eg. toBaseOut('255', 10, 16) returns [15, 15].\r\n * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5].\r\n */\r\n function toBaseOut(str, baseIn, baseOut, alphabet) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n len = str.length;\r\n\r\n for (; i < len;) {\r\n for (arrL = arr.length; arrL--; arr[arrL] *= baseIn);\r\n\r\n arr[0] += alphabet.indexOf(str.charAt(i++));\r\n\r\n for (j = 0; j < arr.length; j++) {\r\n\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] == null) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n }\r\n\r\n // Convert a numeric string of baseIn to a numeric string of baseOut.\r\n // If the caller is toString, we are converting from base 10 to baseOut.\r\n // If the caller is BigNumber, we are converting from baseIn to base 10.\r\n return function (str, baseIn, baseOut, sign, callerIsToString) {\r\n var alphabet, d, e, k, r, x, xc, y,\r\n i = str.indexOf('.'),\r\n dp = DECIMAL_PLACES,\r\n rm = ROUNDING_MODE;\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n k = POW_PRECISION;\r\n\r\n // Unlimited precision.\r\n POW_PRECISION = 0;\r\n str = str.replace('.', '');\r\n y = new BigNumber(baseIn);\r\n x = y.pow(str.length - i);\r\n POW_PRECISION = k;\r\n\r\n // Convert str as if an integer, then restore the fraction part by dividing the\r\n // result by its base raised to a power.\r\n\r\n y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'),\r\n 10, baseOut, decimal);\r\n y.e = y.c.length;\r\n }\r\n\r\n // Convert the number as integer.\r\n\r\n xc = toBaseOut(str, baseIn, baseOut, callerIsToString\r\n ? (alphabet = ALPHABET, decimal)\r\n : (alphabet = decimal, ALPHABET));\r\n\r\n // xc now represents str as an integer and converted to baseOut. e is the exponent.\r\n e = k = xc.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xc[--k] == 0; xc.pop());\r\n\r\n // Zero?\r\n if (!xc[0]) return alphabet.charAt(0);\r\n\r\n // Does str represent an integer? If so, no need for the division.\r\n if (i < 0) {\r\n --e;\r\n } else {\r\n x.c = xc;\r\n x.e = e;\r\n\r\n // The sign is needed for correct rounding.\r\n x.s = sign;\r\n x = div(x, y, dp, rm, baseOut);\r\n xc = x.c;\r\n r = x.r;\r\n e = x.e;\r\n }\r\n\r\n // xc now represents str converted to baseOut.\r\n\r\n // THe index of the rounding digit.\r\n d = e + dp + 1;\r\n\r\n // The rounding digit: the digit to the right of the digit that may be rounded up.\r\n i = xc[d];\r\n\r\n // Look at the rounding digits and mode to determine whether to round up.\r\n\r\n k = baseOut / 2;\r\n r = r || d < 0 || xc[d + 1] != null;\r\n\r\n r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n // If the index of the rounding digit is not greater than zero, or xc represents\r\n // zero, then the result of the base conversion is zero or, if rounding up, a value\r\n // such as 0.00001.\r\n if (d < 1 || !xc[0]) {\r\n\r\n // 1^-dp or 0\r\n str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);\r\n } else {\r\n\r\n // Truncate xc to the required number of decimal places.\r\n xc.length = d;\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (--baseOut; ++xc[--d] > baseOut;) {\r\n xc[d] = 0;\r\n\r\n if (!d) {\r\n ++e;\r\n xc = [1].concat(xc);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (k = xc.length; !xc[--k];);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++]));\r\n\r\n // Add leading zeros, decimal point and trailing zeros as required.\r\n str = toFixedPoint(str, e, alphabet.charAt(0));\r\n }\r\n\r\n // The caller will add the sign.\r\n return str;\r\n };\r\n })();\r\n\r\n\r\n // Perform division in the specified base. Called by div and convertBase.\r\n div = (function () {\r\n\r\n // Assume non-zero x and k.\r\n function multiply(x, k, base) {\r\n var m, temp, xlo, xhi,\r\n carry = 0,\r\n i = x.length,\r\n klo = k % SQRT_BASE,\r\n khi = k / SQRT_BASE | 0;\r\n\r\n for (x = x.slice(); i--;) {\r\n xlo = x[i] % SQRT_BASE;\r\n xhi = x[i] / SQRT_BASE | 0;\r\n m = khi * xlo + xhi * klo;\r\n temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry;\r\n carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;\r\n x[i] = temp % base;\r\n }\r\n\r\n if (carry) x = [carry].concat(x);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, cmp;\r\n\r\n if (aL != bL) {\r\n cmp = aL > bL ? 1 : -1;\r\n } else {\r\n\r\n for (i = cmp = 0; i < aL; i++) {\r\n\r\n if (a[i] != b[i]) {\r\n cmp = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1; a.splice(0, 1));\r\n }\r\n\r\n // x: dividend, y: divisor.\r\n return function (x, y, dp, rm, base) {\r\n var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\r\n yL, yz,\r\n s = x.s == y.s ? 1 : -1,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xc || !xc[0] || !yc || !yc[0]) {\r\n\r\n return new BigNumber(\r\n\r\n // Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN :\r\n\r\n // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\r\n xc && xc[0] == 0 || !yc ? s * 0 : s / 0\r\n );\r\n }\r\n\r\n q = new BigNumber(s);\r\n qc = q.c = [];\r\n e = x.e - y.e;\r\n s = dp + e + 1;\r\n\r\n if (!base) {\r\n base = BASE;\r\n e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);\r\n s = s / LOG_BASE | 0;\r\n }\r\n\r\n // Result exponent may be one less then the current value of e.\r\n // The coefficients of the BigNumbers from convertBase may have trailing zeros.\r\n for (i = 0; yc[i] == (xc[i] || 0); i++);\r\n\r\n if (yc[i] > (xc[i] || 0)) e--;\r\n\r\n if (s < 0) {\r\n qc.push(1);\r\n more = true;\r\n } else {\r\n xL = xc.length;\r\n yL = yc.length;\r\n i = 0;\r\n s += 2;\r\n\r\n // Normalise xc and yc so highest order digit of yc is >= base / 2.\r\n\r\n n = mathfloor(base / (yc[0] + 1));\r\n\r\n // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1.\r\n // if (n > 1 || n++ == 1 && yc[0] < base / 2) {\r\n if (n > 1) {\r\n yc = multiply(yc, n, base);\r\n xc = multiply(xc, n, base);\r\n yL = yc.length;\r\n xL = xc.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xc.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL; rem[remL++] = 0);\r\n yz = yc.slice();\r\n yz = [0].concat(yz);\r\n yc0 = yc[0];\r\n if (yc[1] >= base / 2) yc0++;\r\n // Not necessary, but to prevent trial digit n > base, when using base 3.\r\n // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15;\r\n\r\n do {\r\n n = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yc, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, n.\r\n\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // n is how many times the divisor goes into the current remainder.\r\n n = mathfloor(rem0 / yc0);\r\n\r\n // Algorithm:\r\n // product = divisor multiplied by trial digit (n).\r\n // Compare product and remainder.\r\n // If product is greater than remainder:\r\n // Subtract divisor from product, decrement trial digit.\r\n // Subtract product from remainder.\r\n // If product was less than remainder at the last compare:\r\n // Compare new remainder and divisor.\r\n // If remainder is greater than divisor:\r\n // Subtract divisor from remainder, increment trial digit.\r\n\r\n if (n > 1) {\r\n\r\n // n may be > base only when base is 3.\r\n if (n >= base) n = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiply(yc, n, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n // If product > remainder then trial digit n too high.\r\n // n is 1 too high about 5% of the time, and is not known to have\r\n // ever been more than 1 too high.\r\n while (compare(prod, rem, prodL, remL) == 1) {\r\n n--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yc, prodL, base);\r\n prodL = prod.length;\r\n cmp = 1;\r\n }\r\n } else {\r\n\r\n // n is 0 or 1, cmp is -1.\r\n // If n is 0, there is no need to compare yc and rem again below,\r\n // so change cmp to 1 to avoid it.\r\n // If n is 1, leave cmp as -1, so yc and rem are compared again.\r\n if (n == 0) {\r\n\r\n // divisor < remainder, so n must be at least 1.\r\n cmp = n = 1;\r\n }\r\n\r\n // product = divisor\r\n prod = yc.slice();\r\n prodL = prod.length;\r\n }\r\n\r\n if (prodL < remL) prod = [0].concat(prod);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n remL = rem.length;\r\n\r\n // If product was < remainder.\r\n if (cmp == -1) {\r\n\r\n // Compare divisor and new remainder.\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n // Trial digit n too low.\r\n // n is 1 too low about 5% of the time, and very rarely 2 too low.\r\n while (compare(yc, rem, yL, remL) < 1) {\r\n n++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yc, remL, base);\r\n remL = rem.length;\r\n }\r\n }\r\n } else if (cmp === 0) {\r\n n++;\r\n rem = [0];\r\n } // else cmp === 1 and n will be 0\r\n\r\n // Add the next digit, n, to the result array.\r\n qc[i++] = n;\r\n\r\n // Update the remainder.\r\n if (rem[0]) {\r\n rem[remL++] = xc[xi] || 0;\r\n } else {\r\n rem = [xc[xi]];\r\n remL = 1;\r\n }\r\n } while ((xi++ < xL || rem[0] != null) && s--);\r\n\r\n more = rem[0] != null;\r\n\r\n // Leading zero?\r\n if (!qc[0]) qc.splice(0, 1);\r\n }\r\n\r\n if (base == BASE) {\r\n\r\n // To calculate q.e, first get the number of digits of qc[0].\r\n for (i = 1, s = qc[0]; s >= 10; s /= 10, i++);\r\n\r\n round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);\r\n\r\n // Caller is convertBase.\r\n } else {\r\n q.e = e;\r\n q.r = +more;\r\n }\r\n\r\n return q;\r\n };\r\n })();\r\n\r\n\r\n /*\r\n * Return a string representing the value of BigNumber n in fixed-point or exponential\r\n * notation rounded to the specified decimal places or significant digits.\r\n *\r\n * n: a BigNumber.\r\n * i: the index of the last digit required (i.e. the digit that may be rounded up).\r\n * rm: the rounding mode.\r\n * id: 1 (toExponential) or 2 (toPrecision).\r\n */\r\n function format(n, i, rm, id) {\r\n var c0, e, ne, len, str;\r\n\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n if (!n.c) return n.toString();\r\n\r\n c0 = n.c[0];\r\n ne = n.e;\r\n\r\n if (i == null) {\r\n str = coeffToString(n.c);\r\n str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS)\r\n ? toExponential(str, ne)\r\n : toFixedPoint(str, ne, '0');\r\n } else {\r\n n = round(new BigNumber(n), i, rm);\r\n\r\n // n.e may have changed if the value was rounded up.\r\n e = n.e;\r\n\r\n str = coeffToString(n.c);\r\n len = str.length;\r\n\r\n // toPrecision returns exponential notation if the number of significant digits\r\n // specified is less than the number of digits necessary to represent the integer\r\n // part of the value in fixed-point notation.\r\n\r\n // Exponential notation.\r\n if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {\r\n\r\n // Append zeros?\r\n for (; len < i; str += '0', len++);\r\n str = toExponential(str, e);\r\n\r\n // Fixed-point notation.\r\n } else {\r\n i -= ne;\r\n str = toFixedPoint(str, e, '0');\r\n\r\n // Append zeros?\r\n if (e + 1 > len) {\r\n if (--i > 0) for (str += '.'; i--; str += '0');\r\n } else {\r\n i += e - len;\r\n if (i > 0) {\r\n if (e + 1 == len) str += '.';\r\n for (; i--; str += '0');\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n.s < 0 && c0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // Handle BigNumber.max and BigNumber.min.\r\n // If any number is NaN, return NaN.\r\n function maxOrMin(args, n) {\r\n var k, y,\r\n i = 1,\r\n x = new BigNumber(args[0]);\r\n\r\n for (; i < args.length; i++) {\r\n y = new BigNumber(args[i]);\r\n if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n /*\r\n * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\r\n * Called by minus, plus and times.\r\n */\r\n function normalise(n, c, e) {\r\n var i = 1,\r\n j = c.length;\r\n\r\n // Remove trailing zeros.\r\n for (; !c[--j]; c.pop());\r\n\r\n // Calculate the base 10 exponent. First get the number of digits of c[0].\r\n for (j = c[0]; j >= 10; j /= 10, i++);\r\n\r\n // Overflow?\r\n if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {\r\n\r\n // Infinity.\r\n n.c = n.e = null;\r\n\r\n // Underflow?\r\n } else if (e < MIN_EXP) {\r\n\r\n // Zero.\r\n n.c = [n.e = 0];\r\n } else {\r\n n.e = e;\r\n n.c = c;\r\n }\r\n\r\n return n;\r\n }\r\n\r\n\r\n // Handle values that fail the validity test in BigNumber.\r\n parseNumeric = (function () {\r\n var basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i,\r\n dotAfter = /^([^.]+)\\.$/,\r\n dotBefore = /^\\.([^.]+)$/,\r\n isInfinityOrNaN = /^-?(Infinity|NaN)$/,\r\n whitespaceOrPlus = /^\\s*\\+(?=[\\w.])|^\\s+|\\s+$/g;\r\n\r\n return function (x, str, isNum, b) {\r\n var base,\r\n s = isNum ? str : str.replace(whitespaceOrPlus, '');\r\n\r\n // No exception on ±Infinity or NaN.\r\n if (isInfinityOrNaN.test(s)) {\r\n x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\r\n } else {\r\n if (!isNum) {\r\n\r\n // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\r\n s = s.replace(basePrefix, function (m, p1, p2) {\r\n base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\r\n return !b || b == base ? p1 : m;\r\n });\r\n\r\n if (b) {\r\n base = b;\r\n\r\n // E.g. '1.' to '1', '.1' to '0.1'\r\n s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1');\r\n }\r\n\r\n if (str != s) return new BigNumber(s, base);\r\n }\r\n\r\n // '[BigNumber Error] Not a number: {n}'\r\n // '[BigNumber Error] Not a base {b} number: {n}'\r\n if (BigNumber.DEBUG) {\r\n throw Error\r\n (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str);\r\n }\r\n\r\n // NaN\r\n x.s = null;\r\n }\r\n\r\n x.c = x.e = null;\r\n }\r\n })();\r\n\r\n\r\n /*\r\n * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\r\n * If r is truthy, it is known that there are more digits after the rounding digit.\r\n */\r\n function round(x, sd, rm, r) {\r\n var d, i, j, k, n, ni, rd,\r\n xc = x.c,\r\n pows10 = POWS_TEN;\r\n\r\n // if x is not Infinity or NaN...\r\n if (xc) {\r\n\r\n // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // n is a base 1e14 number, the value of the element of array x.c containing rd.\r\n // ni is the index of n within x.c.\r\n // d is the number of digits of n.\r\n // i is the index of rd within n including leading zeros.\r\n // j is the actual index of rd within n (if < 0, rd is a leading zero).\r\n out: {\r\n\r\n // Get the number of digits of the first element of xc.\r\n for (d = 1, k = xc[0]; k >= 10; k /= 10, d++);\r\n i = sd - d;\r\n\r\n // If the rounding digit is in the first element of xc...\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n n = xc[ni = 0];\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = mathfloor(n / pows10[d - j - 1] % 10);\r\n } else {\r\n ni = mathceil((i + 1) / LOG_BASE);\r\n\r\n if (ni >= xc.length) {\r\n\r\n if (r) {\r\n\r\n // Needed by sqrt.\r\n for (; xc.length <= ni; xc.push(0));\r\n n = rd = 0;\r\n d = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n n = k = xc[ni];\r\n\r\n // Get the number of digits of n.\r\n for (d = 1; k >= 10; k /= 10, d++);\r\n\r\n // Get the index of rd within n.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within n, adjusted for leading zeros.\r\n // The number of leading zeros of n is given by LOG_BASE - d.\r\n j = i - LOG_BASE + d;\r\n\r\n // Get the rounding digit at index j of n.\r\n rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10);\r\n }\r\n }\r\n\r\n r = r || sd < 0 ||\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n // The expression n % pows10[d - j - 1] returns all digits of n to the right\r\n // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\r\n xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);\r\n\r\n r = rm < 4\r\n ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xc[0]) {\r\n xc.length = 0;\r\n\r\n if (r) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xc[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xc.length = ni;\r\n k = 1;\r\n ni--;\r\n } else {\r\n xc.length = ni + 1;\r\n k = pows10[LOG_BASE - i];\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of n.\r\n xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;\r\n }\r\n\r\n // Round up?\r\n if (r) {\r\n\r\n for (; ;) {\r\n\r\n // If the digit to be rounded up is in the first element of xc...\r\n if (ni == 0) {\r\n\r\n // i will be the length of xc[0] before k is added.\r\n for (i = 1, j = xc[0]; j >= 10; j /= 10, i++);\r\n j = xc[0] += k;\r\n for (k = 1; j >= 10; j /= 10, k++);\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xc[0] == BASE) xc[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xc[ni] += k;\r\n if (xc[ni] != BASE) break;\r\n xc[ni--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xc.length; xc[--i] === 0; xc.pop());\r\n }\r\n\r\n // Overflow? Infinity.\r\n if (x.e > MAX_EXP) {\r\n x.c = x.e = null;\r\n\r\n // Underflow? Zero.\r\n } else if (x.e < MIN_EXP) {\r\n x.c = [x.e = 0];\r\n }\r\n }\r\n\r\n return x;\r\n }\r\n\r\n\r\n function valueOf(n) {\r\n var str,\r\n e = n.e;\r\n\r\n if (e === null) return n.toString();\r\n\r\n str = coeffToString(n.c);\r\n\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(str, e)\r\n : toFixedPoint(str, e, '0');\r\n\r\n return n.s < 0 ? '-' + str : str;\r\n }\r\n\r\n\r\n // PROTOTYPE/INSTANCE METHODS\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the absolute value of this BigNumber.\r\n */\r\n P.absoluteValue = P.abs = function () {\r\n var x = new BigNumber(this);\r\n if (x.s < 0) x.s = 1;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * Return\r\n * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * 0 if they have the same value,\r\n * or null if the value of either is NaN.\r\n */\r\n P.comparedTo = function (y, b) {\r\n return compare(this, new BigNumber(y, b));\r\n };\r\n\r\n\r\n /*\r\n * If dp is undefined or null or true or false, return the number of decimal places of the\r\n * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n *\r\n * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * [dp] {number} Decimal places: integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.decimalPlaces = P.dp = function (dp, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), dp + x.e + 1, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last number.\r\n if (v = c[v]) for (; v % 10 == 0; v /= 10, n--);\r\n if (n < 0) n = 0;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\r\n * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.dividedBy = P.div = function (y, b) {\r\n return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the integer part of dividing the value of this\r\n * BigNumber by the value of BigNumber(y, b).\r\n */\r\n P.dividedToIntegerBy = P.idiv = function (y, b) {\r\n return div(this, new BigNumber(y, b), 0, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a BigNumber whose value is the value of this BigNumber exponentiated by n.\r\n *\r\n * If m is present, return the result modulo m.\r\n * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\r\n * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE.\r\n *\r\n * The modular power operation works efficiently when x, n, and m are integers, otherwise it\r\n * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0.\r\n *\r\n * n {number|string|BigNumber} The exponent. An integer.\r\n * [m] {number|string|BigNumber} The modulus.\r\n *\r\n * '[BigNumber Error] Exponent not an integer: {n}'\r\n */\r\n P.exponentiatedBy = P.pow = function (n, m) {\r\n var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y,\r\n x = this;\r\n\r\n n = new BigNumber(n);\r\n\r\n // Allow NaN and ±Infinity, but not other non-integers.\r\n if (n.c && !n.isInteger()) {\r\n throw Error\r\n (bignumberError + 'Exponent not an integer: ' + valueOf(n));\r\n }\r\n\r\n if (m != null) m = new BigNumber(m);\r\n\r\n // Exponent of MAX_SAFE_INTEGER is 15.\r\n nIsBig = n.e > 14;\r\n\r\n // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0.\r\n if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {\r\n\r\n // The sign of the result of pow when x is negative depends on the evenness of n.\r\n // If +n overflows to ±Infinity, the evenness of n would be not be known.\r\n y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n)));\r\n return m ? y.mod(m) : y;\r\n }\r\n\r\n nIsNeg = n.s < 0;\r\n\r\n if (m) {\r\n\r\n // x % m returns NaN if abs(m) is zero, or m is NaN.\r\n if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN);\r\n\r\n isModExp = !nIsNeg && x.isInteger() && m.isInteger();\r\n\r\n if (isModExp) x = x.mod(m);\r\n\r\n // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15.\r\n // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15.\r\n } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0\r\n // [1, 240000000]\r\n ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7\r\n // [80000000000000] [99999750000000]\r\n : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {\r\n\r\n // If x is negative and n is odd, k = -0, else k = 0.\r\n k = x.s < 0 && isOdd(n) ? -0 : 0;\r\n\r\n // If x >= 1, k = ±Infinity.\r\n if (x.e > -1) k = 1 / k;\r\n\r\n // If n is negative return ±0, else return ±Infinity.\r\n return new BigNumber(nIsNeg ? 1 / k : k);\r\n\r\n } else if (POW_PRECISION) {\r\n\r\n // Truncating each coefficient array to a length of k after each multiplication\r\n // equates to truncating significant digits to POW_PRECISION + [28, 41],\r\n // i.e. there will be a minimum of 28 guard digits retained.\r\n k = mathceil(POW_PRECISION / LOG_BASE + 2);\r\n }\r\n\r\n if (nIsBig) {\r\n half = new BigNumber(0.5);\r\n if (nIsNeg) n.s = 1;\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = Math.abs(+valueOf(n));\r\n nIsOdd = i % 2;\r\n }\r\n\r\n y = new BigNumber(ONE);\r\n\r\n // Performs 54 loop iterations for n of 9007199254740991.\r\n for (; ;) {\r\n\r\n if (nIsOdd) {\r\n y = y.times(x);\r\n if (!y.c) break;\r\n\r\n if (k) {\r\n if (y.c.length > k) y.c.length = k;\r\n } else if (isModExp) {\r\n y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (i) {\r\n i = mathfloor(i / 2);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n } else {\r\n n = n.times(half);\r\n round(n, n.e + 1, 1);\r\n\r\n if (n.e > 14) {\r\n nIsOdd = isOdd(n);\r\n } else {\r\n i = +valueOf(n);\r\n if (i === 0) break;\r\n nIsOdd = i % 2;\r\n }\r\n }\r\n\r\n x = x.times(x);\r\n\r\n if (k) {\r\n if (x.c && x.c.length > k) x.c.length = k;\r\n } else if (isModExp) {\r\n x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m));\r\n }\r\n }\r\n\r\n if (isModExp) return y;\r\n if (nIsNeg) y = ONE.div(y);\r\n\r\n return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer\r\n * using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}'\r\n */\r\n P.integerValue = function (rm) {\r\n var n = new BigNumber(this);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n return round(n, n.e + 1, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isEqualTo = P.eq = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is a finite number, otherwise return false.\r\n */\r\n P.isFinite = function () {\r\n return !!this.c;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isGreaterThan = P.gt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is greater than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isGreaterThanOrEqualTo = P.gte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0;\r\n\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is an integer, otherwise return false.\r\n */\r\n P.isInteger = function () {\r\n return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\r\n * otherwise return false.\r\n */\r\n P.isLessThan = P.lt = function (y, b) {\r\n return compare(this, new BigNumber(y, b)) < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is less than or equal to the value of\r\n * BigNumber(y, b), otherwise return false.\r\n */\r\n P.isLessThanOrEqualTo = P.lte = function (y, b) {\r\n return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is NaN, otherwise return false.\r\n */\r\n P.isNaN = function () {\r\n return !this.s;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is negative, otherwise return false.\r\n */\r\n P.isNegative = function () {\r\n return this.s < 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is positive, otherwise return false.\r\n */\r\n P.isPositive = function () {\r\n return this.s > 0;\r\n };\r\n\r\n\r\n /*\r\n * Return true if the value of this BigNumber is 0 or -0, otherwise return false.\r\n */\r\n P.isZero = function () {\r\n return !!this.c && this.c[0] == 0;\r\n };\r\n\r\n\r\n /*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber minus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.minus = function (y, b) {\r\n var i, j, t, xLTy,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.plus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN);\r\n\r\n // Either zero?\r\n if (!xc[0] || !yc[0]) {\r\n\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x :\r\n\r\n // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\r\n ROUNDING_MODE == 3 ? -0 : 0);\r\n }\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Determine which is the bigger number.\r\n if (a = xe - ye) {\r\n\r\n if (xLTy = a < 0) {\r\n a = -a;\r\n t = xc;\r\n } else {\r\n ye = xe;\r\n t = yc;\r\n }\r\n\r\n t.reverse();\r\n\r\n // Prepend zeros to equalise exponents.\r\n for (b = a; b--; t.push(0));\r\n t.reverse();\r\n } else {\r\n\r\n // Exponents equal. Check digit by digit.\r\n j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;\r\n\r\n for (a = b = 0; b < j; b++) {\r\n\r\n if (xc[b] != yc[b]) {\r\n xLTy = xc[b] < yc[b];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // x < y? Point xc to the array of the bigger number.\r\n if (xLTy) {\r\n t = xc;\r\n xc = yc;\r\n yc = t;\r\n y.s = -y.s;\r\n }\r\n\r\n b = (j = yc.length) - (i = xc.length);\r\n\r\n // Append zeros to xc if shorter.\r\n // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\r\n if (b > 0) for (; b--; xc[i++] = 0);\r\n b = BASE - 1;\r\n\r\n // Subtract yc from xc.\r\n for (; j > a;) {\r\n\r\n if (xc[--j] < yc[j]) {\r\n for (i = j; i && !xc[--i]; xc[i] = b);\r\n --xc[i];\r\n xc[j] += BASE;\r\n }\r\n\r\n xc[j] -= yc[j];\r\n }\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xc[0] == 0; xc.splice(0, 1), --ye);\r\n\r\n // Zero?\r\n if (!xc[0]) {\r\n\r\n // Following IEEE 754 (2008) 6.3,\r\n // n - n = +0 but n - n = -0 when rounding towards -Infinity.\r\n y.s = ROUNDING_MODE == 3 ? -1 : 1;\r\n y.c = [y.e = 0];\r\n return y;\r\n }\r\n\r\n // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\r\n // for finite x and y.\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\r\n * BigNumber(y, b). The result depends on the value of MODULO_MODE.\r\n */\r\n P.modulo = P.mod = function (y, b) {\r\n var q, s,\r\n x = this;\r\n\r\n y = new BigNumber(y, b);\r\n\r\n // Return NaN if x is Infinity or NaN, or y is NaN or zero.\r\n if (!x.c || !y.s || y.c && !y.c[0]) {\r\n return new BigNumber(NaN);\r\n\r\n // Return x if y is Infinity or x is zero.\r\n } else if (!y.c || x.c && !x.c[0]) {\r\n return new BigNumber(x);\r\n }\r\n\r\n if (MODULO_MODE == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // r = x - qy where 0 <= r < abs(y)\r\n s = y.s;\r\n y.s = 1;\r\n q = div(x, y, 0, 3);\r\n y.s = s;\r\n q.s *= s;\r\n } else {\r\n q = div(x, y, 0, MODULO_MODE);\r\n }\r\n\r\n y = x.minus(q.times(y));\r\n\r\n // To match JavaScript %, ensure sign of zero is sign of dividend.\r\n if (!y.c[0] && MODULO_MODE == 1) y.s = x.s;\r\n\r\n return y;\r\n };\r\n\r\n\r\n /*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value\r\n * of BigNumber(y, b).\r\n */\r\n P.multipliedBy = P.times = function (y, b) {\r\n var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\r\n base, sqrtBase,\r\n x = this,\r\n xc = x.c,\r\n yc = (y = new BigNumber(y, b)).c;\r\n\r\n // Either NaN, ±Infinity or ±0?\r\n if (!xc || !yc || !xc[0] || !yc[0]) {\r\n\r\n // Return NaN if either is NaN, or one is 0 and the other is Infinity.\r\n if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {\r\n y.c = y.e = y.s = null;\r\n } else {\r\n y.s *= x.s;\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n if (!xc || !yc) {\r\n y.c = y.e = null;\r\n\r\n // Return ±0 if either is ±0.\r\n } else {\r\n y.c = [0];\r\n y.e = 0;\r\n }\r\n }\r\n\r\n return y;\r\n }\r\n\r\n e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);\r\n y.s *= x.s;\r\n xcL = xc.length;\r\n ycL = yc.length;\r\n\r\n // Ensure xc points to longer array and xcL to its length.\r\n if (xcL < ycL) {\r\n zc = xc;\r\n xc = yc;\r\n yc = zc;\r\n i = xcL;\r\n xcL = ycL;\r\n ycL = i;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n for (i = xcL + ycL, zc = []; i--; zc.push(0));\r\n\r\n base = BASE;\r\n sqrtBase = SQRT_BASE;\r\n\r\n for (i = ycL; --i >= 0;) {\r\n c = 0;\r\n ylo = yc[i] % sqrtBase;\r\n yhi = yc[i] / sqrtBase | 0;\r\n\r\n for (k = xcL, j = i + k; j > i;) {\r\n xlo = xc[--k] % sqrtBase;\r\n xhi = xc[k] / sqrtBase | 0;\r\n m = yhi * xlo + xhi * ylo;\r\n xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c;\r\n c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;\r\n zc[j--] = xlo % base;\r\n }\r\n\r\n zc[j] = c;\r\n }\r\n\r\n if (c) {\r\n ++e;\r\n } else {\r\n zc.splice(0, 1);\r\n }\r\n\r\n return normalise(y, zc, e);\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber negated,\r\n * i.e. multiplied by -1.\r\n */\r\n P.negated = function () {\r\n var x = new BigNumber(this);\r\n x.s = -x.s || null;\r\n return x;\r\n };\r\n\r\n\r\n /*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new BigNumber whose value is the value of this BigNumber plus the value of\r\n * BigNumber(y, b).\r\n */\r\n P.plus = function (y, b) {\r\n var t,\r\n x = this,\r\n a = x.s;\r\n\r\n y = new BigNumber(y, b);\r\n b = y.s;\r\n\r\n // Either NaN?\r\n if (!a || !b) return new BigNumber(NaN);\r\n\r\n // Signs differ?\r\n if (a != b) {\r\n y.s = -b;\r\n return x.minus(y);\r\n }\r\n\r\n var xe = x.e / LOG_BASE,\r\n ye = y.e / LOG_BASE,\r\n xc = x.c,\r\n yc = y.c;\r\n\r\n if (!xe || !ye) {\r\n\r\n // Return ±Infinity if either ±Infinity.\r\n if (!xc || !yc) return new BigNumber(a / 0);\r\n\r\n // Either zero?\r\n // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\r\n if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0);\r\n }\r\n\r\n xe = bitFloor(xe);\r\n ye = bitFloor(ye);\r\n xc = xc.slice();\r\n\r\n // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\r\n if (a = xe - ye) {\r\n if (a > 0) {\r\n ye = xe;\r\n t = yc;\r\n } else {\r\n a = -a;\r\n t = xc;\r\n }\r\n\r\n t.reverse();\r\n for (; a--; t.push(0));\r\n t.reverse();\r\n }\r\n\r\n a = xc.length;\r\n b = yc.length;\r\n\r\n // Point xc to the longer array, and b to the shorter length.\r\n if (a - b < 0) {\r\n t = yc;\r\n yc = xc;\r\n xc = t;\r\n b = a;\r\n }\r\n\r\n // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\r\n for (a = 0; b;) {\r\n a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;\r\n xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;\r\n }\r\n\r\n if (a) {\r\n xc = [a].concat(xc);\r\n ++ye;\r\n }\r\n\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n // ye = MAX_EXP + 1 possible\r\n return normalise(y, xc, ye);\r\n };\r\n\r\n\r\n /*\r\n * If sd is undefined or null or true or false, return the number of significant digits of\r\n * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN.\r\n * If sd is true include integer-part trailing zeros in the count.\r\n *\r\n * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this\r\n * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or\r\n * ROUNDING_MODE if rm is omitted.\r\n *\r\n * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive.\r\n * boolean: whether to count integer-part trailing zeros: true or false.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.precision = P.sd = function (sd, rm) {\r\n var c, n, v,\r\n x = this;\r\n\r\n if (sd != null && sd !== !!sd) {\r\n intCheck(sd, 1, MAX);\r\n if (rm == null) rm = ROUNDING_MODE;\r\n else intCheck(rm, 0, 8);\r\n\r\n return round(new BigNumber(x), sd, rm);\r\n }\r\n\r\n if (!(c = x.c)) return null;\r\n v = c.length - 1;\r\n n = v * LOG_BASE + 1;\r\n\r\n if (v = c[v]) {\r\n\r\n // Subtract the number of trailing zeros of the last element.\r\n for (; v % 10 == 0; v /= 10, n--);\r\n\r\n // Add the number of digits of the first element.\r\n for (v = c[0]; v >= 10; v /= 10, n++);\r\n }\r\n\r\n if (sd && x.e + 1 > n) n = x.e + 1;\r\n\r\n return n;\r\n };\r\n\r\n\r\n /*\r\n * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\r\n * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\r\n *\r\n * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}'\r\n */\r\n P.shiftedBy = function (k) {\r\n intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);\r\n return this.times('1e' + k);\r\n };\r\n\r\n\r\n /*\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n * Return a new BigNumber whose value is the square root of the value of this BigNumber,\r\n * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\r\n */\r\n P.squareRoot = P.sqrt = function () {\r\n var m, n, r, rep, t,\r\n x = this,\r\n c = x.c,\r\n s = x.s,\r\n e = x.e,\r\n dp = DECIMAL_PLACES + 4,\r\n half = new BigNumber('0.5');\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !c || !c[0]) {\r\n return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);\r\n }\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+valueOf(x));\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = coeffToString(c);\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(+n);\r\n e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new BigNumber(n);\r\n } else {\r\n r = new BigNumber(s + '');\r\n }\r\n\r\n // Check for zero.\r\n // r could be zero if MIN_EXP is changed after the this value was created.\r\n // This would cause a division by zero (x/t) and hence Infinity below, which would cause\r\n // coeffToString to throw.\r\n if (r.c[0]) {\r\n e = r.e;\r\n s = e + dp;\r\n if (s < 3) s = 0;\r\n\r\n // Newton-Raphson iteration.\r\n for (; ;) {\r\n t = r;\r\n r = half.times(t.plus(div(x, t, dp, 1)));\r\n\r\n if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {\r\n\r\n // The exponent of r may here be one less than the final result exponent,\r\n // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\r\n // are indexed correctly.\r\n if (r.e < e) --s;\r\n n = n.slice(s - 3, s + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\r\n // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\r\n // iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the\r\n // exact result as the nines may infinitely repeat.\r\n if (!rep) {\r\n round(t, t.e + DECIMAL_PLACES + 2, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n dp += 4;\r\n s += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\r\n // result. If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n round(r, r.e + DECIMAL_PLACES + 2, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in exponential notation and\r\n * rounded using ROUNDING_MODE to dp fixed decimal places.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toExponential = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp++;\r\n }\r\n return format(this, dp, rm, 1);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounding\r\n * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\r\n *\r\n * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\r\n * but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n */\r\n P.toFixed = function (dp, rm) {\r\n if (dp != null) {\r\n intCheck(dp, 0, MAX);\r\n dp = dp + this.e + 1;\r\n }\r\n return format(this, dp, rm);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in fixed-point notation rounded\r\n * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\r\n * of the format or FORMAT object (see BigNumber.set).\r\n *\r\n * The formatting object may contain some or all of the properties shown below.\r\n *\r\n * FORMAT = {\r\n * prefix: '',\r\n * groupSize: 3,\r\n * secondaryGroupSize: 0,\r\n * groupSeparator: ',',\r\n * decimalSeparator: '.',\r\n * fractionGroupSize: 0,\r\n * fractionGroupSeparator: '\\xA0', // non-breaking space\r\n * suffix: ''\r\n * };\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n * [format] {object} Formatting options. See FORMAT pbject above.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}'\r\n * '[BigNumber Error] Argument not an object: {format}'\r\n */\r\n P.toFormat = function (dp, rm, format) {\r\n var str,\r\n x = this;\r\n\r\n if (format == null) {\r\n if (dp != null && rm && typeof rm == 'object') {\r\n format = rm;\r\n rm = null;\r\n } else if (dp && typeof dp == 'object') {\r\n format = dp;\r\n dp = rm = null;\r\n } else {\r\n format = FORMAT;\r\n }\r\n } else if (typeof format != 'object') {\r\n throw Error\r\n (bignumberError + 'Argument not an object: ' + format);\r\n }\r\n\r\n str = x.toFixed(dp, rm);\r\n\r\n if (x.c) {\r\n var i,\r\n arr = str.split('.'),\r\n g1 = +format.groupSize,\r\n g2 = +format.secondaryGroupSize,\r\n groupSeparator = format.groupSeparator || '',\r\n intPart = arr[0],\r\n fractionPart = arr[1],\r\n isNeg = x.s < 0,\r\n intDigits = isNeg ? intPart.slice(1) : intPart,\r\n len = intDigits.length;\r\n\r\n if (g2) {\r\n i = g1;\r\n g1 = g2;\r\n g2 = i;\r\n len -= i;\r\n }\r\n\r\n if (g1 > 0 && len > 0) {\r\n i = len % g1 || g1;\r\n intPart = intDigits.substr(0, i);\r\n for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1);\r\n if (g2 > 0) intPart += groupSeparator + intDigits.slice(i);\r\n if (isNeg) intPart = '-' + intPart;\r\n }\r\n\r\n str = fractionPart\r\n ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize)\r\n ? fractionPart.replace(new RegExp('\\\\d{' + g2 + '}\\\\B', 'g'),\r\n '$&' + (format.fractionGroupSeparator || ''))\r\n : fractionPart)\r\n : intPart;\r\n }\r\n\r\n return (format.prefix || '') + str + (format.suffix || '');\r\n };\r\n\r\n\r\n /*\r\n * Return an array of two BigNumbers representing the value of this BigNumber as a simple\r\n * fraction with an integer numerator and an integer denominator.\r\n * The denominator will be a positive non-zero value less than or equal to the specified\r\n * maximum denominator. If a maximum denominator is not specified, the denominator will be\r\n * the lowest value necessary to represent the number exactly.\r\n *\r\n * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator.\r\n *\r\n * '[BigNumber Error] Argument {not an integer|out of range} : {md}'\r\n */\r\n P.toFraction = function (md) {\r\n var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s,\r\n x = this,\r\n xc = x.c;\r\n\r\n if (md != null) {\r\n n = new BigNumber(md);\r\n\r\n // Throw if md is less than one or is not an integer, unless it is Infinity.\r\n if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) {\r\n throw Error\r\n (bignumberError + 'Argument ' +\r\n (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n));\r\n }\r\n }\r\n\r\n if (!xc) return new BigNumber(x);\r\n\r\n d = new BigNumber(ONE);\r\n n1 = d0 = new BigNumber(ONE);\r\n d1 = n0 = new BigNumber(ONE);\r\n s = coeffToString(xc);\r\n\r\n // Determine initial denominator.\r\n // d is a power of 10 and the minimum max denominator that specifies the value exactly.\r\n e = d.e = s.length - x.e - 1;\r\n d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];\r\n md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n;\r\n\r\n exp = MAX_EXP;\r\n MAX_EXP = 1 / 0;\r\n n = new BigNumber(s);\r\n\r\n // n0 = d1 = 0\r\n n0.c[0] = 0;\r\n\r\n for (; ;) {\r\n q = div(n, d, 0, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.comparedTo(md) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n n1 = n0.plus(q.times(d2 = n1));\r\n n0 = d2;\r\n d = n.minus(q.times(d2 = d));\r\n n = d2;\r\n }\r\n\r\n d2 = div(md.minus(d0), d1, 0, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n e = e * 2;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1\r\n r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(\r\n div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\r\n\r\n MAX_EXP = exp;\r\n\r\n return r;\r\n };\r\n\r\n\r\n /*\r\n * Return the value of this BigNumber converted to a number primitive.\r\n */\r\n P.toNumber = function () {\r\n return +valueOf(this);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber rounded to sd significant digits\r\n * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\r\n * necessary to represent the integer part of the value in fixed-point notation, then use\r\n * exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}'\r\n */\r\n P.toPrecision = function (sd, rm) {\r\n if (sd != null) intCheck(sd, 1, MAX);\r\n return format(this, sd, rm, 2);\r\n };\r\n\r\n\r\n /*\r\n * Return a string representing the value of this BigNumber in base b, or base 10 if b is\r\n * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\r\n * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\r\n * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\r\n * TO_EXP_NEG, return exponential notation.\r\n *\r\n * [b] {number} Integer, 2 to ALPHABET.length inclusive.\r\n *\r\n * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}'\r\n */\r\n P.toString = function (b) {\r\n var str,\r\n n = this,\r\n s = n.s,\r\n e = n.e;\r\n\r\n // Infinity or NaN?\r\n if (e === null) {\r\n if (s) {\r\n str = 'Infinity';\r\n if (s < 0) str = '-' + str;\r\n } else {\r\n str = 'NaN';\r\n }\r\n } else {\r\n if (b == null) {\r\n str = e <= TO_EXP_NEG || e >= TO_EXP_POS\r\n ? toExponential(coeffToString(n.c), e)\r\n : toFixedPoint(coeffToString(n.c), e, '0');\r\n } else if (b === 10 && alphabetHasNormalDecimalDigits) {\r\n n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE);\r\n str = toFixedPoint(coeffToString(n.c), n.e, '0');\r\n } else {\r\n intCheck(b, 2, ALPHABET.length, 'Base');\r\n str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true);\r\n }\r\n\r\n if (s < 0 && n.c[0]) str = '-' + str;\r\n }\r\n\r\n return str;\r\n };\r\n\r\n\r\n /*\r\n * Return as toString, but do not accept a base argument, and include the minus sign for\r\n * negative zero.\r\n */\r\n P.valueOf = P.toJSON = function () {\r\n return valueOf(this);\r\n };\r\n\r\n\r\n P._isBigNumber = true;\r\n\r\n P[Symbol.toStringTag] = 'BigNumber';\r\n\r\n // Node.js v10.12.0+\r\n P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf;\r\n\r\n if (configObject != null) BigNumber.set(configObject);\r\n\r\n return BigNumber;\r\n}\r\n\r\n\r\n// PRIVATE HELPER FUNCTIONS\r\n\r\n// These functions don't need access to variables,\r\n// e.g. DECIMAL_PLACES, in the scope of the `clone` function above.\r\n\r\n\r\nfunction bitFloor(n) {\r\n var i = n | 0;\r\n return n > 0 || n === i ? i : i - 1;\r\n}\r\n\r\n\r\n// Return a coefficient array as a string of base 10 digits.\r\nfunction coeffToString(a) {\r\n var s, z,\r\n i = 1,\r\n j = a.length,\r\n r = a[0] + '';\r\n\r\n for (; i < j;) {\r\n s = a[i++] + '';\r\n z = LOG_BASE - s.length;\r\n for (; z--; s = '0' + s);\r\n r += s;\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (j = r.length; r.charCodeAt(--j) === 48;);\r\n\r\n return r.slice(0, j + 1 || 1);\r\n}\r\n\r\n\r\n// Compare the value of BigNumbers x and y.\r\nfunction compare(x, y) {\r\n var a, b,\r\n xc = x.c,\r\n yc = y.c,\r\n i = x.s,\r\n j = y.s,\r\n k = x.e,\r\n l = y.e;\r\n\r\n // Either NaN?\r\n if (!i || !j) return null;\r\n\r\n a = xc && !xc[0];\r\n b = yc && !yc[0];\r\n\r\n // Either zero?\r\n if (a || b) return a ? b ? 0 : -j : i;\r\n\r\n // Signs differ?\r\n if (i != j) return i;\r\n\r\n a = i < 0;\r\n b = k == l;\r\n\r\n // Either Infinity?\r\n if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1;\r\n\r\n // Compare exponents.\r\n if (!b) return k > l ^ a ? 1 : -1;\r\n\r\n j = (k = xc.length) < (l = yc.length) ? k : l;\r\n\r\n // Compare digit by digit.\r\n for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1;\r\n\r\n // Compare lengths.\r\n return k == l ? 0 : k > l ^ a ? 1 : -1;\r\n}\r\n\r\n\r\n/*\r\n * Check that n is a primitive number, an integer, and in range, otherwise throw.\r\n */\r\nfunction intCheck(n, min, max, name) {\r\n if (n < min || n > max || n !== mathfloor(n)) {\r\n throw Error\r\n (bignumberError + (name || 'Argument') + (typeof n == 'number'\r\n ? n < min || n > max ? ' out of range: ' : ' not an integer: '\r\n : ' not a primitive number: ') + String(n));\r\n }\r\n}\r\n\r\n\r\n// Assumes finite n.\r\nfunction isOdd(n) {\r\n var k = n.c.length - 1;\r\n return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;\r\n}\r\n\r\n\r\nfunction toExponential(str, e) {\r\n return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) +\r\n (e < 0 ? 'e' : 'e+') + e;\r\n}\r\n\r\n\r\nfunction toFixedPoint(str, e, z) {\r\n var len, zs;\r\n\r\n // Negative exponent?\r\n if (e < 0) {\r\n\r\n // Prepend zeros.\r\n for (zs = z + '.'; ++e; zs += z);\r\n str = zs + str;\r\n\r\n // Positive exponent\r\n } else {\r\n len = str.length;\r\n\r\n // Append zeros.\r\n if (++e > len) {\r\n for (zs = z, e -= len; --e; zs += z);\r\n str += zs;\r\n } else if (e < len) {\r\n str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// EXPORT\r\n\r\n\r\nexport var BigNumber = clone();\r\n\r\nexport default BigNumber;\r\n","type Comparator<T> = (a: T, b: T) => number;\ntype Predicate<T> = (value: T) => boolean;\n\nclass SplayTreeNode<K, Node extends SplayTreeNode<K, Node>> {\n readonly key: K;\n\n left: Node | null = null;\n right: Node | null = null;\n\n constructor(key: K) {\n this.key = key;\n }\n}\n\nclass SplayTreeSetNode<K> extends SplayTreeNode<K, SplayTreeSetNode<K>> {\n constructor(key: K) {\n super(key);\n }\n}\n\nclass SplayTreeMapNode<K, V> extends SplayTreeNode<K, SplayTreeMapNode<K, V>> {\n readonly value: V;\n\n constructor(key: K, value: V) {\n super(key);\n this.value = value;\n }\n\n replaceValue(value: V) {\n const node = new SplayTreeMapNode(this.key, value);\n node.left = this.left;\n node.right = this.right;\n return node;\n }\n}\n\nabstract class SplayTree<K, Node extends SplayTreeNode<K, Node>> {\n protected abstract root: Node | null;\n\n public size = 0;\n\n protected modificationCount = 0;\n\n protected splayCount = 0;\n\n protected abstract compare: Comparator<K>;\n\n protected abstract validKey: Predicate<unknown>;\n\n protected splay(key: K) {\n const root = this.root;\n if (root == null) {\n this.compare(key, key);\n return -1;\n }\n\n let right: Node | null = null;\n let newTreeRight: Node | null = null;\n let left: Node | null = null;\n let newTreeLeft: Node | null = null;\n let current = root;\n const compare = this.compare;\n let comp: number;\n while (true) {\n comp = compare(current.key, key);\n if (comp > 0) {\n let currentLeft = current.left;\n if (currentLeft == null) break;\n comp = compare(currentLeft.key, key);\n if (comp > 0) {\n current.left = currentLeft.right;\n currentLeft.right = current;\n current = currentLeft;\n currentLeft = current.left;\n if (currentLeft == null) break;\n }\n if (right == null) {\n newTreeRight = current;\n } else {\n right.left = current;\n }\n right = current;\n current = currentLeft;\n } else if (comp < 0) {\n let currentRight = current.right;\n if (currentRight == null) break;\n comp = compare(currentRight.key, key);\n if (comp < 0) {\n current.right = currentRight.left;\n currentRight.left = current;\n current = currentRight;\n currentRight = current.right;\n if (currentRight == null) break;\n }\n if (left == null) {\n newTreeLeft = current;\n } else {\n left.right = current;\n }\n left = current;\n current = currentRight;\n } else {\n break;\n }\n }\n if (left != null) {\n left.right = current.left;\n current.left = newTreeLeft;\n }\n if (right != null) {\n right.left = current.right;\n current.right = newTreeRight;\n }\n if (this.root !== current) {\n this.root = current;\n this.splayCount++;\n }\n return comp;\n }\n\n protected splayMin(node: Node) {\n let current = node;\n let nextLeft = current.left;\n while (nextLeft != null) {\n const left = nextLeft;\n current.left = left.right;\n left.right = current;\n current = left;\n nextLeft = current.left;\n }\n return current;\n }\n\n protected splayMax(node: Node) {\n let current = node;\n let nextRight = current.right;\n while (nextRight != null) {\n const right = nextRight;\n current.right = right.left;\n right.left = current;\n current = right;\n nextRight = current.right;\n }\n return current;\n }\n\n protected _delete(key: K) {\n if (this.root == null) return null;\n const comp = this.splay(key);\n if (comp != 0) return null;\n let root = this.root;\n const result = root;\n const left = root.left;\n this.size--;\n if (left == null) {\n this.root = root.right;\n } else {\n const right = root.right;\n root = this.splayMax(left);\n\n root.right = right;\n this.root = root;\n }\n this.modificationCount++;\n return result;\n }\n\n protected addNewRoot(node: Node, comp: number) {\n this.size++;\n this.modificationCount++;\n const root = this.root;\n if (root == null) {\n this.root = node;\n return;\n }\n if (comp < 0) {\n node.left = root;\n node.right = root.right;\n root.right = null;\n } else {\n node.right = root;\n node.left = root.left;\n root.left = null;\n }\n this.root = node;\n }\n\n protected _first() {\n const root = this.root;\n if (root == null) return null;\n this.root = this.splayMin(root);\n return this.root;\n }\n\n protected _last() {\n const root = this.root;\n if (root == null) return null;\n this.root = this.splayMax(root);\n return this.root;\n }\n\n public clear() {\n this.root = null;\n this.size = 0;\n this.modificationCount++;\n }\n\n public has(key: unknown) {\n return this.validKey(key) && this.splay(key as K) == 0;\n }\n\n protected defaultCompare(): Comparator<K> {\n return (a: K, b: K) => a < b ? -1 : a > b ? 1 : 0;\n }\n\n protected wrap(): SplayTreeWrapper<K, Node> {\n return {\n getRoot: () => { return this.root },\n setRoot: (root) => { this.root = root },\n getSize: () => { return this.size },\n getModificationCount: () => { return this.modificationCount },\n getSplayCount: () => { return this.splayCount },\n setSplayCount: (count) => { this.splayCount = count },\n splay: (key) => { return this.splay(key) },\n has: (key) => { return this.has(key) },\n };\n }\n}\n\nexport class SplayTreeMap<K, V> extends SplayTree<K, SplayTreeMapNode<K, V>> implements Iterable<[K, V]>, Map<K, V> {\n protected root: SplayTreeMapNode<K, V> | null = null;\n\n protected compare: Comparator<K>;\n protected validKey: Predicate<unknown>;\n\n constructor(compare?: Comparator<K>, isValidKey?: Predicate<unknown>) {\n super();\n this.compare = compare ?? this.defaultCompare();\n this.validKey = isValidKey ?? ((a: unknown) => a != null && a != undefined);\n }\n\n delete(key: unknown) {\n if (!this.validKey(key)) return false;\n return this._delete(key as K) != null;\n }\n\n forEach(f: (value: V, key: K, map: Map<K, V>) => void) {\n const nodes: Iterator<[K, V]> = new SplayTreeMapEntryIterableIterator<K, V>(this.wrap());\n let result: IteratorResult<[K, V]>;\n while (result = nodes.next(), !result.done) {\n f(result.value[1], result.value[0], this);\n }\n }\n\n get(key: unknown): V | undefined {\n if (!this.validKey(key)) return undefined;\n if (this.root != null) {\n const comp = this.splay(key as K);\n if (comp == 0) {\n return this.root!.value;\n }\n }\n return undefined;\n }\n\n hasValue(value: unknown) {\n const initialSplayCount = this.splayCount;\n const visit = (node: SplayTreeMapNode<K, V> | null) => {\n while (node != null) {\n if (node.value == value) return true;\n if (initialSplayCount != this.splayCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (node.right != null && visit(node.right)) {\n return true;\n }\n node = node.left;\n }\n return false;\n }\n\n return visit(this.root);\n }\n\n set(key: K, value: V) {\n const comp = this.splay(key);\n if (comp == 0) {\n this.root = this.root!.replaceValue(value);\n this.splayCount += 1;\n return this;\n }\n this.addNewRoot(new SplayTreeMapNode(key, value), comp);\n return this;\n }\n\n setAll(other: Map<K, V>) {\n other.forEach((value: V, key: K) => {\n this.set(key, value);\n });\n }\n\n setIfAbsent(key: K, ifAbsent: () => V) {\n let comp = this.splay(key);\n if (comp == 0) {\n return this.root!.value;\n }\n const modificationCount = this.modificationCount;\n const splayCount = this.splayCount;\n const value = ifAbsent();\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (splayCount != this.splayCount) {\n comp = this.splay(key);\n }\n this.addNewRoot(new SplayTreeMapNode(key, value), comp);\n return value;\n }\n\n isEmpty() {\n return this.root == null;\n }\n\n isNotEmpty() {\n return !this.isEmpty();\n }\n\n firstKey() {\n if (this.root == null) return null;\n return this._first()!.key;\n }\n\n lastKey() {\n if (this.root == null) return null;\n return this._last()!.key;\n }\n\n lastKeyBefore(key: K) {\n if (key == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(key);\n if (comp < 0) return this.root!.key;\n let node: SplayTreeMapNode<K, V> | null = this.root!.left;\n if (node == null) return null;\n let nodeRight = node.right;\n while (nodeRight != null) {\n node = nodeRight;\n nodeRight = node.right;\n }\n return node!.key;\n }\n\n firstKeyAfter(key: K) {\n if (key == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(key);\n if (comp > 0) return this.root!.key;\n let node: SplayTreeMapNode<K, V> | null = this.root!.right;\n if (node == null) return null;\n let nodeLeft = node.left;\n while (nodeLeft != null) {\n node = nodeLeft;\n nodeLeft = node.left;\n }\n return node!.key;\n }\n\n update(key: K, update: (value: V) => V, ifAbsent?: () => V) {\n let comp = this.splay(key);\n if (comp == 0) {\n const modificationCount = this.modificationCount;\n const splayCount = this.splayCount;\n const newValue = update(this.root!.value);\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (splayCount != this.splayCount) {\n this.splay(key);\n }\n this.root = this.root!.replaceValue(newValue);\n this.splayCount += 1;\n return newValue;\n }\n if (ifAbsent != null) {\n const modificationCount = this.modificationCount;\n const splayCount = this.splayCount;\n const newValue = ifAbsent();\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (splayCount != this.splayCount) {\n comp = this.splay(key);\n }\n this.addNewRoot(new SplayTreeMapNode(key, newValue), comp);\n return newValue;\n }\n throw \"Invalid argument (key): Key not in map.\"\n }\n\n updateAll(update: (key: K, value: V) => V) {\n const root = this.root;\n if (root == null) return;\n const iterator = new SplayTreeMapEntryIterableIterator(this.wrap());\n let node: IteratorResult<[K, V]>;\n while (node = iterator.next(), !node.done) {\n const newValue = update(...node.value);\n iterator.replaceValue(newValue);\n }\n }\n\n keys(): IterableIterator<K> {\n return new SplayTreeKeyIterableIterator<K, SplayTreeMapNode<K, V>>(this.wrap());\n }\n\n values(): IterableIterator<V> {\n return new SplayTreeValueIterableIterator<K, V>(this.wrap());\n }\n\n entries(): IterableIterator<[K, V]> {\n return this[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[K, V]> {\n return new SplayTreeMapEntryIterableIterator<K, V>(this.wrap());\n }\n\n [Symbol.toStringTag] = '[object Map]'\n}\n\nexport class SplayTreeSet<E> extends SplayTree<E, SplayTreeSetNode<E>> implements Iterable<E>, Set<E> {\n protected root: SplayTreeSetNode<E> | null = null;\n\n protected compare: Comparator<E>;\n protected validKey: Predicate<unknown>;\n\n constructor(compare?: Comparator<E>, isValidKey?: Predicate<unknown>) {\n super();\n this.compare = compare ?? this.defaultCompare();\n this.validKey = isValidKey ?? ((v: unknown) => v != null && v != undefined );\n }\n\n delete(element: unknown) {\n if (!this.validKey(element)) return false;\n return this._delete(element as E) != null;\n }\n\n deleteAll(elements: Iterable<unknown>) {\n for (const element of elements) {\n this.delete(element);\n }\n }\n\n forEach(f: (element: E, element2: E, set: Set<E>) => void) {\n const nodes: Iterator<E> = this[Symbol.iterator]();\n let result: IteratorResult<E>;\n while (result = nodes.next(), !result.done) {\n f(result.value, result.value, this);\n }\n }\n\n add(element: E) {\n const compare = this.splay(element);\n if (compare != 0) this.addNewRoot(new SplayTreeSetNode(element), compare);\n return this;\n }\n\n addAndReturn(element: E) {\n const compare = this.splay(element);\n if (compare != 0) this.addNewRoot(new SplayTreeSetNode(element), compare);\n return this.root!.key;\n }\n\n addAll(elements: Iterable<E>) {\n for (const element of elements) {\n this.add(element);\n }\n }\n\n isEmpty() {\n return this.root == null;\n }\n\n isNotEmpty() {\n return this.root != null;\n }\n\n single() {\n if (this.size == 0) throw \"Bad state: No element\";\n if (this.size > 1) throw \"Bad state: Too many element\";\n return this.root!.key;\n }\n\n first() {\n if (this.size == 0) throw \"Bad state: No element\";\n return this._first()!.key;\n }\n\n last() {\n if (this.size == 0) throw \"Bad state: No element\";\n return this._last()!.key;\n }\n\n lastBefore(element: E) {\n if (element == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(element);\n if (comp < 0) return this.root!.key;\n let node: SplayTreeSetNode<E> | null = this.root!.left;\n if (node == null) return null;\n let nodeRight = node.right;\n while (nodeRight != null) {\n node = nodeRight;\n nodeRight = node.right;\n }\n return node!.key;\n }\n\n firstAfter(element: E) {\n if (element == null) throw \"Invalid arguments(s)\";\n if (this.root == null) return null;\n const comp = this.splay(element);\n if (comp > 0) return this.root!.key;\n let node: SplayTreeSetNode<E> | null = this.root!.right;\n if (node == null) return null;\n let nodeLeft = node.left;\n while (nodeLeft != null) {\n node = nodeLeft;\n nodeLeft = node.left;\n }\n return node!.key;\n }\n\n retainAll(elements: Iterable<unknown>) {\n const retainSet = new SplayTreeSet<E>(this.compare, this.validKey);\n const modificationCount = this.modificationCount;\n for (const object of elements) {\n if (modificationCount != this.modificationCount) {\n throw \"Concurrent modification during iteration.\";\n }\n if (this.validKey(object) && this.splay(object as E) == 0) {\n retainSet.add(this.root!.key);\n }\n }\n if (retainSet.size != this.size) {\n this.root = retainSet.root;\n this.size = retainSet.size;\n this.modificationCount++;\n }\n }\n\n lookup(object: unknown): E | null {\n if (!this.validKey(object)) return null;\n const comp = this.splay(object as E);\n if (comp != 0) return null;\n return this.root!.key;\n }\n\n intersection(other: Set<unknown>): Set<E> {\n const result = new SplayTreeSet<E>(this.compare, this.validKey);\n for (const element of this) {\n if (other.has(element)) result.add(element);\n }\n return result;\n }\n\n difference(other: Set<unknown>): Set<E> {\n const result = new SplayTreeSet<E>(this.compare, this.validKey);\n for (const element of this) {\n if (!other.has(element)) result.add(element);\n }\n return result;\n }\n\n union(other: Set<E>): Set<E> {\n const u = this.clone();\n u.addAll(other);\n return u;\n }\n\n protected clone() {\n const set = new SplayTreeSet<E>(this.compare, this.validKey);\n set.size = this.size;\n set.root = this.copyNode<SplayTreeSetNode<E>>(this.root);\n return set;\n }\n\n protected copyNode<Node extends SplayTreeNode<E, Node>>(node: Node | null) {\n if (node == null) return null;\n function copyChildren(node: Node, dest: SplayTreeSetNode<E>) {\n let left: Node | null;\n let right: Node | null;\n do {\n left = node.left;\n right = node.right;\n if (left != null) {\n const newLeft = new SplayTreeSetNode<E>(left.key);\n dest.left = newLeft;\n copyChildren(left, newLeft);\n }\n if (right != null) {\n const newRight = new SplayTreeSetNode<E>(right.key);\n dest.right = newRight;\n node = right;\n dest = newRight;\n }\n } while (right != null);\n }\n\n const result = new SplayTreeSetNode<E>(node.key);\n copyChildren(node, result);\n return result;\n }\n\n toSet(): Set<E> {\n return this.clone();\n }\n\n entries(): IterableIterator<[E, E]> {\n return new SplayTreeSetEntryIterableIterator<E, SplayTreeSetNode<E>>(this.wrap());\n }\n\n keys(): IterableIterator<E> {\n return this[Symbol.iterator]();\n }\n \n values(): IterableIterator<E> {\n return this[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<E> {\n return new SplayTreeKeyIterableIterator<E, SplayTreeSetNode<E>>(this.wrap());\n }\n\n [Symbol.toStringTag] = '[object Set]'\n}\n\ninterface SplayTreeWrapper<K, Node extends SplayTreeNode<K, Node>> {\n getRoot: () => Node | null;\n setRoot: (root: Node | null) => void;\n getSize: () => number;\n getModificationCount: () => number;\n getSplayCount: () => number;\n setSplayCount: (count: number) => void;\n splay: (key: K) => number;\n has: (key: unknown) => boolean;\n}\n\ntype SplayTreeMapWrapper<K, V> = SplayTreeWrapper<K, SplayTreeMapNode<K, V>>;\n\nabstract class SplayTreeIterableIterator<K, Node extends SplayTreeNode<K, Node>, T> implements IterableIterator<T> {\n protected readonly tree: SplayTreeWrapper<K, Node>;\n\n protected readonly path = new Array<Node>();\n\n protected modificationCount: number | null = null;\n\n protected splayCount: number;\n\n constructor(tree: SplayTreeWrapper<K, Node>) {\n this.tree = tree;\n this.splayCount = tree.getSplayCount();\n }\n\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n\n next(): IteratorResult<T, null> {\n if (this.moveNext()) return { done: false, value: this.current()! }\n return { done: true, value: null }\n }\n\n protected current() {\n if (!this.path.length) return null;\n const node = this.path[this.path.length - 1];\n return this.getValue(node);\n }\n\n protected rebuildPath(key: K) {\n this.path.splice(0, this.path.length)\n this.tree.splay(key);\n this.path.push(this.tree.getRoot()!);\n this.splayCount = this.tree.getSplayCount();\n }\n\n protected findLeftMostDescendent(node: Node | null) {\n while (node != null) {\n this.path.push(node);\n node = node.left;\n }\n }\n\n protected moveNext() {\n if (this.modificationCount != this.tree.getModificationCount()) {\n if (this.modificationCount == null) {\n this.modificationCount = this.tree.getModificationCount();\n let node = this.tree.getRoot();\n while (node != null) {\n this.path.push(node);\n node = node.left;\n }\n return this.path.length > 0;\n }\n throw \"Concurrent modification during iteration.\";\n }\n if (!this.path.length) return false;\n if (this.splayCount != this.tree.getSplayCount()) {\n this.rebuildPath(this.path[this.path.length - 1].key);\n }\n let node = this.path[this.path.length - 1];\n let next = node.right;\n if (next != null) {\n while (next != null) {\n this.path.push(next);\n next = next.left;\n }\n return true;\n }\n this.path.pop();\n while (this.path.length && this.path[this.path.length - 1].right === node) {\n node = this.path.pop()!;\n }\n return this.path.length > 0;\n }\n\n protected abstract getValue(node: Node): T\n}\n\nclass SplayTreeKeyIterableIterator<K, Node extends SplayTreeNode<K, Node>> extends SplayTreeIterableIterator<K, Node, K> {\n\n protected getValue(node: Node) {\n return node.key;\n }\n}\n\nclass SplayTreeSetEntryIterableIterator<K, Node extends SplayTreeNode<K, Node>> extends SplayTreeIterableIterator<K, Node, [K, K]> {\n\n protected getValue(node: Node): [K, K] {\n return [node.key, node.key];\n }\n}\n\nclass SplayTreeValueIterableIterator<K, V> extends SplayTreeIterableIterator<K, SplayTreeMapNode<K, V>, V> {\n\n constructor(map: SplayTreeMapWrapper<K, V>) {\n super(map);\n }\n\n protected getValue(node: SplayTreeMapNode<K, V>) {\n return node.value;\n }\n}\n\nclass SplayTreeMapEntryIterableIterator<K, V> extends SplayTreeIterableIterator<K, SplayTreeMapNode<K, V>, [K, V]> {\n\n constructor(map: SplayTreeMapWrapper<K, V>) {\n super(map);\n }\n\n protected getValue(node: SplayTreeMapNode<K, V>): [K, V] {\n return [node.key, node.value];\n }\n\n replaceValue(value: V) {\n if (this.modificationCount != this.tree.getModificationCount()) {\n throw \"Concurrent modification during iteration.\";\n }\n if (this.splayCount != this.tree.getSplayCount()) {\n this.rebuildPath(this.path[this.path.length - 1].key);\n }\n const last = this.path.pop()!;\n const newLast = last.replaceValue(value);\n if (!this.path.length) {\n this.tree.setRoot(newLast);\n } else {\n const parent = this.path[this.path.length - 1];\n if (last === parent.left) {\n parent.left = newLast;\n } else {\n parent.right = newLast;\n }\n }\n this.path.push(newLast);\n const count = this.tree.getSplayCount() + 1;\n this.tree.setSplayCount(count);\n this.splayCount = count;\n }\n}","import BigNumber from \"bignumber.js\";\nimport { Bbox } from \"./bbox.js\";\nimport { precision } from \"./precision.js\";\nimport Segment from \"./segment.js\";\nimport { Point } from \"./sweep-event.js\";\n\nexport type Ring = [number, number][]\nexport type Poly = Ring[]\nexport type MultiPoly = Poly[]\nexport type Geom = Poly | MultiPoly\n\nexport class RingIn {\n poly: PolyIn\n isExterior: boolean\n segments: Segment[]\n bbox: Bbox\n\n constructor(geomRing: Ring, poly: PolyIn, isExterior: boolean) {\n if (!Array.isArray(geomRing) || geomRing.length === 0) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n this.poly = poly\n this.isExterior = isExterior\n this.segments = []\n\n if (\n typeof geomRing[0][0] !== \"number\" ||\n typeof geomRing[0][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n const firstPoint = precision.snap({ x: new BigNumber(geomRing[0][0]), y: new BigNumber(geomRing[0][1]) }) as Point\n this.bbox = {\n ll: { x: firstPoint.x, y: firstPoint.y },\n ur: { x: firstPoint.x, y: firstPoint.y },\n }\n\n let prevPoint = firstPoint\n for (let i = 1, iMax = geomRing.length; i < iMax; i++) {\n if (\n typeof geomRing[i][0] !== \"number\" ||\n typeof geomRing[i][1] !== \"number\"\n ) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n const point = precision.snap({ x: new BigNumber(geomRing[i][0]), y: new BigNumber(geomRing[i][1]) }) as Point\n // skip repeated points\n if (point.x.eq(prevPoint.x) && point.y.eq(prevPoint.y)) continue\n this.segments.push(Segment.fromRing(prevPoint, point, this))\n if (point.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = point.x\n if (point.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = point.y\n if (point.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = point.x\n if (point.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = point.y\n prevPoint = point\n }\n // add segment from last to first if last is not the same as first\n if (!firstPoint.x.eq(prevPoint.x) || !firstPoint.y.eq(prevPoint.y)) {\n this.segments.push(Segment.fromRing(prevPoint, firstPoint, this))\n }\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.segments.length; i < iMax; i++) {\n const segment = this.segments[i]\n sweepEvents.push(segment.leftSE)\n sweepEvents.push(segment.rightSE)\n }\n return sweepEvents\n }\n}\n\nexport class PolyIn {\n multiPoly: MultiPolyIn\n exteriorRing: RingIn\n interiorRings: RingIn[]\n bbox: Bbox\n\n constructor(geomPoly: Poly, multiPoly: MultiPolyIn) {\n if (!Array.isArray(geomPoly)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n this.exteriorRing = new RingIn(geomPoly[0], this, true)\n // copy by value\n this.bbox = {\n ll: { x: this.exteriorRing.bbox.ll.x, y: this.exteriorRing.bbox.ll.y },\n ur: { x: this.exteriorRing.bbox.ur.x, y: this.exteriorRing.bbox.ur.y },\n }\n this.interiorRings = []\n for (let i = 1, iMax = geomPoly.length; i < iMax; i++) {\n const ring = new RingIn(geomPoly[i], this, false)\n if (ring.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = ring.bbox.ll.x\n if (ring.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = ring.bbox.ll.y\n if (ring.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = ring.bbox.ur.x\n if (ring.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = ring.bbox.ur.y\n this.interiorRings.push(ring)\n }\n this.multiPoly = multiPoly\n }\n\n getSweepEvents() {\n const sweepEvents = this.exteriorRing.getSweepEvents()\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringSweepEvents = this.interiorRings[i].getSweepEvents()\n for (let j = 0, jMax = ringSweepEvents.length; j < jMax; j++) {\n sweepEvents.push(ringSweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n\nexport class MultiPolyIn {\n isSubject: boolean\n polys: PolyIn[]\n bbox: Bbox\n\n constructor(geom: Geom, isSubject: boolean) {\n if (!Array.isArray(geom)) {\n throw new Error(\"Input geometry is not a valid Polygon or MultiPolygon\")\n }\n\n try {\n // if the input looks like a polygon, convert it to a multipolygon\n if (typeof geom[0][0][0] === \"number\") geom = [geom as Poly]\n } catch (ex) {\n // The input is either malformed or has empty arrays.\n // In either case, it will be handled later on.\n }\n\n this.polys = []\n this.bbox = {\n ll: { x: new BigNumber(Number.POSITIVE_INFINITY), y: new BigNumber(Number.POSITIVE_INFINITY) },\n ur: { x: new BigNumber(Number.NEGATIVE_INFINITY), y: new BigNumber(Number.NEGATIVE_INFINITY) },\n }\n for (let i = 0, iMax = geom.length; i < iMax; i++) {\n const poly = new PolyIn(geom[i] as Poly, this)\n if (poly.bbox.ll.x.isLessThan(this.bbox.ll.x)) this.bbox.ll.x = poly.bbox.ll.x\n if (poly.bbox.ll.y.isLessThan(this.bbox.ll.y)) this.bbox.ll.y = poly.bbox.ll.y\n if (poly.bbox.ur.x.isGreaterThan(this.bbox.ur.x)) this.bbox.ur.x = poly.bbox.ur.x\n if (poly.bbox.ur.y.isGreaterThan(this.bbox.ur.y)) this.bbox.ur.y = poly.bbox.ur.y\n this.polys.push(poly)\n }\n this.isSubject = isSubject\n }\n\n getSweepEvents() {\n const sweepEvents = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polySweepEvents = this.polys[i].getSweepEvents()\n for (let j = 0, jMax = polySweepEvents.length; j < jMax; j++) {\n sweepEvents.push(polySweepEvents[j])\n }\n }\n return sweepEvents\n }\n}\n","export default <T>(x: T) => {\n return () => {\n return x\n }\n}","import BigNumber from \"bignumber.js\"\nimport constant from \"./constant.js\"\n\nexport default (eps?: number) => {\n const almostEqual = eps ? (a: BigNumber, b: BigNumber) =>\n b.minus(a).abs().isLessThanOrEqualTo(eps)\n : constant(false)\n\n return (a: BigNumber, b: BigNumber) => {\n if (almostEqual(a, b)) return 0\n\n return a.comparedTo(b)\n }\n}","import BigNumber from \"bignumber.js\";\nimport constant from \"./constant.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default function (eps?: number) {\n const almostCollinear = eps ? (area2: BigNumber, ax: BigNumber, ay: BigNumber, cx: BigNumber, cy: BigNumber) =>\n area2.exponentiatedBy(2).isLessThanOrEqualTo(\n cx.minus(ax).exponentiatedBy(2).plus(cy.minus(ay).exponentiatedBy(2))\n .times(eps))\n : constant(false)\n\n return (a: Vector, b: Vector, c: Vector) => {\n const ax = a.x, ay = a.y, cx = c.x, cy = c.y\n\n const area2 = ay.minus(cy).times(b.x.minus(cx)).minus(ax.minus(cx).times(b.y.minus(cy)))\n\n if (almostCollinear(area2, ax, ay, cx, cy)) return 0\n\n return area2.comparedTo(0)\n }\n}","import BigNumber from \"bignumber.js\";\nimport { SplayTreeSet } from \"splaytree-ts\"\nimport compare from \"./compare.js\";\nimport identity from \"./identity.js\";\nimport { Vector } from \"./vector.js\";\n\nexport default (eps?: number) => {\n if (eps) {\n\n const xTree = new SplayTreeSet(compare(eps))\n const yTree = new SplayTreeSet(compare(eps))\n\n const snapCoord = (coord: BigNumber, tree: SplayTreeSet<BigNumber>) => {\n return tree.addAndReturn(coord)\n }\n\n const snap = (v: Vector) => {\n return {\n x: snapCoord(v.x, xTree),\n y: snapCoord(v.y, yTree),\n } as Vector\n }\n\n snap({ x: new BigNumber(0), y: new BigNumber(0)})\n\n return snap\n }\n\n return identity<Vector>\n}","export default <T>(x: T) => {\n return x;\n}","import compare from \"./compare.js\";\nimport orient from \"./orient.js\";\nimport snap from \"./snap.js\";\n\nconst set = (eps?: number) => {\n return {\n set: (eps?: number) => { precision = set(eps) },\n reset: () => set(eps),\n compare: compare(eps),\n snap: snap(eps),\n orient: orient(eps)\n }\n}\n\nexport let precision: ReturnType<typeof set> = set()","import { Vector } from \"./vector.js\";\n\nexport interface Bbox {\n ll: Vector;\n ur: Vector;\n}\n\n/**\n * A bounding box has the format:\n *\n * { ll: { x: xmin, y: ymin }, ur: { x: xmax, y: ymax } }\n *\n */\n\nexport const isInBbox = (bbox: Bbox, point: Vector) => {\n return (\n bbox.ll.x.isLessThanOrEqualTo(point.x) &&\n point.x.isLessThanOrEqualTo(bbox.ur.x) &&\n bbox.ll.y.isLessThanOrEqualTo(point.y) &&\n point.y.isLessThanOrEqualTo(bbox.ur.y) \n )\n}\n\n/* Returns either null, or a bbox (aka an ordered pair of points)\n * If there is only one point of overlap, a bbox with identical points\n * will be returned */\nexport const getBboxOverlap = (b1: Bbox, b2: Bbox) => {\n // check if the bboxes overlap at all\n if (\n b2.ur.x.isLessThan(b1.ll.x) ||\n b1.ur.x.isLessThan(b2.ll.x) ||\n b2.ur.y.isLessThan(b1.ll.y) ||\n b1.ur.y.isLessThan(b2.ll.y) \n )\n return null\n\n // find the middle two X values\n const lowerX = b1.ll.x.isLessThan(b2.ll.x) ? b2.ll.x : b1.ll.x\n const upperX = b1.ur.x.isLessThan(b2.ur.x) ? b1.ur.x : b2.ur.x\n\n // find the middle two Y values\n const lowerY = b1.ll.y.isLessThan(b2.ll.y) ? b2.ll.y : b1.ll.y\n const upperY = b1.ur.y.isLessThan(b2.ur.y) ? b1.ur.y : b2.ur.y\n\n // put those middle values together to get the overlap\n return { ll: { x: lowerX, y: lowerY }, ur: { x: upperX, y: upperY } } as Bbox\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport { getBboxOverlap } from \"./bbox.js\"\nimport * as geomIn from \"./geom-in.js\"\nimport { Geom } from \"./geom-in.js\"\nimport * as geomOut from \"./geom-out.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent from \"./sweep-event.js\"\nimport SweepLine from \"./sweep-line.js\"\n\nexport class Operation {\n type!: string\n numMultiPolys!: number\n\n run(type: string, geom: Geom, moreGeoms: Geom[]) {\n operation.type = type\n\n /* Convert inputs to MultiPoly objects */\n const multipolys = [new geomIn.MultiPolyIn(geom, true)]\n for (let i = 0, iMax = moreGeoms.length; i < iMax; i++) {\n multipolys.push(new geomIn.MultiPolyIn(moreGeoms[i], false))\n }\n operation.numMultiPolys = multipolys.length\n\n /* BBox optimization for difference operation\n * If the bbox of a multipolygon that's part of the clipping doesn't\n * intersect the bbox of the subject at all, we can just drop that\n * multiploygon. */\n if (operation.type === \"difference\") {\n // in place removal\n const subject = multipolys[0]\n let i = 1\n while (i < multipolys.length) {\n if (getBboxOverlap(multipolys[i].bbox, subject.bbox) !== null) i++\n else multipolys.splice(i, 1)\n }\n }\n\n /* BBox optimization for intersection operation\n * If we can find any pair of multipolygons whose bbox does not overlap,\n * then the result will be empty. */\n if (operation.type === \"intersection\") {\n // TODO: this is O(n^2) in number of polygons. By sorting the bboxes,\n // it could be optimized to O(n * ln(n))\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const mpA = multipolys[i]\n for (let j = i + 1, jMax = multipolys.length; j < jMax; j++) {\n if (getBboxOverlap(mpA.bbox, multipolys[j].bbox) === null) return []\n }\n }\n }\n\n /* Put segment endpoints in a priority queue */\n const queue = new SplayTreeSet(SweepEvent.compare)\n for (let i = 0, iMax = multipolys.length; i < iMax; i++) {\n const sweepEvents = multipolys[i].getSweepEvents()\n for (let j = 0, jMax = sweepEvents.length; j < jMax; j++) {\n queue.add(sweepEvents[j])\n }\n }\n\n /* Pass the sweep line over those endpoints */\n const sweepLine = new SweepLine(queue)\n let evt = null\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n }\n while (evt) {\n const newEvents = sweepLine.process(evt)\n for (let i = 0, iMax = newEvents.length; i < iMax; i++) {\n const evt = newEvents[i]\n if (evt.consumedBy === undefined) queue.add(evt)\n }\n if (queue.size != 0) {\n evt = queue.first()\n queue.delete(evt)\n } else {\n evt = null;\n }\n }\n\n // free some memory we don't need anymore\n precision.reset()\n\n /* Collect and compile segments we're keeping into a multipolygon */\n const ringsOut = geomOut.RingOut.factory(sweepLine.segments)\n const result = new geomOut.MultiPolyOut(ringsOut)\n return result.getGeom()\n }\n}\n\n// singleton available by import\nconst operation = new Operation()\n\nexport default operation\n","import * as bn from \"bignumber.js\";\n\nexport interface Vector {\n x: bn.BigNumber;\n y: bn.BigNumber;\n}\n\n/* Cross Product of two vectors with first point at origin */\nexport const crossProduct = (a: Vector, b: Vector) => a.x.times(b.y).minus(a.y.times(b.x))\n\n/* Dot Product of two vectors with first point at origin */\nexport const dotProduct = (a: Vector, b: Vector) => a.x.times(b.x).plus(a.y.times(b.y))\n\nexport const length = (v: Vector) => dotProduct(v, v).sqrt()\n\n/* Get the sine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const sineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return crossProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the cosine of the angle from pShared -> pAngle to pShaed -> pBase */\nexport const cosineOfAngle = (pShared: Vector, pBase: Vector, pAngle: Vector) => {\n const vBase = { x: pBase.x.minus(pShared.x), y: pBase.y.minus(pShared.y) }\n const vAngle = { x: pAngle.x.minus(pShared.x), y: pAngle.y.minus(pShared.y) }\n return dotProduct(vAngle, vBase).div(length(vAngle)).div(length(vBase))\n}\n\n/* Get the x coordinate where the given line (defined by a point and vector)\n * crosses the horizontal line with the given y coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const horizontalIntersection = (pt: Vector, v: Vector, y: bn.BigNumber) => {\n if (v.y.isZero()) return null\n return { x: pt.x.plus((v.x.div(v.y)).times(y.minus(pt.y))), y: y }\n}\n\n/* Get the y coordinate where the given line (defined by a point and vector)\n * crosses the vertical line with the given x coordiante.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const verticalIntersection = (pt: Vector, v: Vector, x: bn.BigNumber) => {\n if (v.x.isZero()) return null\n return { x: x, y: pt.y.plus((v.y.div(v.x)).times(x.minus(pt.x))) }\n}\n\n/* Get the intersection of two lines, each defined by a base point and a vector.\n * In the case of parrallel lines (including overlapping ones) returns null. */\nexport const intersection = (pt1: Vector, v1: Vector, pt2: Vector, v2: Vector) => {\n // take some shortcuts for vertical and horizontal lines\n // this also ensures we don't calculate an intersection and then discover\n // it's actually outside the bounding box of the line\n if (v1.x.isZero()) return verticalIntersection(pt2, v2, pt1.x)\n if (v2.x.isZero()) return verticalIntersection(pt1, v1, pt2.x)\n if (v1.y.isZero()) return horizontalIntersection(pt2, v2, pt1.y)\n if (v2.y.isZero()) return horizontalIntersection(pt1, v1, pt2.y)\n\n // General case for non-overlapping segments.\n // This algorithm is based on Schneider and Eberly.\n // http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf - pg 244\n\n const kross = crossProduct(v1, v2)\n if (kross.isZero()) return null\n\n const ve = { x: pt2.x.minus(pt1.x), y: pt2.y.minus(pt1.y) }\n const d1 = crossProduct(ve, v1).div(kross)\n const d2 = crossProduct(ve, v2).div(kross)\n\n // take the average of the two calculations to minimize rounding error\n const x1 = pt1.x.plus(d2.times(v1.x)),\n x2 = pt2.x.plus(d1.times(v2.x))\n const y1 = pt1.y.plus(d2.times(v1.y)),\n y2 = pt2.y.plus(d1.times(v2.y))\n const x = x1.plus(x2).div(2)\n const y = y1.plus(y2).div(2)\n return { x: x, y: y } as Vector\n}\n\n/* Given a vector, return one that is perpendicular */\nexport const perpendicular = (v: Vector) => {\n return { x: v.y.negated(), y: v.x }\n}","import BigNumber from \"bignumber.js\";\nimport Segment from \"./segment.js\"\nimport { cosineOfAngle, sineOfAngle, Vector } from \"./vector.js\"\n\nexport interface Point extends Vector {\n events: SweepEvent[];\n}\n\nexport default class SweepEvent {\n point: Point;\n isLeft: boolean;\n segment!: Segment;\n otherSE!: SweepEvent;\n consumedBy: SweepEvent | undefined;\n\n // for ordering sweep events in the sweep event queue\n static compare(a: SweepEvent, b: SweepEvent) {\n // favor event with a point that the sweep line hits first\n const ptCmp = SweepEvent.comparePoints(a.point, b.point)\n if (ptCmp !== 0) return ptCmp\n\n // the points are the same, so link them if needed\n if (a.point !== b.point) a.link(b)\n\n // favor right events over left\n if (a.isLeft !== b.isLeft) return a.isLeft ? 1 : -1\n\n // we have two matching left or right endpoints\n // ordering of this case is the same as for their segments\n return Segment.compare(a.segment, b.segment)\n }\n\n // for ordering points in sweep line order\n static comparePoints(aPt: Point, bPt: Point) {\n if (aPt.x.isLessThan(bPt.x)) return -1\n if (aPt.x.isGreaterThan(bPt.x)) return 1\n\n if (aPt.y.isLessThan(bPt.y)) return -1\n if (aPt.y.isGreaterThan(bPt.y)) return 1\n\n return 0\n }\n\n // Warning: 'point' input will be modified and re-used (for performance)\n constructor(point: Point, isLeft: boolean) {\n if (point.events === undefined) point.events = [this]\n else point.events.push(this)\n this.point = point\n this.isLeft = isLeft\n // this.segment, this.otherSE set by factory\n }\n\n link(other: SweepEvent) {\n if (other.point === this.point) {\n throw new Error(\"Tried to link already linked events\")\n }\n const otherEvents = other.point.events\n for (let i = 0, iMax = otherEvents.length; i < iMax; i++) {\n const evt = otherEvents[i]\n this.point.events.push(evt)\n evt.point = this.point\n }\n this.checkForConsuming()\n }\n\n /* Do a pass over our linked events and check to see if any pair\n * of segments match, and should be consumed. */\n checkForConsuming() {\n // FIXME: The loops in this method run O(n^2) => no good.\n // Maintain little ordered sweep event trees?\n // Can we maintaining an ordering that avoids the need\n // for the re-sorting with getLeftmostComparator in geom-out?\n\n // Compare each pair of events to see if other events also match\n const numEvents = this.point.events.length\n for (let i = 0; i < numEvents; i++) {\n const evt1 = this.point.events[i]\n if (evt1.segment.consumedBy !== undefined) continue\n for (let j = i + 1; j < numEvents; j++) {\n const evt2 = this.point.events[j]\n if (evt2.consumedBy !== undefined) continue\n if (evt1.otherSE.point.events !== evt2.otherSE.point.events) continue\n evt1.segment.consume(evt2.segment)\n }\n }\n }\n\n getAvailableLinkedEvents() {\n // point.events is always of length 2 or greater\n const events = []\n for (let i = 0, iMax = this.point.events.length; i < iMax; i++) {\n const evt = this.point.events[i]\n if (evt !== this && !evt.segment.ringOut && evt.segment.isInResult()) {\n events.push(evt)\n }\n }\n return events\n }\n\n /**\n * Returns a comparator function for sorting linked events that will\n * favor the event that will give us the smallest left-side angle.\n * All ring construction starts as low as possible heading to the right,\n * so by always turning left as sharp as possible we'll get polygons\n * without uncessary loops & holes.\n *\n * The comparator function has a compute cache such that it avoids\n * re-computing already-computed values.\n */\n getLeftmostComparator(baseEvent: SweepEvent) {\n const cache = new Map<SweepEvent, { sine: BigNumber, cosine: BigNumber }>()\n\n const fillCache = (linkedEvent: SweepEvent) => {\n const nextEvent = linkedEvent.otherSE\n cache.set(linkedEvent, {\n sine: sineOfAngle(this.point, baseEvent.point, nextEvent.point),\n cosine: cosineOfAngle(this.point, baseEvent.point, nextEvent.point),\n })\n }\n\n return (a: SweepEvent, b: SweepEvent) => {\n if (!cache.has(a)) fillCache(a)\n if (!cache.has(b)) fillCache(b)\n\n const { sine: asine, cosine: acosine } = cache.get(a)!\n const { sine: bsine, cosine: bcosine } = cache.get(b)!\n\n // both on or above x-axis\n if (asine.isGreaterThanOrEqualTo(0) && bsine.isGreaterThanOrEqualTo(0)) {\n if (acosine.isLessThan(bcosine)) return 1\n if (acosine.isGreaterThan(bcosine)) return -1\n return 0\n }\n\n // both below x-axis\n if (asine.isLessThan(0) && bsine.isLessThan(0)) {\n if (acosine.isLessThan(bcosine)) return -1\n if (acosine.isGreaterThan(bcosine)) return 1\n return 0\n }\n\n // one above x-axis, one below\n if (bsine.isLessThan(asine)) return -1\n if (bsine.isGreaterThan(asine)) return 1\n return 0\n }\n }\n}\n","import { MultiPoly, Poly, Ring } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport Segment from \"./segment.js\"\nimport SweepEvent from \"./sweep-event.js\"\n\nexport class RingOut {\n events: SweepEvent[]\n poly: PolyOut | null\n _isExteriorRing: boolean | undefined\n _enclosingRing: RingOut | null | undefined\n \n /* Given the segments from the sweep line pass, compute & return a series\n * of closed rings from all the segments marked to be part of the result */\n static factory(allSegments: Segment[]) {\n const ringsOut = []\n\n for (let i = 0, iMax = allSegments.length; i < iMax; i++) {\n const segment = allSegments[i]\n if (!segment.isInResult() || segment.ringOut) continue\n\n let prevEvent = null\n let event = segment.leftSE\n let nextEvent = segment.rightSE\n const events = [event]\n\n const startingPoint = event.point\n const intersectionLEs = []\n\n /* Walk the chain of linked events to form a closed ring */\n while (true) {\n prevEvent = event\n event = nextEvent\n events.push(event)\n\n /* Is the ring complete? */\n if (event.point === startingPoint) break\n\n while (true) {\n const availableLEs = event.getAvailableLinkedEvents()\n\n /* Did we hit a dead end? This shouldn't happen. Indicates some earlier\n * part of the algorithm malfunctioned... please file a bug report. */\n if (availableLEs.length === 0) {\n const firstPt = events[0].point\n const lastPt = events[events.length - 1].point\n throw new Error(\n `Unable to complete output ring starting at [${firstPt.x},` +\n ` ${firstPt.y}]. Last matching segment found ends at` +\n ` [${lastPt.x}, ${lastPt.y}].`,\n )\n }\n\n /* Only one way to go, so cotinue on the path */\n if (availableLEs.length === 1) {\n nextEvent = availableLEs[0].otherSE\n break\n }\n\n /* We must have an intersection. Check for a completed loop */\n let indexLE = null\n for (let j = 0, jMax = intersectionLEs.length; j < jMax; j++) {\n if (intersectionLEs[j].point === event.point) {\n indexLE = j\n break\n }\n }\n /* Found a completed loop. Cut that off and make a ring */\n if (indexLE !== null) {\n const intersectionLE = intersectionLEs.splice(indexLE)[0]\n const ringEvents = events.splice(intersectionLE.index)\n ringEvents.unshift(ringEvents[0].otherSE)\n ringsOut.push(new RingOut(ringEvents.reverse()))\n continue\n }\n /* register the intersection */\n intersectionLEs.push({\n index: events.length,\n point: event.point,\n })\n /* Choose the left-most option to continue the walk */\n const comparator = event.getLeftmostComparator(prevEvent)\n nextEvent = availableLEs.sort(comparator)[0].otherSE\n break\n }\n }\n\n ringsOut.push(new RingOut(events))\n }\n return ringsOut\n }\n\n constructor(events: SweepEvent[]) {\n this.events = events\n for (let i = 0, iMax = events.length; i < iMax; i++) {\n events[i].segment.ringOut = this\n }\n this.poly = null\n }\n\n getGeom() {\n // Remove superfluous points (ie extra points along a straight line),\n let prevPt = this.events[0].point\n const points = [prevPt]\n for (let i = 1, iMax = this.events.length - 1; i < iMax; i++) {\n const pt = this.events[i].point\n const nextPt = this.events[i + 1].point\n if (precision.orient(pt, prevPt, nextPt) === 0) continue\n points.push(pt)\n prevPt = pt\n }\n\n // ring was all (within rounding error of angle calc) colinear points\n if (points.length === 1) return null\n\n // check if the starting point is necessary\n const pt = points[0]\n const nextPt = points[1]\n if (precision.orient(pt, prevPt, nextPt) === 0) points.shift()\n\n points.push(points[0])\n const step = this.isExteriorRing() ? 1 : -1\n const iStart = this.isExteriorRing() ? 0 : points.length - 1\n const iEnd = this.isExteriorRing() ? points.length : -1\n const orderedPoints: Ring = []\n for (let i = iStart; i != iEnd; i += step)\n orderedPoints.push([points[i].x.toNumber(), points[i].y.toNumber()])\n return orderedPoints\n }\n\n isExteriorRing(): boolean {\n if (this._isExteriorRing === undefined) {\n const enclosing = this.enclosingRing()\n this._isExteriorRing = enclosing ? !enclosing.isExteriorRing() : true\n }\n return this._isExteriorRing\n }\n\n enclosingRing() {\n if (this._enclosingRing === undefined) {\n this._enclosingRing = this._calcEnclosingRing()\n }\n return this._enclosingRing\n }\n\n /* Returns the ring that encloses this one, if any */\n _calcEnclosingRing(): RingOut | null | undefined {\n // start with the ealier sweep line event so that the prevSeg\n // chain doesn't lead us inside of a loop of ours\n let leftMostEvt = this.events[0]\n for (let i = 1, iMax = this.events.length; i < iMax; i++) {\n const evt = this.events[i]\n if (SweepEvent.compare(leftMostEvt, evt) > 0) leftMostEvt = evt\n }\n\n let prevSeg: Segment | null | undefined = leftMostEvt.segment.prevInResult()\n let prevPrevSeg: Segment | null | undefined = prevSeg ? prevSeg.prevInResult() : null\n\n while (true) {\n // no segment found, thus no ring can enclose us\n if (!prevSeg) return null\n\n // no segments below prev segment found, thus the ring of the prev\n // segment must loop back around and enclose us\n if (!prevPrevSeg) return prevSeg.ringOut\n\n // if the two segments are of different rings, the ring of the prev\n // segment must either loop around us or the ring of the prev prev\n // seg, which would make us and the ring of the prev peers\n if (prevPrevSeg.ringOut !== prevSeg.ringOut) {\n if (prevPrevSeg.ringOut?.enclosingRing() !== prevSeg.ringOut) {\n return prevSeg.ringOut\n } else return prevSeg.ringOut?.enclosingRing()\n }\n\n // two segments are from the same ring, so this was a penisula\n // of that ring. iterate downward, keep searching\n prevSeg = prevPrevSeg.prevInResult()\n prevPrevSeg = prevSeg ? prevSeg.prevInResult() : null\n }\n }\n}\n\nexport class PolyOut {\n exteriorRing: RingOut;\n interiorRings: RingOut[];\n\n constructor(exteriorRing: RingOut) {\n this.exteriorRing = exteriorRing\n exteriorRing.poly = this\n this.interiorRings = []\n }\n\n addInterior(ring: RingOut) {\n this.interiorRings.push(ring)\n ring.poly = this\n }\n\n getGeom() {\n const geom0 = this.exteriorRing.getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (geom0 === null) return null\n const geom: Poly = [geom0];\n for (let i = 0, iMax = this.interiorRings.length; i < iMax; i++) {\n const ringGeom = this.interiorRings[i].getGeom()\n // interior ring was all (within rounding error of angle calc) colinear points\n if (ringGeom === null) continue\n geom.push(ringGeom)\n }\n return geom\n }\n}\n\nexport class MultiPolyOut {\n rings: RingOut[];\n polys: PolyOut[];\n\n constructor(rings: RingOut[]) {\n this.rings = rings\n this.polys = this._composePolys(rings)\n }\n\n getGeom() {\n const geom: MultiPoly = []\n for (let i = 0, iMax = this.polys.length; i < iMax; i++) {\n const polyGeom = this.polys[i].getGeom()\n // exterior ring was all (within rounding error of angle calc) colinear points\n if (polyGeom === null) continue\n geom.push(polyGeom)\n }\n return geom\n }\n\n _composePolys(rings: RingOut[]) {\n const polys = []\n for (let i = 0, iMax = rings.length; i < iMax; i++) {\n const ring = rings[i]\n if (ring.poly) continue\n if (ring.isExteriorRing()) polys.push(new PolyOut(ring))\n else {\n const enclosingRing = ring.enclosingRing()\n if (!enclosingRing?.poly) polys.push(new PolyOut(enclosingRing!))\n enclosingRing?.poly?.addInterior(ring)\n }\n }\n return polys\n }\n}\n","import { SplayTreeSet } from \"splaytree-ts\"\nimport Segment from \"./segment.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\n\n/**\n * NOTE: We must be careful not to change any segments while\n * they are in the SplayTree. AFAIK, there's no way to tell\n * the tree to rebalance itself - thus before splitting\n * a segment that's in the tree, we remove it from the tree,\n * do the split, then re-insert it. (Even though splitting a\n * segment *shouldn't* change its correct position in the\n * sweep line tree, the reality is because of rounding errors,\n * it sometimes does.)\n */\n\nexport default class SweepLine {\n private queue: SplayTreeSet<SweepEvent>\n private tree: SplayTreeSet<Segment>\n segments: Segment[]\n\n constructor(queue: SplayTreeSet<SweepEvent>, comparator = Segment.compare) {\n this.queue = queue\n this.tree = new SplayTreeSet(comparator)\n this.segments = []\n }\n\n process(event: SweepEvent) {\n const segment = event.segment\n const newEvents: SweepEvent[] = []\n\n // if we've already been consumed by another segment,\n // clean up our body parts and get out\n if (event.consumedBy) {\n if (event.isLeft) this.queue.delete(event.otherSE)\n else this.tree.delete(segment)\n return newEvents\n }\n\n if (event.isLeft) this.tree.add(segment);\n\n let prevSeg: Segment | null = segment\n let nextSeg: Segment | null = segment\n\n // skip consumed segments still in tree\n do {\n prevSeg = this.tree.lastBefore(prevSeg)\n } while (prevSeg != null && prevSeg.consumedBy != undefined)\n\n // skip consumed segments still in tree\n do {\n nextSeg = this.tree.firstAfter(nextSeg)\n } while (nextSeg != null && nextSeg.consumedBy != undefined)\n\n if (event.isLeft) {\n // Check for intersections against the previous segment in the sweep line\n let prevMySplitter = null\n if (prevSeg) {\n const prevInter = prevSeg.getIntersection(segment)\n if (prevInter !== null) {\n if (!segment.isAnEndpoint(prevInter)) prevMySplitter = prevInter\n if (!prevSeg.isAnEndpoint(prevInter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, prevInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // Check for intersections against the next segment in the sweep line\n let nextMySplitter = null\n if (nextSeg) {\n const nextInter = nextSeg.getIntersection(segment)\n if (nextInter !== null) {\n if (!segment.isAnEndpoint(nextInter)) nextMySplitter = nextInter\n if (!nextSeg.isAnEndpoint(nextInter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, nextInter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n // For simplicity, even if we find more than one intersection we only\n // spilt on the 'earliest' (sweep-line style) of the intersections.\n // The other intersection will be handled in a future process().\n if (prevMySplitter !== null || nextMySplitter !== null) {\n let mySplitter = null\n if (prevMySplitter === null) mySplitter = nextMySplitter\n else if (nextMySplitter === null) mySplitter = prevMySplitter\n else {\n const cmpSplitters = SweepEvent.comparePoints(\n prevMySplitter,\n nextMySplitter,\n )\n mySplitter = cmpSplitters <= 0 ? prevMySplitter : nextMySplitter\n }\n\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n this.queue.delete(segment.rightSE)\n newEvents.push(segment.rightSE)\n\n const newEventsFromSplit = segment.split(mySplitter!)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n\n if (newEvents.length > 0) {\n // We found some intersections, so re-do the current event to\n // make sure sweep line ordering is totally consistent for later\n // use with the segment 'prev' pointers\n this.tree.delete(segment)\n newEvents.push(event)\n } else {\n // done with left event\n this.segments.push(segment)\n segment.prev = prevSeg\n }\n } else {\n // event.isRight\n\n // since we're about to be removed from the sweep line, check for\n // intersections between our previous and next segments\n if (prevSeg && nextSeg) {\n const inter = prevSeg.getIntersection(nextSeg)\n if (inter !== null) {\n if (!prevSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(prevSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n if (!nextSeg.isAnEndpoint(inter)) {\n const newEventsFromSplit = this._splitSafely(nextSeg, inter)\n for (let i = 0, iMax = newEventsFromSplit.length; i < iMax; i++) {\n newEvents.push(newEventsFromSplit[i])\n }\n }\n }\n }\n\n this.tree.delete(segment)\n }\n\n return newEvents\n }\n\n /* Safely split a segment that is currently in the datastructures\n * IE - a segment other than the one that is currently being processed. */\n _splitSafely(seg: Segment, pt: Point) {\n // Rounding errors can cause changes in ordering,\n // so remove afected segments and right sweep events before splitting\n // removeNode() doesn't work, so have re-find the seg\n // https://github.com/w8r/splay-tree/pull/5\n this.tree.delete(seg)\n const rightSE = seg.rightSE\n this.queue.delete(rightSE)\n const newEvents = seg.split(pt)\n newEvents.push(rightSE)\n // splitting can trigger consumption\n if (seg.consumedBy === undefined) this.tree.add(seg)\n return newEvents\n }\n}\n","import { getBboxOverlap, isInBbox } from \"./bbox.js\"\nimport { MultiPolyIn, RingIn } from \"./geom-in.js\"\nimport { RingOut } from \"./geom-out.js\"\nimport operation from \"./operation.js\"\nimport { precision } from \"./precision.js\"\nimport SweepEvent, { Point } from \"./sweep-event.js\"\nimport { intersection } from \"./vector.js\"\n\ninterface State {\n rings: RingIn[],\n windings: number[],\n multiPolys: MultiPolyIn[]\n}\n\n// Give segments unique ID's to get consistent sorting of\n// segments and sweep events when all else is identical\nlet segmentId = 0\n\nexport default class Segment {\n id: number\n leftSE: SweepEvent\n rightSE: SweepEvent\n rings: RingIn[] | null\n windings: number[] | null\n ringOut: RingOut | undefined\n consumedBy: Segment | undefined\n prev: Segment | null | undefined\n _prevInResult: Segment | null | undefined\n _beforeState: State | undefined\n _afterState: State | undefined\n _isInResult: boolean | undefined\n\n /* This compare() function is for ordering segments in the sweep\n * line tree, and does so according to the following criteria:\n *\n * Consider the vertical line that lies an infinestimal step to the\n * right of the right-more of the two left endpoints of the input\n * segments. Imagine slowly moving a point up from negative infinity\n * in the increasing y direction. Which of the two segments will that\n * point intersect first? That segment comes 'before' the other one.\n *\n * If neither segment would be intersected by such a line, (if one\n * or more of the segments are vertical) then the line to be considered\n * is directly on the right-more of the two left inputs.\n */\n static compare(a: Segment, b: Segment) {\n const alx = a.leftSE.point.x\n const blx = b.leftSE.point.x\n const arx = a.rightSE.point.x\n const brx = b.rightSE.point.x\n\n // check if they're even in the same vertical plane\n if (brx.isLessThan(alx)) return 1\n if (arx.isLessThan(blx)) return -1\n\n const aly = a.leftSE.point.y\n const bly = b.leftSE.point.y\n const ary = a.rightSE.point.y\n const bry = b.rightSE.point.y\n\n // is left endpoint of segment B the right-more?\n if (alx.isLessThan(blx)) {\n // are the two segments in the same horizontal plane?\n if (bly.isLessThan(aly) && bly.isLessThan(ary)) return 1\n if (bly.isGreaterThan(aly) && bly.isGreaterThan(ary)) return -1\n\n // is the B left endpoint colinear to segment A?\n const aCmpBLeft = a.comparePoint(b.leftSE.point)\n if (aCmpBLeft < 0) return 1\n if (aCmpBLeft > 0) return -1\n\n // is the A right endpoint colinear to segment B ?\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return -1\n }\n\n // is left endpoint of segment A the right-more?\n if (alx.isGreaterThan(blx)) {\n if (aly.isLessThan(bly) && aly.isLessThan(bry)) return -1\n if (aly.isGreaterThan(bly) && aly.isGreaterThan(bry)) return 1\n\n // is the A left endpoint colinear to segment B?\n const bCmpALeft = b.comparePoint(a.leftSE.point)\n if (bCmpALeft !== 0) return bCmpALeft\n\n // is the B right endpoint colinear to segment A?\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n\n // colinear segments, consider the one with left-more\n // left endpoint to be first (arbitrary?)\n return 1\n }\n\n // if we get here, the two left endpoints are in the same\n // vertical plane, ie alx === blx\n\n // consider the lower left-endpoint to come first\n if (aly.isLessThan(bly)) return -1\n if (aly.isGreaterThan(bly)) return 1\n\n // left endpoints are identical\n // check for colinearity by using the left-more right endpoint\n\n // is the A right endpoint more left-more?\n if (arx.isLessThan(brx)) {\n const bCmpARight = b.comparePoint(a.rightSE.point)\n if (bCmpARight !== 0) return bCmpARight\n }\n\n // is the B right endpoint more left-more?\n if (arx.isGreaterThan(brx)) {\n const aCmpBRight = a.comparePoint(b.rightSE.point)\n if (aCmpBRight < 0) return 1\n if (aCmpBRight > 0) return -1\n }\n\n if (!arx.eq(brx)) {\n // are these two [almost] vertical segments with opposite orientation?\n // if so, the one with the lower right endpoint comes first\n const ay = ary.minus(aly)\n const ax = arx.minus(alx)\n const by = bry.minus(bly)\n const bx = brx.minus(blx)\n if (ay.isGreaterThan(ax) && by.isLessThan(bx)) return 1\n if (ay.isLessThan(ax) && by.isGreaterThan(bx)) return -1\n }\n\n // we have colinear segments with matching orientation\n // consider the one with more left-more right endpoint to be first\n if (arx.isGreaterThan(brx)) return 1\n if (arx.isLessThan(brx)) return -1\n\n // if we get here, two two right endpoints are in the same\n // vertical plane, ie arx === brx\n\n // consider the lower right-endpoint to come first\n if (ary.isLessThan(bry)) return -1\n if (ary.isGreaterThan(bry)) return 1\n\n // right endpoints identical as well, so the segments are idential\n // fall back on creation order as consistent tie-breaker\n if (a.id < b.id) return -1\n if (a.id > b.id) return 1\n\n // identical segment, ie a === b\n return 0\n }\n\n /* Warning: a reference to ringWindings input will be stored,\n * and possibly will be later modified */\n constructor(leftSE: SweepEvent, rightSE: SweepEvent, rings: RingIn[], windings: number[]) {\n this.id = ++segmentId\n this.leftSE = leftSE\n leftSE.segment = this\n leftSE.otherSE = rightSE\n this.rightSE = rightSE\n rightSE.segment = this\n rightSE.otherSE = leftSE\n this.rings = rings\n this.windings = windings\n // left unset for performance, set later in algorithm\n // this.ringOut, this.consumedBy, this.prev\n }\n\n static fromRing(pt1: Point, pt2: Point, ring: RingIn) {\n let leftPt: Point, rightPt: Point, winding: number\n\n // ordering the two points according to sweep line ordering\n const cmpPts = SweepEvent.comparePoints(pt1, pt2)\n if (cmpPts < 0) {\n leftPt = pt1\n rightPt = pt2\n winding = 1\n } else if (cmpPts > 0) {\n leftPt = pt2\n rightPt = pt1\n winding = -1\n } else\n throw new Error(\n `Tried to create degenerate segment at [${pt1.x}, ${pt1.y}]`,\n )\n\n const leftSE = new SweepEvent(leftPt, true)\n const rightSE = new SweepEvent(rightPt, false)\n return new Segment(leftSE, rightSE, [ring], [winding])\n }\n\n /* When a segment is split, the rightSE is replaced with a new sweep event */\n replaceRightSE(newRightSE: SweepEvent) {\n this.rightSE = newRightSE\n this.rightSE.segment = this\n this.rightSE.otherSE = this.leftSE\n this.leftSE.otherSE = this.rightSE\n }\n\n bbox() {\n const y1 = this.leftSE.point.y\n const y2 = this.rightSE.point.y\n return {\n ll: { x: this.leftSE.point.x, y: y1.isLessThan(y2) ? y1 : y2 },\n ur: { x: this.rightSE.point.x, y: y1.isGreaterThan(y2) ? y1 : y2 },\n }\n }\n\n /* A vector from the left point to the right */\n vector() {\n return {\n x: this.rightSE.point.x.minus(this.leftSE.point.x),\n y: this.rightSE.point.y.minus(this.leftSE.point.y),\n }\n }\n\n isAnEndpoint(pt: Point) {\n return (\n (pt.x.eq(this.leftSE.point.x) && pt.y.eq(this.leftSE.point.y)) ||\n (pt.x.eq(this.rightSE.point.x) && pt.y.eq(this.rightSE.point.y))\n )\n }\n\n /* Compare this segment with a point.\n *\n * A point P is considered to be colinear to a segment if there\n * exists a distance D such that if we travel along the segment\n * from one * endpoint towards the other a distance D, we find\n * ourselves at point P.\n *\n * Return value indicates:\n *\n * 1: point lies above the segment (to the left of vertical)\n * 0: point is colinear to segment\n * -1: point lies below the segment (to the right of vertical)\n */\n comparePoint(point: Point) {\n return precision.orient(this.leftSE.point, point, this.rightSE.point)\n }\n\n /**\n * Given another segment, returns the first non-trivial intersection\n * between the two segments (in terms of sweep line ordering), if it exists.\n *\n * A 'non-trivial' intersection is one that will cause one or both of the\n * segments to be split(). As such, 'trivial' vs. 'non-trivial' intersection:\n *\n * * endpoint of segA with endpoint of segB --> trivial\n * * endpoint of segA with point along segB --> non-trivial\n * * endpoint of segB with point along segA --> non-trivial\n * * point along segA with point along segB --> non-trivial\n *\n * If no non-trivial intersection exists, return null\n * Else, return null.\n */\n getIntersection(other: Segment) {\n // If bboxes don't overlap, there can't be any intersections\n const tBbox = this.bbox()\n const oBbox = other.bbox()\n const bboxOverlap = getBboxOverlap(tBbox, oBbox)\n if (bboxOverlap === null) return null\n\n // We first check to see if the endpoints can be considered intersections.\n // This will 'snap' intersections to endpoints if possible, and will\n // handle cases of colinearity.\n\n const tlp = this.leftSE.point\n const trp = this.rightSE.point\n const olp = other.leftSE.point\n const orp = other.rightSE.point\n\n // does each endpoint touch the other segment?\n // note that we restrict the 'touching' definition to only allow segments\n // to touch endpoints that lie forward from where we are in the sweep line pass\n const touchesOtherLSE = isInBbox(tBbox, olp) && this.comparePoint(olp) === 0\n const touchesThisLSE = isInBbox(oBbox, tlp) && other.comparePoint(tlp) === 0\n const touchesOtherRSE = isInBbox(tBbox, orp) && this.comparePoint(orp) === 0\n const touchesThisRSE = isInBbox(oBbox, trp) && other.comparePoint(trp) === 0\n\n // do left endpoints match?\n if (touchesThisLSE && touchesOtherLSE) {\n // these two cases are for colinear segments with matching left\n // endpoints, and one segment being longer than the other\n if (touchesThisRSE && !touchesOtherRSE) return trp\n if (!touchesThisRSE && touchesOtherRSE) return orp\n // either the two segments match exactly (two trival intersections)\n // or just on their left endpoint (one trivial intersection\n return null\n }\n\n // does this left endpoint matches (other doesn't)\n if (touchesThisLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesOtherRSE) {\n if (tlp.x.eq(orp.x) && tlp.y.eq(orp.y)) return null\n }\n // t-intersection on left endpoint\n return tlp\n }\n\n // does other left endpoint matches (this doesn't)\n if (touchesOtherLSE) {\n // check for segments that just intersect on opposing endpoints\n if (touchesThisRSE) {\n if (trp.x.eq(olp.x) && trp.y.eq(olp.y)) return null\n }\n // t-intersection on left endpoint\n return olp\n }\n\n // trivial intersection on right endpoints\n if (touchesThisRSE && touchesOtherRSE) return null\n\n // t-intersections on just one right endpoint\n if (touchesThisRSE) return trp\n if (touchesOtherRSE) return orp\n\n // None of our endpoints intersect. Look for a general intersection between\n // infinite lines laid over the segments\n const pt = intersection(tlp, this.vector(), olp, other.vector())\n\n // are the segments parrallel? Note that if they were colinear with overlap,\n // they would have an endpoint intersection and that case was already handled above\n if (pt === null) return null\n\n // is the intersection found between the lines not on the segments?\n if (!isInBbox(bboxOverlap, pt)) return null\n\n // round the the computed point if needed\n return precision.snap(pt) as Point\n }\n\n /**\n * Split the given segment into multiple segments on the given points.\n * * Each existing segment will retain its leftSE and a new rightSE will be\n * generated for it.\n * * A new segment will be generated which will adopt the original segment's\n * rightSE, and a new leftSE will be generated for it.\n * * If there are more than two points given to split on, new segments\n * in the middle will be generated with new leftSE and rightSE's.\n * * An array of the newly generated SweepEvents will be returned.\n *\n * Warning: input array of points is modified\n */\n split(point: Point) {\n const newEvents = []\n const alreadyLinked = point.events !== undefined\n\n const newLeftSE = new SweepEvent(point, true)\n const newRightSE = new SweepEvent(point, false)\n const oldRightSE = this.rightSE\n this.replaceRightSE(newRightSE)\n newEvents.push(newRightSE)\n newEvents.push(newLeftSE)\n const newSeg = new Segment(\n newLeftSE,\n oldRightSE,\n this.rings!.slice(),\n this.windings!.slice(),\n )\n\n // when splitting a nearly vertical downward-facing segment,\n // sometimes one of the resulting new segments is vertical, in which\n // case its left and right events may need to be swapped\n if (\n SweepEvent.comparePoints(newSeg.leftSE.point, newSeg.rightSE.point) > 0\n ) {\n newSeg.swapEvents()\n }\n if (SweepEvent.comparePoints(this.leftSE.point, this.rightSE.point) > 0) {\n this.swapEvents()\n }\n\n // in the point we just used to create new sweep events with was already\n // linked to other events, we need to check if either of the affected\n // segments should be consumed\n if (alreadyLinked) {\n newLeftSE.checkForConsuming()\n newRightSE.checkForConsuming()\n }\n\n return newEvents\n }\n\n /* Swap which event is left and right */\n swapEvents() {\n const tmpEvt = this.rightSE\n this.rightSE = this.leftSE\n this.leftSE = tmpEvt\n this.leftSE.isLeft = true\n this.rightSE.isLeft = false\n for (let i = 0, iMax = this.windings!.length; i < iMax; i++) {\n this.windings![i] *= -1\n }\n }\n\n /* Consume another segment. We take their rings under our wing\n * and mark them as consumed. Use for perfectly overlapping segments */\n consume(other: Segment) {\n let consumer = this as Segment\n let consumee = other\n while (consumer.consumedBy) consumer = consumer.consumedBy\n while (consumee.consumedBy) consumee = consumee.consumedBy\n\n const cmp = Segment.compare(consumer, consumee)\n if (cmp === 0) return // already consumed\n // the winner of the consumption is the earlier segment\n // according to sweep line ordering\n if (cmp > 0) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n // make sure a segment doesn't consume it's prev\n if (consumer.prev === consumee) {\n const tmp = consumer\n consumer = consumee\n consumee = tmp\n }\n\n for (let i = 0, iMax = consumee.rings!.length; i < iMax; i++) {\n const ring = consumee.rings![i]\n const winding = consumee.windings![i]\n const index = consumer.rings!.indexOf(ring)\n if (index === -1) {\n consumer.rings!.push(ring)\n consumer.windings!.push(winding)\n } else consumer.windings![index] += winding\n }\n consumee.rings = null\n consumee.windings = null\n consumee.consumedBy = consumer\n\n // mark sweep events consumed as to maintain ordering in sweep event queue\n consumee.leftSE.consumedBy = consumer.leftSE\n consumee.rightSE.consumedBy = consumer.rightSE\n }\n\n /* The first segment previous segment chain that is in the result */\n prevInResult(): Segment | null | undefined {\n if (this._prevInResult !== undefined) return this._prevInResult\n if (!this.prev) this._prevInResult = null\n else if (this.prev.isInResult()) this._prevInResult = this.prev\n else this._prevInResult = this.prev.prevInResult()\n return this._prevInResult\n }\n\n beforeState(): State {\n if (this._beforeState !== undefined) return this._beforeState\n if (!this.prev)\n this._beforeState = {\n rings: [],\n windings: [],\n multiPolys: [],\n }\n else {\n const seg = this.prev.consumedBy || this.prev\n this._beforeState = seg.afterState()\n }\n return this._beforeState\n }\n\n afterState() {\n if (this._afterState !== undefined) return this._afterState\n\n const beforeState = this.beforeState()\n this._afterState = {\n rings: beforeState.rings.slice(0),\n windings: beforeState.windings.slice(0),\n multiPolys: [],\n }\n const ringsAfter = this._afterState.rings\n const windingsAfter = this._afterState.windings\n const mpsAfter = this._afterState.multiPolys\n\n // calculate ringsAfter, windingsAfter\n for (let i = 0, iMax = this.rings!.length; i < iMax; i++) {\n const ring = this.rings![i]\n const winding = this.windings![i]\n const index = ringsAfter.indexOf(ring)\n if (index === -1) {\n ringsAfter.push(ring)\n windingsAfter.push(winding)\n } else windingsAfter[index] += winding\n }\n\n // calcualte polysAfter\n const polysAfter = []\n const polysExclude = []\n for (let i = 0, iMax = ringsAfter.length; i < iMax; i++) {\n if (windingsAfter[i] === 0) continue // non-zero rule\n const ring = ringsAfter[i]\n const poly = ring.poly\n if (polysExclude.indexOf(poly) !== -1) continue\n if (ring.isExterior) polysAfter.push(poly)\n else {\n if (polysExclude.indexOf(poly) === -1) polysExclude.push(poly)\n const index = polysAfter.indexOf(ring.poly)\n if (index !== -1) polysAfter.splice(index, 1)\n }\n }\n\n // calculate multiPolysAfter\n for (let i = 0, iMax = polysAfter.length; i < iMax; i++) {\n const mp = polysAfter[i].multiPoly\n if (mpsAfter.indexOf(mp) === -1) mpsAfter.push(mp)\n }\n\n return this._afterState\n }\n\n /* Is this segment part of the final result? */\n isInResult() {\n // if we've been consumed, we're not in the result\n if (this.consumedBy) return false\n\n if (this._isInResult !== undefined) return this._isInResult\n\n const mpsBefore = this.beforeState().multiPolys\n const mpsAfter = this.afterState().multiPolys\n\n switch (operation.type) {\n case \"union\": {\n // UNION - included iff:\n // * On one side of us there is 0 poly interiors AND\n // * On the other side there is 1 or more.\n const noBefores = mpsBefore.length === 0\n const noAfters = mpsAfter.length === 0\n this._isInResult = noBefores !== noAfters\n break\n }\n\n case \"intersection\": {\n // INTERSECTION - included iff:\n // * on one side of us all multipolys are rep. with poly interiors AND\n // * on the other side of us, not all multipolys are repsented\n // with poly interiors\n let least\n let most\n if (mpsBefore.length < mpsAfter.length) {\n least = mpsBefore.length\n most = mpsAfter.length\n } else {\n least = mpsAfter.length\n most = mpsBefore.length\n }\n this._isInResult = most === operation.numMultiPolys && least < most\n break\n }\n\n case \"xor\": {\n // XOR - included iff:\n // * the difference between the number of multipolys represented\n // with poly interiors on our two sides is an odd number\n const diff = Math.abs(mpsBefore.length - mpsAfter.length)\n this._isInResult = diff % 2 === 1\n break\n }\n\n case \"difference\": {\n // DIFFERENCE included iff:\n // * on exactly one side, we have just the subject\n const isJustSubject = (mps: MultiPolyIn[]) => mps.length === 1 && mps[0].isSubject\n this._isInResult = isJustSubject(mpsBefore) !== isJustSubject(mpsAfter)\n break\n }\n }\n\n return this._isInResult\n }\n}\n","import { Geom } from \"./geom-in.js\"\nimport { precision } from \"./precision.js\"\nimport operation from \"./operation.js\"\n\nexport { Geom }\n\nexport const union = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"union\", geom, moreGeoms)\n\nexport const intersection = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"intersection\", geom, moreGeoms)\n\nexport const xor = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"xor\", geom, moreGeoms)\n\nexport const difference = (geom: Geom, ...moreGeoms: Geom[]) =>\n operation.run(\"difference\", geom, moreGeoms)\n\nexport const setPrecision = precision.set","import {\n Feature,\n GeoJsonProperties,\n MultiPolygon,\n Polygon,\n FeatureCollection,\n} from \"geojson\";\nimport { multiPolygon, polygon } from \"@turf/helpers\";\nimport { geomEach } from \"@turf/meta\";\nimport * as polyclip from \"polyclip-ts\";\n\n/**\n * Takes {@link Polygon|polygon} or {@link MultiPolygon|multi-polygon} geometries and\n * finds their polygonal intersection. If they don't intersect, returns null.\n *\n * @function\n * @param {FeatureCollection<Polygon | MultiPolygon>} features the features to intersect\n * @param {Object} [options={}] Optional Parameters\n * @param {Object} [options.properties={}] Translate GeoJSON Properties to Feature\n * @returns {Feature|null} returns a feature representing the area they share (either a {@link Polygon} or\n * {@link MultiPolygon}). If they do not share any area, returns `null`.\n * @example\n * var poly1 = turf.polygon([[\n * [-122.801742, 45.48565],\n * [-122.801742, 45.60491],\n * [-122.584762, 45.60491],\n * [-122.584762, 45.48565],\n * [-122.801742, 45.48565]\n * ]]);\n *\n * var poly2 = turf.polygon([[\n * [-122.520217, 45.535693],\n * [-122.64038, 45.553967],\n * [-122.720031, 45.526554],\n * [-122.669906, 45.507309],\n * [-122.723464, 45.446643],\n * [-122.532577, 45.408574],\n * [-122.487258, 45.477466],\n * [-122.520217, 45.535693]\n * ]]);\n *\n * var intersection = turf.intersect(turf.featureCollection([poly1, poly2]));\n *\n * //addToMap\n * var addToMap = [poly1, poly2, intersection];\n */\nfunction intersect<P extends GeoJsonProperties = GeoJsonProperties>(\n features: FeatureCollection<Polygon | MultiPolygon>,\n options: {\n properties?: P;\n } = {}\n): Feature<Polygon | MultiPolygon, P> | null {\n const geoms: polyclip.Geom[] = [];\n\n geomEach(features, (geom) => {\n geoms.push(geom.coordinates as polyclip.Geom);\n });\n\n if (geoms.length < 2) {\n throw new Error(\"Must specify at least 2 geometries\");\n }\n const intersection = polyclip.intersection(geoms[0], ...geoms.slice(1));\n if (intersection.length === 0) return null;\n if (intersection.length === 1)\n return polygon(intersection[0], options.properties);\n return multiPolygon(intersection, options.properties);\n}\n\nexport { intersect };\nexport default intersect;\n","import {lngLatToWorld} from '@math.gl/web-mercator';\nimport type {BBox, GeoJsonGeometryTypes, Geometry, Position} from 'geojson';\n\ntype TransformFn = (coordinates: any[], bbox: Position[]) => any[];\n\nconst TRANSFORM_FN: Record<\n Exclude<GeoJsonGeometryTypes, 'GeometryCollection'>,\n TransformFn\n> = {\n Point: transformPoint,\n MultiPoint: transformMultiPoint,\n LineString: transformLineString,\n MultiLineString: transformMultiLineString,\n Polygon: transformPolygon,\n MultiPolygon: transformMultiPolygon,\n};\n\n/**\n * Transform WGS84 coordinates to tile coords.\n * It's the inverse of deck.gl coordinate-transform (https://github.com/visgl/deck.gl/blob/master/modules/geo-layers/src/mvt-layer/coordinate-transform.js)\n *\n * @param geometry - any valid geojson geometry\n * @param bbox - geojson bbox\n */\nexport function transformToTileCoords<T extends Geometry>(\n geometry: T,\n bbox: BBox\n): T {\n const [west, south, east, north] = bbox;\n const nw = projectFlat([west, north]);\n const se = projectFlat([east, south]);\n const projectedBbox = [nw, se];\n\n if (geometry.type === 'GeometryCollection') {\n throw new Error('Unsupported geometry type GeometryCollection');\n }\n\n const transformFn = TRANSFORM_FN[geometry.type];\n const coordinates = transformFn(geometry.coordinates, projectedBbox);\n return {...geometry, coordinates};\n}\n\nfunction transformPoint([pointX, pointY]: Position, [nw, se]: Position[]) {\n const x = inverseLerp(nw[0], se[0], pointX);\n const y = inverseLerp(nw[1], se[1], pointY);\n\n return [x, y];\n}\n\nfunction getPoints(geometry: Position[], bbox: Position[]) {\n return geometry.map((g) => transformPoint(projectFlat(g), bbox));\n}\n\nfunction transformMultiPoint(multiPoint: Position[], bbox: Position[]) {\n return getPoints(multiPoint, bbox);\n}\n\nfunction transformLineString(line: Position[], bbox: Position[]) {\n return getPoints(line, bbox);\n}\n\nfunction transformMultiLineString(\n multiLineString: Position[][],\n bbox: Position[]\n) {\n return multiLineString.map((lineString) =>\n transformLineString(lineString, bbox)\n );\n}\n\nfunction transformPolygon(polygon: Position[][], bbox: Position[]) {\n return polygon.map((polygonRing) => getPoints(polygonRing, bbox));\n}\n\nfunction transformMultiPolygon(multiPolygon: Position[][][], bbox: Position[]) {\n return multiPolygon.map((polygon) => transformPolygon(polygon, bbox));\n}\n\nfunction projectFlat(xyz: Position): Position {\n return lngLatToWorld(xyz);\n}\n\nfunction inverseLerp(a: number, b: number, x: number): number {\n return (x - a) / (b - a);\n}\n","import type {BBox} from 'geojson';\nimport type {SpatialFilter} from '../types.js';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport booleanWithin from '@turf/boolean-within';\nimport intersect from '@turf/intersect';\nimport {feature, featureCollection} from '@turf/helpers';\nimport {TileFormat} from '../constants.js';\nimport {transformToTileCoords} from '../utils/transformToTileCoords.js';\nimport {\n cellToBoundary as quadbinCellToBoundary,\n geometryToCells as quadbinGeometryToCells,\n} from 'quadbin';\nimport {polygonToCells as h3PolygonToCells} from 'h3-js';\nimport bboxClip from '@turf/bbox-clip';\n\n// Computes intersections between spatial filters and tiles in various formats,\n// for pre-filtering each tile's features before performing widget calculations.\n//\n// Return types:\n// - true: All features in tile are within spatial filter.\n// - false: No features in tile are within spatial filter; skip tile.\n// - SpatialFilter/Set: Requires a more detailed per-feature check for each\n// feature in the tile. Provides a clipped spatial filter local to the tile\n// or, for spatial indexes, a set of indices (\"covering set\").\n//\n// Computing a covering set for spatial indexes may be very expensive for large\n// spatial filters and small cell resolutions. For example, a viewport at z=3\n// would contain ~18,000,000 raster cells at resolution=14. To avoid ever\n// creating a covering set of this size, compute per-tile (not global) coverings\n// when possible. For tiles fully inside or outside the spatial filter, creating\n// a covering set can be skipped.\n//\n// H3 is currently a special case where coverage must be computed for the entire\n// spatial filter; per-tile coverage would return a different result, because\n// H3 child cells are not fully contained within their parents.\n\n///////////////////////////////////////////////////////////////////////////////\n// GEOMETRY\n\n/** @internal */\nexport function intersectTileGeometry(\n tileBbox: BBox,\n tileFormat?: TileFormat,\n spatialFilter?: SpatialFilter\n): boolean | SpatialFilter {\n const tilePolygon = bboxPolygon(tileBbox);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([tilePolygon, feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n // Transform into local coordinates [0..1]. We assume MVT tiles use local\n // coordinates but geojson or binary features are already WGS84.\n return tileFormat === TileFormat.MVT\n ? transformToTileCoords(clippedSpatialFilter.geometry, tileBbox)\n : clippedSpatialFilter.geometry;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// RASTER\n\n/** @internal */\nexport function intersectTileRaster(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n) {\n return intersectTileQuadbin(parent, cellResolution, spatialFilter);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// QUADBIN\n\n/** @internal */\nexport function intersectTileQuadbin(\n parent: bigint,\n cellResolution: bigint,\n spatialFilter?: SpatialFilter\n): boolean | Set<bigint> {\n const tilePolygon = quadbinCellToBoundary(parent);\n\n if (!spatialFilter || booleanWithin(tilePolygon, spatialFilter)) {\n return true;\n }\n\n const clippedSpatialFilter = intersect(\n featureCollection([feature(tilePolygon), feature(spatialFilter)])\n );\n\n if (!clippedSpatialFilter) {\n return false;\n }\n\n const cells = quadbinGeometryToCells(\n clippedSpatialFilter.geometry,\n cellResolution\n );\n\n return new Set(cells);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// H3\n\nconst BBOX_WEST: BBox = [-180, -90, 0, 90];\nconst BBOX_EAST: BBox = [0, -90, 180, 90];\n\n/** @internal */\nexport function intersectTileH3(\n cellResolution: number,\n spatialFilter?: SpatialFilter\n): true | Set<string> {\n if (!spatialFilter) {\n return true;\n }\n\n // Unlike quadbin and raster tiles, H3 children do not align to the parent's\n // boundaries. Per-tile coverage with `h3PolygonToCells` would return only\n // cells with _centers_ inside the clipped polygon — fewer cells. So for H3\n // we compute the coverage set for the entire spatial filter (more expensive).\n // In the future this could be replaced with `polygonToCellsExperimental`,\n // which can compute child cells in different modes.\n\n const spatialFilterFeature = feature(spatialFilter);\n\n // The current H3 polyfill algorithm can't deal with polygon segments of greater than 180 degrees longitude\n // so we clip the geometry to be sure that none of them is greater than 180 degrees\n // https://github.com/uber/h3-js/issues/24#issuecomment-431893796\n\n const cellsWest = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_WEST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n const cellsEast = h3PolygonToCells(\n bboxClip(spatialFilterFeature, BBOX_EAST).geometry.coordinates as\n | number[][]\n | number[][][],\n cellResolution,\n true\n );\n\n return new Set(cellsWest.concat(cellsEast));\n}\n","import {\n BBox,\n Feature,\n LineString,\n MultiLineString,\n MultiPolygon,\n GeoJsonProperties,\n Polygon,\n} from \"geojson\";\n\nimport {\n lineString,\n multiLineString,\n multiPolygon,\n polygon,\n} from \"@turf/helpers\";\nimport { getGeom } from \"@turf/invariant\";\nimport { lineclip, polygonclip } from \"./lib/lineclip.js\";\n\n/**\n * Takes a {@link Feature} and a bbox and clips the feature to the bbox using\n * [lineclip](https://github.com/mapbox/lineclip).\n * May result in degenerate edges when clipping Polygons.\n *\n * @function\n * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox\n * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature\n * @example\n * var bbox = [0, 0, 10, 10];\n * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);\n *\n * var clipped = turf.bboxClip(poly, bbox);\n *\n * //addToMap\n * var addToMap = [bbox, poly, clipped]\n */\nfunction bboxClip<\n G extends Polygon | MultiPolygon | LineString | MultiLineString,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(feature: Feature<G, P> | G, bbox: BBox) {\n const geom = getGeom(feature);\n const type = geom.type;\n const properties = feature.type === \"Feature\" ? feature.properties : {};\n let coords: any[] = geom.coordinates;\n\n switch (type) {\n case \"LineString\":\n case \"MultiLineString\": {\n const lines: any[] = [];\n if (type === \"LineString\") {\n coords = [coords];\n }\n coords.forEach((line) => {\n lineclip(line, bbox, lines);\n });\n if (lines.length === 1) {\n return lineString(lines[0], properties);\n }\n return multiLineString(lines, properties);\n }\n case \"Polygon\":\n return polygon(clipPolygon(coords, bbox), properties);\n case \"MultiPolygon\":\n return multiPolygon(\n coords.map((poly) => {\n return clipPolygon(poly, bbox);\n }),\n properties\n );\n default:\n throw new Error(\"geometry \" + type + \" not supported\");\n }\n}\n\nfunction clipPolygon(rings: number[][][], bbox: BBox) {\n const outRings = [];\n for (const ring of rings) {\n const clipped = polygonclip(ring, bbox);\n if (clipped.length > 0) {\n if (\n clipped[0][0] !== clipped[clipped.length - 1][0] ||\n clipped[0][1] !== clipped[clipped.length - 1][1]\n ) {\n clipped.push(clipped[0]);\n }\n if (clipped.length >= 4) {\n outRings.push(clipped);\n }\n }\n }\n return outRings;\n}\n\nexport { bboxClip };\nexport default bboxClip;\n","// Cohen-Sutherland line clipping algorithm, adapted to efficiently\n// handle polylines rather than just segments\nimport { BBox } from \"geojson\";\n\nexport function lineclip(\n points: number[][],\n bbox: BBox,\n result?: number[][][]\n): number[][][] {\n var len = points.length,\n codeA = bitCode(points[0], bbox),\n part = [] as number[][],\n i,\n codeB,\n lastCode;\n let a: number[];\n let b: number[];\n\n if (!result) result = [];\n\n for (i = 1; i < len; i++) {\n a = points[i - 1];\n b = points[i];\n codeB = lastCode = bitCode(b, bbox);\n\n while (true) {\n if (!(codeA | codeB)) {\n // accept\n part.push(a);\n\n if (codeB !== lastCode) {\n // segment went outside\n part.push(b);\n\n if (i < len - 1) {\n // start a new line\n result.push(part);\n part = [];\n }\n } else if (i === len - 1) {\n part.push(b);\n }\n break;\n } else if (codeA & codeB) {\n // trivial reject\n break;\n } else if (codeA) {\n // a outside, intersect with clip edge\n a = intersect(a, b, codeA, bbox)!;\n codeA = bitCode(a, bbox);\n } else {\n // b outside\n b = intersect(a, b, codeB, bbox)!;\n codeB = bitCode(b, bbox);\n }\n }\n\n codeA = lastCode;\n }\n\n if (part.length) result.push(part);\n\n return result;\n}\n\n// Sutherland-Hodgeman polygon clipping algorithm\n\nexport function polygonclip(points: number[][], bbox: BBox): number[][] {\n var result: number[][], edge, prev, prevInside, i, p, inside;\n\n // clip against each side of the clip rectangle\n for (edge = 1; edge <= 8; edge *= 2) {\n result = [];\n prev = points[points.length - 1];\n prevInside = !(bitCode(prev, bbox) & edge);\n\n for (i = 0; i < points.length; i++) {\n p = points[i];\n inside = !(bitCode(p, bbox) & edge);\n\n // if segment goes through the clip window, add an intersection\n if (inside !== prevInside) result.push(intersect(prev, p, edge, bbox)!);\n\n if (inside) result.push(p); // add a point if it's inside\n\n prev = p;\n prevInside = inside;\n }\n\n points = result;\n\n if (!points.length) break;\n }\n\n return result!;\n}\n\n// intersect a segment against one of the 4 lines that make up the bbox\n\nfunction intersect(\n a: number[],\n b: number[],\n edge: number,\n bbox: BBox\n): number[] | null {\n return edge & 8\n ? [a[0] + ((b[0] - a[0]) * (bbox[3] - a[1])) / (b[1] - a[1]), bbox[3]] // top\n : edge & 4\n ? [a[0] + ((b[0] - a[0]) * (bbox[1] - a[1])) / (b[1] - a[1]), bbox[1]] // bottom\n : edge & 2\n ? [bbox[2], a[1] + ((b[1] - a[1]) * (bbox[2] - a[0])) / (b[0] - a[0])] // right\n : edge & 1\n ? [bbox[0], a[1] + ((b[1] - a[1]) * (bbox[0] - a[0])) / (b[0] - a[0])] // left\n : null;\n}\n\n// bit code reflects the point position relative to the bbox:\n\n// left mid right\n// top 1001 1000 1010\n// mid 0001 0000 0010\n// bottom 0101 0100 0110\n\nfunction bitCode(p: number[], bbox: BBox) {\n var code = 0;\n\n if (p[0] < bbox[0]) code |= 1;\n // left\n else if (p[0] > bbox[2]) code |= 2; // right\n\n if (p[1] < bbox[1]) code |= 4;\n // bottom\n else if (p[1] > bbox[3]) code |= 8; // top\n\n return code;\n}\n","import intersects from '@turf/boolean-intersects';\nimport {transformTileCoordsToWGS84} from '../utils/transformTileCoordsToWGS84.js';\nimport {TileFormat} from '../constants.js';\nimport type {\n BBox,\n Geometry,\n LineString,\n Point,\n Polygon,\n Position,\n} from 'geojson';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n BinaryAttribute,\n BinaryFeature,\n BinaryGeometryType,\n BinaryLineFeature,\n BinaryPointFeature,\n BinaryPolygonFeature,\n TypedArrayConstructor,\n} from '@loaders.gl/schema';\nimport {intersectTileGeometry} from './tileIntersection.js';\n\nexport const FEATURE_GEOM_PROPERTY = '__geomValue';\n\ntype TileMap = Map<unknown, unknown>;\n\ntype TileDataInternal = {\n uniqueId: string | number | undefined;\n properties: any;\n numericProps: Record<string, number>;\n};\n\ntype GeometryExtractOptions = {\n storeGeometry?: boolean;\n};\n\nexport function tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options,\n}: {\n tiles: Tile[];\n tileFormat?: TileFormat;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}): FeatureData[] {\n const map = new Map();\n\n for (const tile of tiles) {\n // Discard if it's not a visible tile (only check false value, not undefined)\n // or tile has not data\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n const tileBbox = [\n tile.bbox.west,\n tile.bbox.south,\n tile.bbox.east,\n tile.bbox.north,\n ] as BBox;\n\n const intersection = intersectTileGeometry(\n tileBbox,\n tileFormat,\n spatialFilter\n );\n\n if (intersection === false) continue;\n\n const transformedSpatialFilter =\n intersection === true ? undefined : intersection;\n\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.points!,\n type: 'Point',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.lines!,\n type: 'LineString',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n calculateFeatures({\n map,\n spatialFilter: transformedSpatialFilter,\n data: tile.data.polygons!,\n type: 'Polygon',\n bbox: tileBbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n return Array.from(map.values());\n}\n\nfunction processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n}: {\n map: TileMap;\n data: BinaryFeature;\n startIndex: number;\n endIndex: number;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n storeGeometry: boolean;\n spatialFilter?: Geometry;\n}) {\n const tileProps = getPropertiesFromTile(data, startIndex);\n const uniquePropertyValue = getUniquePropertyValue(\n tileProps,\n uniqueIdProperty,\n map\n );\n\n if (!uniquePropertyValue || map.has(uniquePropertyValue)) {\n return;\n }\n let geometry: Geometry | null = null;\n\n // Only calculate geometry if necessary\n if (storeGeometry || spatialFilter) {\n const {positions} = data;\n const ringCoordinates = getRingCoordinatesFor(\n startIndex,\n endIndex,\n positions\n );\n geometry = getFeatureByType(ringCoordinates, type);\n }\n\n // If intersection is required, check before proceeding\n if (geometry && spatialFilter && !intersects(geometry, spatialFilter)) {\n return;\n }\n\n const properties = parseProperties(tileProps);\n\n // Only save geometry if necessary\n if (storeGeometry && geometry) {\n properties[FEATURE_GEOM_PROPERTY] =\n tileFormat === TileFormat.MVT\n ? transformTileCoordsToWGS84(geometry, bbox)\n : geometry;\n }\n map.set(uniquePropertyValue, properties);\n}\n\nfunction addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n spatialFilter: Geometry;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n spatialFilter,\n });\n }\n}\n\n// Despite TypeScript, 'data.type' is OPTIONAL. So 'type' must be passed in\n// separately. Observed missing .type for Redshift tilesets, 2025-04-09.\nfunction getIndices(data: BinaryFeature, type: BinaryGeometryType) {\n let indices: BinaryAttribute;\n switch (type) {\n case 'Polygon':\n indices = (data as BinaryPolygonFeature).primitivePolygonIndices;\n break;\n case 'LineString':\n indices = (data as BinaryLineFeature).pathIndices;\n break;\n case 'Point':\n indices = createIndicesForPoints(data as BinaryPointFeature);\n break;\n default:\n throw new Error(\n `Unsupported geometry type: ${type as unknown as string}`\n );\n }\n return indices.value;\n}\n\nfunction getFeatureId(data: BinaryFeature, startIndex: number) {\n return data.featureIds.value[startIndex];\n}\n\nfunction getPropertiesFromTile(data: BinaryFeature, startIndex: number) {\n const featureId = getFeatureId(data, startIndex);\n const {properties, numericProps, fields} = data;\n const result: TileDataInternal = {\n uniqueId: (fields?.[featureId] as {id: string | number})?.id,\n properties: properties[featureId],\n numericProps: {},\n };\n\n for (const key in numericProps) {\n result.numericProps[key] = numericProps[key].value[startIndex];\n }\n\n return result;\n}\n\nfunction parseProperties(tileProps: TileDataInternal) {\n const {properties, numericProps} = tileProps;\n return Object.assign({}, properties, numericProps);\n}\n\nfunction getUniquePropertyValue(\n tileProps: TileDataInternal,\n uniqueIdProperty: string | undefined,\n map: TileMap\n) {\n if (uniqueIdProperty) {\n return getValueFromTileProps(tileProps, uniqueIdProperty);\n }\n\n if (tileProps.uniqueId) {\n return tileProps.uniqueId;\n }\n\n const artificialId = map.size + 1; // a counter, assumed as a valid new id\n return (\n getValueFromTileProps(tileProps, 'cartodb_id') ||\n getValueFromTileProps(tileProps, 'geoid') ||\n artificialId\n );\n}\n\nfunction getValueFromTileProps(\n tileProps: TileDataInternal,\n propertyName: string\n) {\n const {properties, numericProps} = tileProps;\n return numericProps[propertyName] || properties[propertyName];\n}\n\nfunction getFeatureByType(\n coordinates: Position[],\n type: BinaryGeometryType\n): Polygon | LineString | Point {\n switch (type) {\n case 'Polygon':\n return {type: 'Polygon', coordinates: [coordinates]};\n case 'LineString':\n return {type: 'LineString', coordinates};\n case 'Point':\n return {type: 'Point', coordinates: coordinates[0]};\n default:\n throw new Error('Invalid geometry type');\n }\n}\n\nfunction getRingCoordinatesFor(\n startIndex: number,\n endIndex: number,\n positions: BinaryAttribute\n) {\n const ringCoordinates = [];\n\n for (let j = startIndex; j < endIndex; j++) {\n ringCoordinates.push(\n Array.from(\n positions.value.subarray(j * positions.size, (j + 1) * positions.size)\n )\n );\n }\n\n return ringCoordinates;\n}\n\nfunction calculateFeatures({\n map,\n spatialFilter,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n spatialFilter?: SpatialFilter;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n if (!data?.properties.length) {\n return;\n }\n\n if (!spatialFilter) {\n addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n } else {\n addIntersectedFeaturesInTile({\n map,\n data,\n spatialFilter,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n });\n }\n}\n\nfunction addAllFeaturesInTile({\n map,\n data,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n options,\n}: {\n map: TileMap;\n data: BinaryFeature;\n type: BinaryGeometryType;\n bbox: BBox;\n tileFormat?: TileFormat;\n uniqueIdProperty?: string;\n options?: GeometryExtractOptions;\n}) {\n const indices = getIndices(data, type);\n const storeGeometry = options?.storeGeometry || false;\n for (let i = 0; i < indices.length - 1; i++) {\n const startIndex = indices[i];\n const endIndex = indices[i + 1];\n processTileFeatureProperties({\n map,\n data,\n startIndex,\n endIndex,\n type,\n bbox,\n tileFormat,\n uniqueIdProperty,\n storeGeometry,\n });\n }\n}\n\n/**\n * BinaryPointFeature does not include indices, so we generate in-memory\n * indices to allow processing points similarly to other topologies.\n */\nfunction createIndicesForPoints(data: BinaryPointFeature): BinaryAttribute {\n const featureIds = data.featureIds.value;\n const lastFeatureId = featureIds[featureIds.length - 1];\n const PointIndicesArray = featureIds.constructor as TypedArrayConstructor;\n\n const pointIndices: BinaryAttribute = {\n value: new PointIndicesArray(featureIds.length + 1),\n size: 1,\n };\n pointIndices.value.set(featureIds);\n pointIndices.value.set([lastFeatureId + 1], featureIds.length);\n return pointIndices;\n}\n","import {SpatialIndex} from '../constants.js';\nimport {getResolution as quadbinGetResolution} from 'quadbin';\nimport type {SpatialFilter, SpatialIndexTile} from '../types.js';\nimport type {Feature} from 'geojson';\nimport {getResolution as h3GetResolution} from 'h3-js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {SpatialDataType} from '../sources/types.js';\nimport {intersectTileH3, intersectTileQuadbin} from './tileIntersection.js';\n\nexport type TileFeaturesSpatialIndexOptions = {\n tiles: SpatialIndexTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n};\n\nexport function tileFeaturesSpatialIndex({\n tiles,\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n}: TileFeaturesSpatialIndexOptions): FeatureData[] {\n const map = new Map();\n const spatialIndex = getSpatialIndex(spatialDataType);\n const cellResolution = getResolution(tiles, spatialIndex);\n const spatialIndexIDName = spatialDataColumn\n ? spatialDataColumn\n : spatialIndex;\n\n if (!cellResolution) {\n return [];\n }\n\n let intersection: undefined | boolean | Set<bigint | string>;\n\n // Compute H3 intersection globally, Quadbin intersection per-tile. See tileIntersection.ts.\n if (spatialIndex === SpatialIndex.H3) {\n intersection = intersectTileH3(cellResolution as number, spatialFilter);\n }\n\n for (const tile of tiles) {\n if (tile.isVisible === false || !tile.data) {\n continue;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n const parent = getTileIndex(tile, spatialIndex);\n intersection = intersectTileQuadbin(\n parent as bigint,\n cellResolution as bigint,\n spatialFilter\n );\n }\n\n if (!intersection) continue;\n\n tile.data.forEach((d: Feature) => {\n // @ts-expect-error Mixed types for cell indices.\n if (intersection === true || intersection.has(d.id as bigint | string)) {\n map.set(d.id, {...d.properties, [spatialIndexIDName]: d.id});\n }\n });\n }\n return Array.from(map.values());\n}\n\nfunction getTileIndex(\n tile: SpatialIndexTile,\n spatialIndex: SpatialIndex\n): bigint | string {\n if (spatialIndex === SpatialIndex.QUADBIN) {\n // @ts-expect-error Missing types for quadbin tile indices.\n return tile.index.q;\n }\n return tile.id;\n}\n\nfunction getResolution(\n tiles: SpatialIndexTile[],\n spatialIndex: SpatialIndex\n): bigint | number | undefined {\n const data = tiles.find((tile) => tile.data?.length)?.data;\n\n if (!data) {\n return;\n }\n\n if (spatialIndex === SpatialIndex.QUADBIN) {\n return Number(quadbinGetResolution(data[0].id));\n }\n\n if (spatialIndex === SpatialIndex.H3) {\n return h3GetResolution(data[0].id);\n }\n}\n\nfunction getSpatialIndex(spatialDataType: SpatialDataType): SpatialIndex {\n switch (spatialDataType) {\n case 'h3':\n return SpatialIndex.H3;\n case 'quadbin':\n return SpatialIndex.QUADBIN;\n default:\n throw new Error('Unexpected spatial data type');\n }\n}\n","/** @internal */\nexport const V3_MINOR_VERSION = '3.4';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport const DEFAULT_GEO_COLUMN = 'geom';\n\n/**\n * Fastly default limit is 8192; leave some padding.\n * @privateRemarks Source: @deck.gl/carto\n */\nexport const DEFAULT_MAX_LENGTH_URL = 7000;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport const DEFAULT_TILE_RESOLUTION = 0.5;\n\n/**\n * @todo TODO(v0.5): Update DEFAULT_TILE_RESOLUTION and remove this constant.\n * @internal\n */\nexport const REDUCED_QUERIES_TILE_RESOLUTION = 1;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_H3 = 4;\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n * @internal\n */\nexport const DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN = 6;\n\n/** @internal */\nexport const DEFAULT_AGGREGATION_EXP_ALIAS = '__aggregationValue';\nexport const DEFAULT_AGGREGATION_EXP = `1 AS ${DEFAULT_AGGREGATION_EXP_ALIAS}`;\n","import {cellToTile, getResolution, tileToCell} from 'quadbin';\nimport type {RasterTile, SpatialFilter, Tile} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n RasterMetadata,\n RasterMetadataBand,\n SpatialDataType,\n} from '../sources/types.js';\nimport {intersectTileRaster} from './tileIntersection.js';\n\nexport type TileFeaturesRasterOptions = {\n tiles: RasterTile[];\n spatialFilter?: SpatialFilter;\n spatialDataColumn: string;\n spatialDataType: SpatialDataType;\n rasterMetadata: RasterMetadata;\n};\n\nexport function tileFeaturesRaster({\n tiles,\n ...options\n}: TileFeaturesRasterOptions): FeatureData[] {\n // Cache band metadata for faster lookup while iterating over pixels.\n const metadataByBand: Record<string, RasterMetadataBand & {nodata: number}> =\n {};\n for (const band of options.rasterMetadata.bands) {\n // TODO(cleanup): Remove copy and cast after API is updated to return 'nodata' as a number.\n metadataByBand[band.name] = {...band, nodata: Number(band.nodata)};\n }\n\n // Omit empty and invisible tiles for simpler processing and types.\n tiles = tiles.filter(isRasterTileVisible);\n if (tiles.length === 0) return [];\n\n // Raster tiles, and all pixels, are quadbin cells. Resolution of a pixel is\n // the resolution of the tile, plus the number of subdivisions. Block size\n // must be square, N x N, where N is a power of two.\n const tileResolution = getResolution(tiles[0].index.q);\n const tileBlockSize = tiles[0].data!.blockSize;\n const cellResolution = tileResolution + BigInt(Math.log2(tileBlockSize));\n\n const data = new Map<bigint, FeatureData>();\n\n for (const tile of tiles as Required<RasterTile>[]) {\n const parent = tile.index.q;\n\n const intersection = intersectTileRaster(\n parent,\n cellResolution,\n options.spatialFilter\n );\n\n if (intersection === false) continue;\n\n const tileSortedCells = cellToChildrenRaster(parent, cellResolution);\n\n // For each pixel/cell within the spatial filter, create a FeatureData.\n // Order is row-major, starting from NW and ending at SE.\n for (let i = 0; i < tileSortedCells.length; i++) {\n if (intersection !== true && !intersection.has(tileSortedCells[i])) {\n continue;\n }\n\n const cellData: FeatureData = {};\n let cellDataExists = false;\n\n for (const band in tile.data.cells.numericProps) {\n const value = tile.data.cells.numericProps[band].value[i];\n const bandMetadata = metadataByBand[band];\n\n if (isValidBandValue(value, bandMetadata.nodata)) {\n cellData[band] = tile.data.cells.numericProps[band].value[i];\n cellDataExists = true;\n }\n }\n\n if (cellDataExists) {\n data.set(tileSortedCells[i], cellData);\n }\n }\n }\n\n return Array.from(data.values());\n}\n\n/**\n * Detects whether a given {@link Tile} is a {@link RasterTile}.\n * @privateRemarks Method of detection is arbitrary, and may be changed.\n */\nexport function isRasterTile(tile: Tile): tile is RasterTile {\n return !!(tile.data as Record<string, unknown>)?.cells;\n}\n\nfunction isRasterTileVisible(tile: RasterTile): tile is Required<RasterTile> {\n return !!(tile.isVisible && tile.data?.cells?.numericProps);\n}\n\n/**\n * Alternative to `quadbin` module's `cellToChildren()` function, modified to\n * return cells in row-major order, NW to SE, as stored in CARTO raster tiles.\n * Sorting after computing cells is too slow.\n */\nfunction cellToChildrenRaster(parent: bigint, resolution: bigint): bigint[] {\n const parentTile = cellToTile(parent);\n\n // 1. Calculate x/y/z of upper left pixel in raster tile.\n const childZ = Number(resolution);\n const blockSize = 2 ** (childZ - parentTile.z);\n const childBaseX = parentTile.x * blockSize;\n const childBaseY = parentTile.y * blockSize;\n\n // 2. Iterate pixels in raster tile order; compute cell ID from base x/y.\n const cells: bigint[] = [];\n for (let i = 0, il = blockSize ** 2; i < il; i++) {\n const x = childBaseX + (i % blockSize);\n const y = childBaseY + Math.floor(i / blockSize);\n cells.push(tileToCell({x, y, z: childZ}));\n }\n\n return cells;\n}\n\n/**\n * Returns true if the given value is valid (not NaN, not 'nodata')\n * for the given raster band.\n */\nfunction isValidBandValue(value: unknown, nodata: number): value is number {\n return Number.isNaN(value) ? false : nodata !== value;\n}\n","import type {FilterType} from './constants.js';\nimport type {Polygon, MultiPolygon, Feature} from 'geojson';\nimport type {BinaryFeature, BinaryFeatureCollection} from '@loaders.gl/schema';\n\n/******************************************************************************\n * MAP INSTANTIATION\n */\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport enum SchemaFieldType {\n Number = 'number',\n Bigint = 'bigint',\n String = 'string',\n Geometry = 'geometry',\n Timestamp = 'timestamp',\n Object = 'object',\n Boolean = 'boolean',\n Variant = 'variant',\n Unknown = 'unknown',\n}\n\n/**\n * @privateRemarks Source: @deck.gl/carto\n */\nexport interface SchemaField {\n name: string;\n type: SchemaFieldType; // Field type in the CARTO stack, common for all providers\n}\n\n/******************************************************************************\n * MAPS AND TILES\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Format = 'json' | 'geojson' | 'tilejson';\n\n/** @privateRemarks Source: @carto/constants, @deck.gl/carto */\nexport type MapType = 'boundary' | 'query' | 'table' | 'tileset' | 'raster';\n\n/** @privateRemarks Source: cloud-native */\nexport type ProviderType =\n | 'bigquery'\n | 'postgres'\n | 'snowflake'\n | 'redshift'\n | 'databricks'\n | 'carto'\n | 'carto_dw';\n\n/**\n * Alias for GeoJSON 'BBox' type, semantically representing a viewport.\n * Order of values is \"west\", \"south\", \"east\", \"north\".\n */\nexport type Viewport = [number, number, number, number];\n\n/**\n * Subset of deck.gl's Tile2DHeader type, containing only the properties\n * required for local widget calculations. Deeper dependencies on deck.gl\n * APIs should be minimized within this library: @deck.gl/carto depends\n * on the API client, not the other way around.\n * @privateRemarks Source: @deck.gl/geo-layers\n */\nexport type Tile = {\n index: {x: number; y: number; z: number};\n id: string;\n bbox: {west: number; east: number; north: number; south: number};\n isVisible: boolean;\n data?: BinaryFeatureCollection;\n};\n\n/** Subset of deck.gl's Tile2DHeader type, for spatial indexes. */\nexport type SpatialIndexTile = Tile & {\n data?: (Feature & {id: bigint})[];\n};\n\nexport type RasterTile = Tile & {\n id: string;\n index: {q: bigint; i: string};\n data?: Raster;\n};\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type Raster = {\n blockSize: number;\n cells: {\n numericProps: BinaryFeature['numericProps'];\n properties: BinaryFeature['properties'];\n };\n};\n\n/******************************************************************************\n * AGGREGATION\n */\n\n/**\n * Enum type for the different types of aggregations available for widgets.\n *\n * @privateRemarks Source: @carto/constants\n * @privateRemarks Converted from enum to type union, for improved declarative API.\n */\nexport type AggregationType =\n | 'count'\n | 'avg'\n | 'min'\n | 'max'\n | 'sum'\n | 'custom';\n\n/******************************************************************************\n * FILTERS\n */\n\n/** @privateRemarks Source: @carto/react-api */\nexport type SpatialFilter = Polygon | MultiPolygon;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport interface Filters {\n [column: string]: Filter;\n}\n\n/** @privateRemarks Source: @carto/react-api, @deck.gl/carto */\nexport interface Filter {\n [FilterType.IN]?: {owner?: string; values: number[] | string[]};\n /** [a, b] both are included. */\n [FilterType.BETWEEN]?: {owner?: string; values: number[][]};\n /** [a, b) a is included, b is not. */\n [FilterType.CLOSED_OPEN]?: {owner?: string; values: number[][]};\n [FilterType.TIME]?: {owner?: string; values: number[][]};\n [FilterType.STRING_SEARCH]?: {\n owner?: string;\n values: string[];\n params?: StringSearchOptions;\n };\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport type FilterLogicalOperator = 'and' | 'or';\n\n/**\n * Type for minimum or maximum value of an interval. Values 'null' and\n * 'undefined' are intentionally allowed, and represent an unbounded value.\n */\nexport type FilterIntervalExtremum = number | null | undefined;\nexport type FilterInterval = [FilterIntervalExtremum, FilterIntervalExtremum];\nexport type FilterIntervalComplete = [number, number];\n\nexport type StringSearchOptions = {\n useRegExp?: boolean;\n mustStart?: boolean;\n mustEnd?: boolean;\n caseSensitive?: boolean;\n keepSpecialCharacters?: boolean;\n};\n\n/******************************************************************************\n * GROUPING\n */\n\n/**\n * Defines a step size increment for use with {@link TimeSeriesRequestOptions}.\n *\n * @privateRemarks Source: @carto/react-core\n */\nexport type GroupDateType =\n | 'year'\n | 'month'\n | 'week'\n | 'day'\n | 'hour'\n | 'minute'\n | 'second';\n\n/******************************************************************************\n * SORTING\n */\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortColumnType = 'number' | 'string' | 'date';\n\n/******************************************************************************\n * SQL QUERY PARAMETERS\n */\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameterValue =\n | string\n | number\n | boolean\n | Array<QueryParameterValue>\n | object;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type NamedQueryParameter = Record<string, QueryParameterValue>;\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type PositionalQueryParameter = QueryParameterValue[];\n\n/** @privateRemarks Source: @deck.gl/carto */\nexport type QueryParameters = NamedQueryParameter | PositionalQueryParameter;\n","import {SchemaFieldType, type Filter, type SchemaField} from './types.js';\nimport {FilterType} from './constants.js';\nimport type {SpatialDataType} from './sources/types.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\n/**\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n\ntype Row<T> = Record<string, T> | Record<string, T>[] | T[] | T;\n\n/**\n * Due to each data warehouse having its own behavior with columns,\n * we need to normalize them and transform every key to lowercase.\n *\n * @privateRemarks Source: @carto/react-widgets\n * @internal\n */\nexport function normalizeObjectKeys<T, R extends Row<T>>(el: R): R {\n if (Array.isArray(el)) {\n return el.map((value) => normalizeObjectKeys(value)) as R;\n } else if (typeof el !== 'object') {\n return el;\n }\n\n return Object.entries(el as Record<string, T>).reduce(\n (acc, [key, value]) => {\n acc[key.toLowerCase()] =\n typeof value === 'object' && value ? normalizeObjectKeys(value) : value;\n return acc;\n },\n {} as Record<string, T>\n ) as R;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * @privateRemarks Source: @carto/react-core\n * @internal\n */\nexport class InvalidColumnError extends Error {\n protected static readonly NAME = 'InvalidColumnError';\n\n constructor(message: string) {\n super(`${InvalidColumnError.NAME}: ${message}`);\n this.name = InvalidColumnError.NAME;\n }\n\n static is(error: unknown) {\n return (\n error instanceof InvalidColumnError ||\n (error as Error).message?.includes(InvalidColumnError.NAME)\n );\n }\n}\n\nexport function isEmptyObject(object: object): boolean {\n for (const _ in object) {\n return false;\n }\n return true;\n}\n\n/** @internal */\nexport const isObject: (x: unknown) => boolean = (x) =>\n x !== null && typeof x === 'object';\n\n/** @internal */\nexport const isPureObject: (x: any) => boolean = (x) =>\n isObject(x) && x.constructor === {}.constructor;\n\n/**\n * Merges one or more source objects into a target object. Unlike `Object.assign`, does not\n * assign properties with undefined values. Null values will overwrite existing properties.\n */\nexport function assignOptional<T extends object, U, V>(\n target: T,\n source1: U,\n source2: V\n): T & U & V;\nexport function assignOptional<T extends object, U>(\n target: T,\n source: U\n): T & U;\nexport function assignOptional<T extends object, U>(\n target: T,\n ...sources: any[]\n): any {\n for (const source of sources) {\n for (const key in source) {\n if (source[key] !== undefined) {\n (target as Record<string, unknown>)[key] = source[key];\n }\n }\n }\n return target as T & U;\n}\n\n/**\n * Returns the spatialDataType expected for widget operations, given layer source props. The\n * spatialDataType used in widget operations may be different from that of the layer. For\n * dynamically aggregated point datasets, widgets use type 'geo', not the aggregation type.\n */\nexport function getWidgetSpatialDataType(\n spatialDataType: SpatialDataType,\n spatialDataColumn: string,\n schema: SchemaField[]\n): SpatialDataType {\n const field = schema.find((field) => field.name === spatialDataColumn);\n if (field && field.type === SchemaFieldType.Geometry) {\n return 'geo';\n }\n\n return spatialDataType;\n}\n","import type {\n RasterTile,\n SpatialFilter,\n SpatialIndexTile,\n Tile,\n} from '../types.js';\nimport {tileFeaturesGeometries} from './tileFeaturesGeometries.js';\nimport {tileFeaturesSpatialIndex} from './tileFeaturesSpatialIndex.js';\nimport {TileFormat} from '../constants.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {RasterMetadata, SpatialDataType} from '../sources/types.js';\nimport {isRasterTile, tileFeaturesRaster} from './tileFeaturesRaster.js';\nimport {assert} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatures = {\n tiles: Tile[];\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n spatialFilter?: SpatialFilter;\n uniqueIdProperty?: string;\n rasterMetadata?: RasterMetadata;\n storeGeometry?: boolean;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport type TileFeatureExtractOptions = {\n storeGeometry?: boolean;\n spatialDataType?: SpatialDataType;\n spatialDataColumn?: string;\n uniqueIdProperty?: string;\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function tileFeatures({\n tiles,\n spatialFilter,\n uniqueIdProperty,\n tileFormat,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialDataType,\n rasterMetadata,\n storeGeometry = false,\n}: TileFeatures): FeatureData[] {\n if (spatialDataType === 'geo') {\n return tileFeaturesGeometries({\n tiles,\n tileFormat,\n spatialFilter,\n uniqueIdProperty,\n options: {storeGeometry},\n });\n }\n\n if (tiles.some(isRasterTile)) {\n assert(rasterMetadata, 'Missing raster metadata');\n return tileFeaturesRaster({\n tiles: tiles as RasterTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n rasterMetadata,\n });\n }\n\n return tileFeaturesSpatialIndex({\n tiles: tiles as SpatialIndexTile[],\n spatialFilter,\n spatialDataColumn,\n spatialDataType,\n });\n}\n","import type {Feature} from 'geojson';\nimport type {FilterLogicalOperator, Filters} from '../types.js';\nimport {FilterType} from '../constants.js';\nimport {_buildFeatureFilter} from '../filters/index.js';\nimport type {FeatureData} from '../types-internal.js';\n\ntype TimeFilter = Filters['string'][FilterType.TIME] & {\n params?: {offsetBy?: number};\n};\n\n/**\n * deck.gl's DataFilterExtension supports GPU filtering with 1–4 values. We\n * allocate filters[0] to generic filters and filters[1] to time filters.\n *\n * getFilterValue() _must_ return an array of the same size as the filterSize\n * used to initialize the DataFilterExtension. We document that users must use\n * filterSize=4 for compatibility with @link {getDataFilterExtensionProps}.\n */\nconst DEFAULT_FILTER_SIZE = 4;\n\n/** @experimental Prefer type definition from deck.gl. */\nexport type _DataFilterExtensionProps = {\n filterRange: number[][];\n updateTriggers: Record<string, string>;\n getFilterValue: (feature: Feature | FeatureData) => number[];\n};\n\n/**\n * Creates props for DataFilterExtension, from `@deck.gl/extensions`, given\n * a set of filters. Requires that DataFilterExtension is initialized with\n * filterSize=4, where the CARTO filters will occupy the first two slots.\n *\n * @example To create a deck.gl layer with GPU data filtering:\n * ```typescript\n * import {DataFilterExtension} from '@deck.gl/extensions';\n * import {VectorTileLayer} from '@deck.gl/layers';\n * import {getDataFilterExtensionProps} from '@carto/api-client';\n *\n * const layer = new VectorTileLayer({\n * data: data,\n * extensions: [new DataFilterExtension({filterSize: 4})],\n * ...getDataFilterExtensionProps(filters),\n * });\n * ```\n */\nexport function getDataFilterExtensionProps(\n filters: Filters,\n filtersLogicalOperator?: FilterLogicalOperator\n): _DataFilterExtensionProps {\n const {filtersWithoutTimeType, timeColumn, timeFilter} =\n getFiltersByType(filters);\n return {\n filterRange: getFilterRange(timeFilter, DEFAULT_FILTER_SIZE),\n updateTriggers: getUpdateTriggers(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter\n ),\n getFilterValue: getFilterValue(\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n DEFAULT_FILTER_SIZE,\n filtersLogicalOperator\n ),\n };\n}\n\n/** @internal */\nfunction getFiltersByType(filters: Filters) {\n const filtersWithoutTimeType: Filters = {};\n\n let timeColumn: string | null = null;\n let timeFilter: TimeFilter | null = null;\n\n for (const [column, columnData] of Object.entries(filters)) {\n for (const [type, typeData] of Object.entries(columnData) as [\n FilterType,\n unknown,\n ][]) {\n if (type === FilterType.TIME) {\n timeColumn = column;\n timeFilter = typeData as TimeFilter;\n } else {\n filtersWithoutTimeType[column] = {[type]: typeData};\n }\n }\n }\n\n return {\n filtersWithoutTimeType,\n timeColumn,\n timeFilter,\n };\n}\n\n/** @internal */\nfunction getFilterRange(\n timeFilter: TimeFilter | null,\n filterSize: number\n): number[][] {\n const result = Array(filterSize).fill([0, 0]);\n // According to getFilterValue all filters are resolved as 0 or 1 in the first position of the array\n // except the time filter value that is resolved with the real value of the feature in the second position of the array\n result[0] = [1, 1];\n if (timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n result[1] = timeFilter.values[0].map((v) => v - offsetBy);\n }\n return result;\n}\n\n/** @internal */\nfunction getUpdateTriggers(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null\n) {\n const result: Record<string, object> = {...filtersWithoutTimeType};\n\n // We don't want to change the layer UpdateTriggers every time that the time filter changes\n // because this filter is changed by the time series widget during its animation\n // so we remove the time filter value from the `updateTriggers`\n if (timeColumn && timeFilter) {\n result[timeColumn] = {\n ...result[timeColumn],\n offsetBy: timeFilter.params?.offsetBy,\n [FilterType.TIME]: {}, // Allows working with other filters, without an impact on performance.\n };\n }\n return {\n getFilterValue: JSON.stringify(result),\n };\n}\n\n/** @internal */\nfunction getFilterValue(\n filtersWithoutTimeType: Filters,\n timeColumn: string | null,\n timeFilter: TimeFilter | null,\n filterSize: number,\n filtersLogicalOperator?: FilterLogicalOperator\n) {\n const result = Array(filterSize).fill(0);\n const featureFilter = _buildFeatureFilter({\n filters: filtersWithoutTimeType,\n type: 'number',\n filtersLogicalOperator,\n });\n\n // We evaluate all filters except the time filter using _buildFeatureFilter function.\n // For the time filter, we return the value of the feature and we will change the getFilterRange result\n // every time this filter changes\n return (feature: Feature | FeatureData) => {\n result[0] = featureFilter(feature);\n\n if (timeColumn && timeFilter) {\n const offsetBy = timeFilter.params?.offsetBy || 0;\n const f = (feature.properties || feature) as Record<string, unknown>;\n result[1] = (f[timeColumn] as number) - offsetBy;\n }\n return result;\n };\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type APIRequestType =\n | 'Map data'\n | 'Map instantiation'\n | 'Public map'\n | 'Tile stats'\n | 'SQL'\n | 'Basemap style';\n\nexport type APIErrorContext = {\n requestType: APIRequestType;\n mapId?: string;\n connection?: string;\n source?: string;\n type?: MapType;\n};\n\n/**\n *\n * Custom error for reported errors in CARTO Maps API.\n * Provides useful debugging information in console and context for applications.\n *\n */\nexport class CartoAPIError extends Error {\n /** Source error from server */\n error: Error;\n\n /** Context (API call & parameters) in which error occured */\n errorContext: APIErrorContext;\n\n /** Response from server */\n response?: Response;\n\n /** JSON Response from server */\n responseJson?: any;\n\n constructor(\n error: Error,\n errorContext: APIErrorContext,\n response?: Response,\n responseJson?: any\n ) {\n let responseString = 'Failed to connect';\n if (response) {\n responseString = 'Server returned: ';\n if (response.status === 400) {\n responseString += 'Bad request';\n } else if (response.status === 401 || response.status === 403) {\n responseString += 'Unauthorized access';\n } else if (response.status === 404) {\n responseString += 'Not found';\n } else {\n responseString += 'Error';\n }\n\n responseString += ` (${response.status}):`;\n }\n responseString += ` ${error.message || error}`;\n\n let message = `${errorContext.requestType} API request failed`;\n message += `\\n${responseString}`;\n for (const key of Object.keys(errorContext)) {\n if (key === 'requestType') continue;\n message += `\\n${formatErrorKey(key)}: ${(errorContext as any)[key]}`;\n }\n message += '\\n';\n\n super(message);\n\n this.name = 'CartoAPIError';\n this.response = response;\n this.responseJson = responseJson;\n this.error = error;\n this.errorContext = errorContext;\n }\n}\n\n/**\n * Converts camelCase to Camel Case\n */\nfunction formatErrorKey(key: string) {\n return key.replace(/([A-Z])/g, ' $1').replace(/^./, (s) => s.toUpperCase());\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {MapType} from '../types.js';\n\nexport type V3Endpoint = 'maps' | 'stats' | 'sql';\n\nfunction joinPath(...args: string[]): string {\n return args\n .map((part) => (part.endsWith('/') ? part.slice(0, -1) : part))\n .join('/');\n}\n\nfunction buildV3Path(\n apiBaseUrl: string,\n version: 'v3',\n endpoint: V3Endpoint,\n ...rest: string[]\n): string {\n return joinPath(apiBaseUrl, version, endpoint, ...rest);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildPublicMapUrl({\n apiBaseUrl,\n cartoMapId,\n}: {\n apiBaseUrl: string;\n cartoMapId: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', 'public', cartoMapId);\n}\n\n/** @internal Required by fetchMap(). */\nexport function buildStatsUrl({\n attribute,\n apiBaseUrl,\n connectionName,\n source,\n type,\n}: {\n attribute: string;\n apiBaseUrl: string;\n connectionName: string;\n source: string;\n type: MapType;\n}): string {\n if (type === 'query') {\n return buildV3Path(apiBaseUrl, 'v3', 'stats', connectionName, attribute);\n }\n\n // type === 'table'\n return buildV3Path(\n apiBaseUrl,\n 'v3',\n 'stats',\n connectionName,\n source,\n attribute\n );\n}\n\nexport function buildSourceUrl({\n apiBaseUrl,\n connectionName,\n endpoint,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n endpoint: MapType;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'maps', connectionName, endpoint);\n}\n\nexport function buildQueryUrl({\n apiBaseUrl,\n connectionName,\n}: {\n apiBaseUrl: string;\n connectionName: string;\n}): string {\n return buildV3Path(apiBaseUrl, 'v3', 'sql', connectionName, 'query');\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {isPureObject} from '../utils.js';\nimport {CartoAPIError, type APIErrorContext} from './carto-api-error.js';\nimport {V3_MINOR_VERSION} from '../constants-internal.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {getClient} from '../client.js';\nimport type {LocalCacheOptions} from '../sources/types.js';\n\nconst DEFAULT_HEADERS = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n};\n\nconst DEFAULT_REQUEST_CACHE = new Map<string, Promise<unknown>>();\n\nexport async function requestWithParameters<T = any>({\n baseUrl,\n parameters = {},\n headers: customHeaders = {},\n errorContext,\n maxLengthURL = DEFAULT_MAX_LENGTH_URL,\n localCache,\n signal,\n}: {\n baseUrl: string;\n parameters?: Record<string, unknown>;\n headers?: Record<string, string>;\n errorContext: APIErrorContext;\n maxLengthURL?: number;\n localCache?: LocalCacheOptions;\n signal?: AbortSignal;\n}): Promise<T> {\n // Parameters added to all requests issued with `requestWithParameters()`.\n // These parameters override parameters already in the base URL, but not\n // user-provided parameters.\n parameters = {\n v: V3_MINOR_VERSION,\n client: getClient(),\n ...(typeof deck !== 'undefined' &&\n deck.VERSION && {deckglVersion: deck.VERSION}),\n ...parameters,\n };\n\n baseUrl = excludeURLParameters(baseUrl, Object.keys(parameters));\n const key = createCacheKey(baseUrl, parameters, customHeaders);\n\n const {\n cache: REQUEST_CACHE,\n canReadCache,\n canStoreInCache,\n } = getCacheSettings(localCache);\n\n if (canReadCache && REQUEST_CACHE.has(key)) {\n return REQUEST_CACHE.get(key) as Promise<T>;\n }\n\n const url = createURLWithParameters(baseUrl, parameters);\n const headers = {...DEFAULT_HEADERS, ...customHeaders};\n\n /* global fetch */\n const fetchPromise =\n url.length > maxLengthURL\n ? fetch(baseUrl, {\n method: 'POST',\n body: JSON.stringify(parameters),\n headers,\n signal,\n })\n : fetch(url, {headers, signal});\n\n let response: Response | undefined;\n let responseJson: unknown;\n const jsonPromise: Promise<T> = fetchPromise\n .then((_response: Response) => {\n response = _response;\n return response.json();\n })\n .then((json: any) => {\n responseJson = json;\n if (!response || !response.ok) {\n throw new Error(json.error);\n }\n return json;\n })\n .catch((error: Error) => {\n if (canStoreInCache) {\n REQUEST_CACHE.delete(key);\n }\n throw new CartoAPIError(error, errorContext, response, responseJson);\n });\n\n if (canStoreInCache) {\n REQUEST_CACHE.set(key, jsonPromise);\n }\n return jsonPromise;\n}\n\nfunction getCacheSettings(localCache: LocalCacheOptions | undefined) {\n const canReadCache = localCache?.cacheControl?.includes('no-cache')\n ? false\n : true;\n const canStoreInCache = localCache?.cacheControl?.includes('no-store')\n ? false\n : true;\n const cache = localCache?.cache || DEFAULT_REQUEST_CACHE;\n\n return {\n cache,\n canReadCache,\n canStoreInCache,\n };\n}\n\nfunction createCacheKey(\n baseUrl: string,\n parameters: Record<string, unknown>,\n headers: Record<string, string>\n): string {\n const parameterEntries = Object.entries(parameters).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n const headerEntries = Object.entries(headers).sort(([a], [b]) =>\n a > b ? 1 : -1\n );\n return JSON.stringify({\n baseUrl,\n parameters: parameterEntries,\n headers: headerEntries,\n });\n}\n\n/**\n * Appends query string parameters to a URL. Existing URL parameters are kept,\n * unless there is a conflict, in which case the new parameters override\n * those already in the URL.\n */\nfunction createURLWithParameters(\n baseUrlString: string,\n parameters: Record<string, unknown>\n): string {\n const baseUrl = new URL(baseUrlString);\n for (const [key, value] of Object.entries(parameters)) {\n if (isPureObject(value) || Array.isArray(value)) {\n baseUrl.searchParams.set(key, JSON.stringify(value));\n } else {\n if (value !== null && value !== undefined) {\n baseUrl.searchParams.set(\n key,\n (value as string | boolean | number).toString()\n );\n }\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Deletes query string parameters from a URL.\n */\nfunction excludeURLParameters(baseUrlString: string, parameters: string[]) {\n const baseUrl = new URL(baseUrlString);\n for (const param of parameters) {\n if (baseUrl.searchParams.has(param)) {\n baseUrl.searchParams.delete(param);\n }\n }\n return baseUrl.toString();\n}\n\n/**\n * Clears the HTTP response cache for all requests using the default cache.\n * @internal\n */\nexport function clearDefaultRequestCache() {\n DEFAULT_REQUEST_CACHE.clear();\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_API_BASE_URL} from '../constants.js';\nimport {DEFAULT_MAX_LENGTH_URL} from '../constants-internal.js';\nimport {buildSourceUrl} from '../api/endpoints.js';\nimport {requestWithParameters} from '../api/request-with-parameters.js';\nimport type {\n SourceOptionalOptions,\n SourceRequiredOptions,\n TilejsonMapInstantiation,\n TilejsonResult,\n} from './types.js';\nimport type {MapType} from '../types.js';\nimport type {APIErrorContext} from '../api/index.js';\nimport {getClient} from '../client.js';\n\nexport const SOURCE_DEFAULTS: Omit<SourceOptionalOptions, 'clientId'> = {\n apiBaseUrl: DEFAULT_API_BASE_URL,\n headers: {},\n maxLengthURL: DEFAULT_MAX_LENGTH_URL,\n};\n\nexport async function baseSource<UrlParameters extends Record<string, unknown>>(\n endpoint: MapType,\n options: Partial<SourceOptionalOptions> & SourceRequiredOptions,\n urlParameters: UrlParameters\n): Promise<TilejsonResult> {\n const {accessToken, connectionName, cache, ...optionalOptions} = options;\n const mergedOptions = {\n ...SOURCE_DEFAULTS,\n clientId: getClient(),\n accessToken,\n connectionName,\n endpoint,\n };\n for (const key in optionalOptions) {\n if (optionalOptions[key as keyof typeof optionalOptions]) {\n (mergedOptions as any)[key] =\n optionalOptions[key as keyof typeof optionalOptions];\n }\n }\n const baseUrl = buildSourceUrl(mergedOptions);\n const {clientId, maxLengthURL, localCache} = mergedOptions;\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {client: clientId, ...options.tags, ...urlParameters};\n\n const errorContext: APIErrorContext = {\n requestType: 'Map instantiation',\n connection: options.connectionName,\n type: endpoint,\n source: JSON.stringify(parameters, undefined, 2),\n };\n const {tilejson, schema} =\n await requestWithParameters<TilejsonMapInstantiation>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n\n const dataUrl = tilejson.url[0];\n if (cache) {\n cache.value = parseInt(\n new URL(dataUrl).searchParams.get('cache') || '',\n 10\n );\n }\n errorContext.requestType = 'Map data';\n\n const json = await requestWithParameters<TilejsonResult>({\n baseUrl: dataUrl,\n parameters: {client: clientId},\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n });\n if (accessToken) {\n json.accessToken = accessToken;\n }\n if (schema) {\n json.schema = schema;\n }\n return json;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {QueryParameters} from '../types.js';\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryQuerySourceOptions = SourceOptions &\n FilterOptions & {\n columns?: string[];\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: QueryParameters;\n };\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n propertiesSqlQuery: string;\n queryParameters?: Record<string, unknown> | unknown[];\n};\n\nexport type BoundaryQuerySourceResponse = TilejsonResult;\n\nexport const boundaryQuerySource = async function (\n options: BoundaryQuerySourceOptions\n): Promise<BoundaryQuerySourceResponse> {\n const {\n columns,\n filters,\n tilesetTableName,\n propertiesSqlQuery,\n queryParameters,\n } = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesSqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport type {FilterOptions, SourceOptions, TilejsonResult} from './types.js';\n\nexport type BoundaryTableSourceOptions = SourceOptions &\n FilterOptions & {\n tilesetTableName: string;\n columns?: string[];\n propertiesTableName: string;\n };\ntype UrlParameters = {\n filters?: Record<string, unknown>;\n tilesetTableName: string;\n columns?: string;\n propertiesTableName: string;\n};\n\nexport type BoundaryTableSourceResponse = TilejsonResult;\n\nexport const boundaryTableSource = async function (\n options: BoundaryTableSourceOptions\n): Promise<BoundaryTableSourceResponse> {\n const {filters, tilesetTableName, columns, propertiesTableName} = options;\n const urlParameters: UrlParameters = {\n tilesetTableName,\n propertiesTableName,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('boundary', options, urlParameters);\n};\n","import type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentRequestOptions,\n ExtentResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {FilterLogicalOperator, Filter} from '../types.js';\nimport {getClient} from '../client.js';\nimport type {SourceOptions} from '../sources/index.js';\nimport {ApiVersion, DEFAULT_API_BASE_URL} from '../constants.js';\n\nexport interface WidgetSourceProps extends Omit<SourceOptions, 'filters'> {\n apiVersion?: ApiVersion;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n}\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetSource<\n Props extends WidgetSourceProps = WidgetSourceProps,\n> {\n readonly props: Props;\n\n static defaultProps: Partial<WidgetSourceProps> = {\n apiVersion: ApiVersion.V3,\n apiBaseUrl: DEFAULT_API_BASE_URL,\n clientId: getClient(),\n filters: {},\n filtersLogicalOperator: 'and',\n };\n\n constructor(props: Props) {\n this.props = {\n ...WidgetSource.defaultProps,\n clientId: getClient(), // Refresh clientId, default may have changed.\n ...props,\n };\n }\n\n /**\n * Destroys the widget source and releases allocated resources.\n *\n * For remote sources (tables, queries) this has no effect, but for local\n * sources (tilesets, rasters) these resources will affect performance\n * and stability if many (10+) sources are created and not released.\n */\n destroy() {\n // no-op in most cases, but required for worker sources.\n }\n\n /**\n * Returns a list of labeled datapoints for categorical data. Suitable for\n * charts including grouped bar charts, pie charts, and tree charts.\n */\n abstract getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse>;\n\n /**\n * Given a list of feature IDs (as found in `_carto_feature_id`) returns all\n * matching features. In datasets containing features with duplicate geometries,\n * feature IDs may be duplicated (IDs are a hash of geometry) and so more\n * results may be returned than IDs in the request.\n * @internal\n * @experimental\n */\n abstract getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse>;\n\n /**\n * Returns a scalar numerical statistic over all matching data. Suitable\n * for 'headline' or 'scorecard' figures such as counts and sums.\n */\n abstract getFormula(options: FormulaRequestOptions): Promise<FormulaResponse>;\n\n /**\n * Returns a list of labeled datapoints for 'bins' of data defined as ticks\n * over a numerical range. Suitable for histogram charts.\n */\n abstract getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse>;\n\n /**\n * Returns a range (min and max) for a numerical column of matching rows.\n * Suitable for displaying certain 'headline' or 'scorecard' statistics,\n * or rendering a range slider UI for filtering.\n */\n abstract getRange(options: RangeRequestOptions): Promise<RangeResponse>;\n\n /**\n * Returns a list of bivariate datapoints defined as numerical 'x' and 'y'\n * values. Suitable for rendering scatter plots.\n */\n abstract getScatter(options: ScatterRequestOptions): Promise<ScatterResponse>;\n\n /**\n * Returns a list of arbitrary data rows, with support for pagination and\n * sorting. Suitable for displaying tables and lists.\n */\n abstract getTable(options: TableRequestOptions): Promise<TableResponse>;\n\n /**\n * Returns a series of labeled numerical values, grouped into equally-sized\n * time intervals. Suitable for rendering time series charts.\n */\n abstract getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse>;\n\n /**\n * Returns multiple aggregated values computed over matching data. Suitable\n * for aggregated statistics from pivoted tables, such as H3 tables with\n * pre-computed aggregations across multiple columns.\n */\n abstract getAggregations(\n options: AggregationsRequestOptions\n ): Promise<AggregationsResponse>;\n\n /** @experimental */\n abstract getExtent(options?: ExtentRequestOptions): Promise<ExtentResponse>;\n}\n","import {InvalidColumnError} from '../utils.js';\n\n/** @privateRemarks Source: @carto/react-api */\nexport interface ModelRequestOptions {\n method: 'GET' | 'POST';\n headers?: Record<string, string>;\n signal?: AbortSignal;\n otherOptions?: Record<string, unknown>;\n body?: string;\n}\n\ninterface ModelErrorResponse {\n error?: string | string[];\n hint?: string;\n column_name?: string;\n}\n\n/**\n * Return more descriptive error from API\n * @privateRemarks Source: @carto/react-api\n */\nexport function dealWithApiError({\n response,\n data,\n}: {\n response: Response;\n data: ModelErrorResponse;\n}) {\n if (data.error === 'Column not found') {\n throw new InvalidColumnError(`${data.error} ${data.column_name}`);\n }\n\n if (\n typeof data.error === 'string' &&\n data.error?.includes('Missing columns')\n ) {\n throw new InvalidColumnError(data.error);\n }\n\n switch (response.status) {\n case 401:\n throw new Error('Unauthorized access. Invalid credentials');\n case 403:\n throw new Error('Forbidden access to the requested data');\n default:\n throw new Error(\n data && data.error && typeof data.error === 'string'\n ? data.error\n : JSON.stringify(data?.hint || data.error?.[0])\n );\n }\n}\n\n/** @privateRemarks Source: @carto/react-api */\nexport async function makeCall({\n url,\n accessToken,\n opts,\n}: {\n url: string;\n accessToken: string;\n opts: ModelRequestOptions;\n}) {\n let response;\n let data;\n const isPost = opts?.method === 'POST';\n try {\n response = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n ...(isPost && {'Content-Type': 'application/json'}),\n ...opts.headers,\n },\n ...(isPost && {\n method: opts?.method,\n body: opts?.body,\n }),\n signal: opts?.signal,\n ...opts?.otherOptions,\n });\n data = await response.json();\n } catch (error) {\n if ((error as Error).name === 'AbortError') throw error;\n\n throw new Error(`Failed request: ${error as Error}`);\n }\n\n if (!response.ok) {\n dealWithApiError({response, data});\n }\n\n return data;\n}\n","import {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport type {\n Filter,\n FilterLogicalOperator,\n MapType,\n QueryParameters,\n SpatialFilter,\n} from '../types.js';\nimport {assert, isPureObject} from '../utils.js';\nimport {type ModelRequestOptions, makeCall} from './common.js';\nimport {ApiVersion} from '../constants.js';\nimport type {\n SpatialDataType,\n SpatialFilterPolyfillMode,\n} from '../sources/types.js';\n\n/** @privateRemarks Source: @carto/react-api */\nconst AVAILABLE_MODELS = [\n 'category',\n 'histogram',\n 'formula',\n 'pick',\n 'timeseries',\n 'range',\n 'scatterplot',\n 'table',\n 'aggregations',\n] as const;\n\nexport type Model = (typeof AVAILABLE_MODELS)[number];\n\nexport interface ModelSource {\n type: MapType;\n apiVersion: ApiVersion;\n apiBaseUrl: string;\n accessToken: string;\n clientId: string;\n connectionName: string;\n data: string;\n filters?: Record<string, Filter>;\n filtersLogicalOperator?: FilterLogicalOperator;\n spatialFilter?: SpatialFilter;\n queryParameters?: QueryParameters;\n spatialDataColumn?: string;\n spatialDataType?: SpatialDataType;\n spatialFiltersMode?: SpatialFilterPolyfillMode;\n tags?: Record<string, string>;\n}\n\nconst {V3} = ApiVersion;\nconst REQUEST_GET_MAX_URL_LENGTH = 2048;\n\n/**\n * Execute a SQL model request.\n * @privateRemarks Source: @carto/react-api\n */\nexport function executeModel(props: {\n model: Model;\n source: ModelSource;\n params: Record<string, unknown>;\n opts?: Partial<ModelRequestOptions>;\n}) {\n assert(props.source, 'executeModel: missing source');\n assert(props.model, 'executeModel: missing model');\n assert(props.params, 'executeModel: missing params');\n\n assert(\n AVAILABLE_MODELS.includes(props.model),\n `executeModel: model provided isn't valid. Available models: ${AVAILABLE_MODELS.join(\n ', '\n )}`\n );\n\n const {model, source, params, opts} = props;\n const {type, apiVersion, apiBaseUrl, accessToken, connectionName, clientId} =\n source;\n\n assert(apiBaseUrl, 'executeModel: missing apiBaseUrl');\n assert(accessToken, 'executeModel: missing accessToken');\n assert(apiVersion === V3, 'executeModel: SQL Model API requires CARTO 3+');\n assert(type !== 'tileset', 'executeModel: Tilesets not supported');\n\n let url = `${apiBaseUrl}/v3/sql/${connectionName}/model/${model}`;\n\n const {\n data,\n filters,\n filtersLogicalOperator = 'and',\n spatialDataType = 'geo',\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n spatialFiltersMode = 'intersects',\n tags,\n } = source;\n\n const queryParams: Record<string, unknown> = {\n type,\n client: clientId,\n source: data,\n params,\n queryParameters: source.queryParameters || '',\n filters,\n filtersLogicalOperator,\n ...(tags ?? {}),\n };\n\n queryParams.spatialDataType = spatialDataType;\n queryParams.spatialDataColumn = spatialDataColumn;\n\n if (source.spatialFilter) {\n // API supports multiple filters, we apply it only to spatialDataColumn\n queryParams.spatialFilters = {[spatialDataColumn]: source.spatialFilter};\n if (spatialDataType !== 'geo') {\n queryParams.spatialFiltersMode = spatialFiltersMode;\n }\n }\n\n const urlWithSearchParams =\n url + '?' + objectToURLSearchParams(queryParams).toString();\n const isGet = urlWithSearchParams.length <= REQUEST_GET_MAX_URL_LENGTH;\n if (isGet) {\n url = urlWithSearchParams;\n }\n return makeCall({\n url,\n accessToken: source.accessToken,\n opts: {\n ...opts,\n method: isGet ? 'GET' : 'POST',\n ...(!isGet && {body: JSON.stringify(queryParams)}),\n },\n });\n}\n\nfunction objectToURLSearchParams(object: Record<string, unknown>) {\n const params = new URLSearchParams();\n for (const key in object) {\n if (isPureObject(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (Array.isArray(object[key])) {\n params.append(key, JSON.stringify(object[key]));\n } else if (object[key] === null) {\n params.append(key, 'null');\n } else if (object[key] !== undefined) {\n params.append(key, String(object[key] as unknown));\n }\n }\n return params;\n}\n","import {FilterType} from './constants.js';\nimport type {Filter} from './types.js';\nimport {isEmptyObject} from './utils.js';\n\nconst FILTER_TYPES = new Set(Object.values(FilterType));\nconst isFilterType = (type: string): type is FilterType =>\n FILTER_TYPES.has(type as FilterType);\n\ntype FilterTypeOptions<T extends FilterType> = {\n type: T;\n column: string;\n} & Filter[T];\n\nexport type AddFilterOptions =\n | FilterTypeOptions<FilterType.IN>\n | FilterTypeOptions<FilterType.BETWEEN>\n | FilterTypeOptions<FilterType.CLOSED_OPEN>\n | FilterTypeOptions<FilterType.TIME>\n | FilterTypeOptions<FilterType.STRING_SEARCH>;\n\n/**\n * Adds a {@link Filter} to the filter set. Any previous filters with the same\n * `column` and `type` will be replaced.\n */\nexport function addFilter(\n filters: Record<string, Filter>,\n {column, type, values, owner}: AddFilterOptions\n): Record<string, Filter> {\n if (!filters[column]) {\n filters[column] = {};\n }\n\n const filter = {values, owner} as FilterTypeOptions<typeof type>;\n (filters[column][type] as FilterTypeOptions<typeof type>) = filter;\n\n return filters;\n}\n\nexport type RemoveFilterOptions = {\n column: string;\n owner?: string;\n};\n\n/**\n * Removes one or more {@link Filter filters} from the filter set. If only\n * `column` is specified, then all filters on that column are removed. If both\n * `column` and `owner` are specified, then only filters for that column\n * associated with the owner are removed.\n */\nexport function removeFilter(\n filters: Record<string, Filter>,\n {column, owner}: RemoveFilterOptions\n): Record<string, Filter> {\n const filter = filters[column];\n if (!filter) {\n return filters;\n }\n\n if (owner) {\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n delete filter[type as FilterType];\n }\n }\n }\n\n if (!owner || isEmptyObject(filter)) {\n delete filters[column];\n }\n\n return filters;\n}\n\n/**\n * Clears all {@link Filter filters} from the filter set.\n */\nexport function clearFilters(\n filters: Record<string, Filter>\n): Record<string, Filter> {\n for (const column of Object.keys(filters)) {\n delete filters[column];\n }\n return filters;\n}\n\nexport type HasFilterOptions = {\n column: string;\n owner?: string;\n};\n\nexport function hasFilter(\n filters: Record<string, Filter>,\n {column, owner}: HasFilterOptions\n): boolean {\n const filter = filters[column];\n if (!filter) {\n return false;\n }\n\n if (!owner) {\n return true;\n }\n\n for (const type of FILTER_TYPES) {\n if (owner === filter[type as FilterType]?.owner) {\n return true;\n }\n }\n\n return false;\n}\n\nexport type GetFilterOptions<T extends FilterType> = {\n column: string;\n type: T;\n owner?: string;\n};\n\nexport function getFilter<T extends FilterType>(\n filters: Record<string, Filter>,\n {column, type, owner}: GetFilterOptions<T>\n): Filter[T] | null {\n const filter = filters[column];\n if (!filter) {\n return null;\n }\n\n if (!owner || owner === filter[type]?.owner) {\n return filter[type] || null;\n }\n\n return null;\n}\n\n/**\n * Given all filters for a dataset, returns the subset of filters that are not\n * attributable to the given owner. Typically used to allow filterable widgets\n * to affect other widgets *without* filtering themselves.\n *\n * @privateRemarks Source: @carto/react-widgets\n */\nexport function getApplicableFilters(\n owner?: string,\n filters?: Record<string, Filter>\n): Record<string, Filter> {\n if (!filters) return {};\n\n const applicableFilters: Record<string, Filter> = {};\n\n for (const column in filters) {\n for (const type in filters[column]) {\n if (!isFilterType(type)) continue;\n\n const filter = filters[column][type];\n const isApplicable = !owner || !filter?.owner || filter?.owner !== owner;\n if (filter && isApplicable) {\n applicableFilters[column] ||= {};\n (applicableFilters[column][type] as typeof filter) = filter;\n }\n }\n }\n\n return applicableFilters;\n}\n","/**\n * Name of the category that represents the \"Others\" category.\n *\n * See `WidgetSource.getCategories` for more information.\n */\nexport const OTHERS_CATEGORY_NAME = '_carto_others';\n","import {executeModel, type ModelSource} from '../models/index.js';\nimport type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentRequestOptions,\n ExtentResponse,\n FeaturesRequestOptions,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {assert, normalizeObjectKeys} from '../utils.js';\nimport {DEFAULT_TILE_RESOLUTION} from '../constants-internal.js';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport type {Filters} from '../types.js';\nimport {AggregationTypes, ApiVersion} from '../constants.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\nimport {requestWithParameters} from '../api/request-with-parameters.js';\nimport type {APIErrorContext} from '../api/carto-api-error.js';\n\nexport type WidgetRemoteSourceProps = WidgetSourceProps;\n\n/**\n * Source for Widget API requests.\n *\n * Abstract class. Use {@link WidgetQuerySource} or {@link WidgetTableSource}.\n */\nexport abstract class WidgetRemoteSource<\n Props extends WidgetRemoteSourceProps,\n> extends WidgetSource<Props> {\n /**\n * Subclasses of {@link WidgetRemoteSource} must implement this method, calling\n * {@link WidgetRemoteSource.prototype._getModelSource} for common source\n * properties, and adding additional required properties including 'type' and\n * 'data'.\n */\n protected abstract getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource;\n\n protected _getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): Omit<ModelSource, 'type' | 'data'> {\n const props = this.props;\n return {\n apiVersion: props.apiVersion as ApiVersion,\n apiBaseUrl: props.apiBaseUrl as string,\n clientId: props.clientId as string,\n accessToken: props.accessToken,\n connectionName: props.connectionName,\n filters: getApplicableFilters(filterOwner, filters || props.filters),\n filtersLogicalOperator: props.filtersLogicalOperator,\n spatialDataType: props.spatialDataType,\n spatialDataColumn: props.spatialDataColumn,\n tags: props.tags,\n };\n }\n\n async getCategories(\n options: CategoryRequestOptions\n ): Promise<CategoryResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n rawResult,\n ...params\n } = options;\n const {\n column,\n operation,\n operationColumn,\n operationExp,\n othersThreshold,\n orderBy,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n const result = await executeModel({\n model: 'category',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n operation,\n operationExp,\n operationColumn: operationColumn || column,\n othersThreshold,\n orderBy,\n },\n opts: {signal, headers: this.props.headers},\n });\n\n const normalizedRows = normalizeObjectKeys(result.rows || []);\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return normalizedRows;\n }\n\n return [\n ...normalizedRows,\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n async getFeatures(\n options: FeaturesRequestOptions\n ): Promise<FeaturesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, dataType, featureIds, z, limit, tileResolution} = params;\n\n type FeaturesModelResponse = {rows: Record<string, unknown>[]};\n\n return executeModel({\n model: 'pick',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n columns,\n dataType,\n featureIds,\n z,\n limit: limit || 1000,\n tileResolution: tileResolution || DEFAULT_TILE_RESOLUTION,\n },\n opts: {signal, headers: this.props.headers},\n // Avoid `normalizeObjectKeys()`, which changes column names.\n }).then(({rows}: FeaturesModelResponse) => ({rows}));\n }\n\n async getFormula(options: FormulaRequestOptions): Promise<FormulaResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n operationExp,\n ...params\n } = options;\n const {column, operation} = params;\n\n type FormulaModelResponse = {rows: {value: number}[]};\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n return executeModel({\n model: 'formula',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: column ?? '*',\n operation: operation ?? AggregationTypes.Count,\n operationExp,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: FormulaModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getHistogram(\n options: HistogramRequestOptions\n ): Promise<HistogramResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column, operation, ticks} = params;\n\n type HistogramModelResponse = {rows: {tick: number; value: number}[]};\n\n const data = await executeModel({\n model: 'histogram',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column, operation, ticks},\n opts: {signal, headers: this.props.headers},\n }).then((res: HistogramModelResponse) => normalizeObjectKeys(res.rows));\n\n if (data.length) {\n // Given N ticks the API returns up to N+1 bins, omitting any empty bins. Bins\n // include 1 bin below the lowest tick, N-1 between ticks, and 1 bin above the highest tick.\n const result = Array(ticks.length + 1).fill(0);\n data.forEach(\n ({tick, value}: {tick: number; value: number}) => (result[tick] = value)\n );\n return result;\n }\n\n return [];\n }\n\n async getRange(options: RangeRequestOptions): Promise<RangeResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {column} = params;\n\n type RangeModelResponse = {rows: {min: number; max: number}[]};\n\n return executeModel({\n model: 'range',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {column},\n opts: {signal, headers: this.props.headers},\n }).then((res: RangeModelResponse) => normalizeObjectKeys(res.rows[0]));\n }\n\n async getScatter(options: ScatterRequestOptions): Promise<ScatterResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {xAxisColumn, xAxisJoinOperation, yAxisColumn, yAxisJoinOperation} =\n params;\n\n // Make sure this is sync with the same constant in cloud-native/maps-api\n const HARD_LIMIT = 500;\n\n type ScatterModelResponse = {rows: {x: number; y: number}[]};\n\n return executeModel({\n model: 'scatterplot',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n xAxisColumn,\n xAxisJoinOperation,\n yAxisColumn,\n yAxisJoinOperation,\n limit: HARD_LIMIT,\n },\n opts: {signal, headers: this.props.headers},\n })\n .then((res: ScatterModelResponse) => normalizeObjectKeys(res.rows))\n .then((res) => res.map(({x, y}: {x: number; y: number}) => [x, y]));\n }\n\n async getTable(options: TableRequestOptions): Promise<TableResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {columns, sortBy, sortDirection, offset = 0, limit = 10} = params;\n\n type TableModelResponse = {\n rows: Record<string, number | string>[];\n metadata: {total: number};\n };\n\n return executeModel({\n model: 'table',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column: columns,\n sortBy,\n sortDirection,\n limit,\n offset,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TableModelResponse) => ({\n // Avoid `normalizeObjectKeys()`, which changes column names.\n rows: res.rows ?? (res as any).ROWS,\n totalCount: res.metadata?.total ?? (res as any).METADATA?.TOTAL,\n }));\n }\n\n async getTimeSeries(\n options: TimeSeriesRequestOptions\n ): Promise<TimeSeriesResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n ...params\n } = options;\n const {\n column,\n operationColumn,\n joinOperation,\n operation,\n operationExp,\n stepSize,\n stepMultiplier,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n } = params;\n\n if (operation === AggregationTypes.Custom) {\n assert(operationExp, 'operationExp is required for custom operation');\n }\n\n type TimeSeriesModelResponse = {\n rows: {name: string; value: number}[];\n metadata: {categories: string[]};\n };\n\n return executeModel({\n model: 'timeseries',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n column,\n stepSize,\n stepMultiplier,\n operationColumn: operationColumn || column,\n joinOperation,\n operation,\n operationExp,\n splitByCategory,\n splitByCategoryLimit,\n splitByCategoryValues,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: TimeSeriesModelResponse) => ({\n rows: normalizeObjectKeys(res.rows),\n categories: res.metadata?.categories,\n }));\n }\n\n async getAggregations(\n options: AggregationsRequestOptions\n ): Promise<AggregationsResponse> {\n const {\n signal,\n filters = this.props.filters,\n filterOwner,\n spatialFilter,\n spatialFiltersMode,\n aggregations,\n } = options;\n\n return executeModel({\n model: 'aggregations',\n source: {\n ...this.getModelSource(filters, filterOwner),\n spatialFiltersMode,\n spatialFilter,\n },\n params: {\n aggregations,\n },\n opts: {signal, headers: this.props.headers},\n }).then((res: AggregationsResponse) => ({\n rows: res.rows.map((row) => normalizeObjectKeys(row)),\n }));\n }\n\n /** @experimental */\n async getExtent(options: ExtentRequestOptions = {}): Promise<ExtentResponse> {\n const {signal, filters = this.props.filters, filterOwner} = options;\n\n const {\n type,\n data,\n apiBaseUrl,\n apiVersion,\n connectionName,\n spatialDataColumn,\n spatialDataType,\n queryParameters,\n } = this.getModelSource(filters, filterOwner);\n\n assert(apiVersion === ApiVersion.V3, 'Stats API requires CARTO 3+');\n\n let url: string;\n\n const parameters: Record<string, unknown> = {filters, spatialDataType};\n\n if (type === 'query') {\n url = `${apiBaseUrl}/${apiVersion}/stats/${connectionName}/${spatialDataColumn}`;\n parameters.q = data;\n parameters.queryParameters = queryParameters;\n } else {\n url = `${apiBaseUrl}/${apiVersion}/stats/${connectionName}/${data}/${spatialDataColumn}`;\n }\n\n const headers = {\n Authorization: `Bearer ${this.props.accessToken}`,\n ...this.props.headers,\n };\n\n const errorContext: APIErrorContext = {\n requestType: 'Tile stats',\n connection: connectionName,\n type: type,\n };\n\n type StatsResponse = {\n extent: {\n xmin: number;\n ymin: number;\n xmax: number;\n ymax: number;\n };\n };\n\n return requestWithParameters<StatsResponse>({\n baseUrl: url,\n headers,\n signal,\n errorContext,\n parameters,\n }).then(({extent: {xmin, ymin, xmax, ymax}}) => ({\n bbox: [xmin, ymin, xmax, ymax],\n }));\n }\n}\n","import type {\n H3QuerySourceOptions,\n QuadbinQuerySourceOptions,\n VectorQuerySourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerQuerySourceOptions =\n | Omit<VectorQuerySourceOptions, 'filters'>\n | Omit<H3QuerySourceOptions, 'filters'>\n | Omit<QuadbinQuerySourceOptions, 'filters'>;\n\nexport type WidgetQuerySourceResult = {widgetSource: WidgetQuerySource};\n\n/**\n * Source for Widget API requests on a data source defined by a SQL query.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorQuerySource}, {@link h3QuerySource}, or {@link quadbinQuerySource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorQuerySource } from '@carto/api-client';\n *\n * const data = vectorQuerySource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * sqlQuery: 'SELECT * FROM carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetQuerySource extends WidgetRemoteSource<\n LayerQuerySourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'query',\n data: this.props.sqlQuery,\n queryParameters: this.props.queryParameters,\n };\n }\n}\n","import type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type AggregationFunction = (\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n) => number;\n\n/** @privateRemarks Source: @carto/react-core */\nexport const aggregationFunctions: Record<\n Exclude<AggregationType, 'custom'>,\n AggregationFunction\n> = {\n count: (values) => values.length,\n min: (...args) => applyAggregationFunction(min, ...args),\n max: (...args) => applyAggregationFunction(max, ...args),\n sum: (...args) => applyAggregationFunction(sum, ...args),\n avg: (...args) => applyAggregationFunction(avg, ...args),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function aggregate(\n feature: FeatureData,\n keys?: string[],\n operation?: AggregationType\n): unknown {\n if (!keys?.length) {\n throw new Error('Cannot aggregate a feature without having keys');\n } else if (keys.length === 1) {\n const value = feature[keys[0]];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n }\n\n const aggregationFn =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!aggregationFn) {\n throw new Error(`${operation} isn't a valid aggregation function`);\n }\n\n return aggregationFn(\n keys.map((column) => {\n const value = feature[column];\n return isPotentiallyValidNumber(value) ? Number(value) : value;\n })\n );\n}\n\n/*\n * Forced casting to Number (just of non empty strings) allows to work-around\n * some specific situations, where a big numeric field is transformed into a string when generating the tileset(eg.PG)\n */\nfunction isPotentiallyValidNumber(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nconst applyAggregationFunction = (\n aggFn: AggregationFunction,\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n operation?: AggregationType\n) => {\n const normalizedKeys = normalizeKeys(keys);\n const elements =\n (normalizedKeys?.length || 0) <= 1\n ? filterFalsyElements(values as unknown[], normalizedKeys || [])\n : values;\n return aggFn(elements, keys, operation);\n};\n\nfunction filterFalsyElements(\n values: unknown[] | FeatureData[],\n keys: string[]\n) {\n const filterFn = (value: unknown) => value !== null && value !== undefined;\n\n if (!keys?.length) {\n return values.filter(filterFn);\n }\n\n return (values as FeatureData[]).filter((v) => filterFn(v[keys[0]]));\n}\n\n// Aggregation functions\nfunction avg(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n return sum(values, keys, joinOperation) / (values.length || 1);\n}\n\nfunction sum(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) => a + (aggregate(b, normalizedKeys, joinOperation) as number),\n 0\n );\n }\n\n return values.reduce((a: number, b: unknown) => a + (b as number), 0);\n}\n\nfunction min(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.min(a, aggregate(b, normalizedKeys, joinOperation) as number),\n Infinity\n );\n }\n\n let min = Number.POSITIVE_INFINITY;\n for (const value of values as number[]) {\n min = Math.min(min, value);\n }\n return min;\n}\n\nfunction max(\n values: unknown[] | FeatureData[],\n keys?: string[] | string,\n joinOperation?: AggregationType\n): number {\n const normalizedKeys = normalizeKeys(keys);\n if (normalizedKeys) {\n return (values as FeatureData[]).reduce(\n (a, b) =>\n Math.max(a, aggregate(b, normalizedKeys, joinOperation) as number),\n -Infinity\n );\n }\n\n let max = Number.NEGATIVE_INFINITY;\n for (const value of values as number[]) {\n max = Math.max(max, value);\n }\n return max;\n}\n\n// Aux\n\n// Keys can come as a string (one column) or a strings array (multiple column)\n// Use always an array to make the code easier\nfunction normalizeKeys(keys: unknown): string[] | undefined {\n return Array.isArray(keys)\n ? keys\n : typeof keys === 'string'\n ? [keys]\n : undefined;\n}\n","import {firstBy} from 'thenby';\nimport type {SortDirection} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n// TODO(cleanup): Could this be simplified?\ntype SortColumns = string | string[] | object[];\n\ninterface SortOptions {\n sortBy?: SortColumns;\n sortByDirection?: SortDirection;\n sortByColumnType?: 'number' | 'string' | 'date';\n}\n\n/**\n * Apply sort structure to a collection of features\n * @param features\n * @param [sortOptions]\n * @param [sortOptions.sortBy] - One or more columns to sort by\n * @param [sortOptions.sortByDirection] - Direction by the columns will be sorted\n * @param [sortOptions.sortByColumnType] - Column type\n * @internal\n * @privateRemarks Source: @carto/react-core\n */\nexport function applySorting(\n features: FeatureData[],\n {\n sortBy,\n sortByDirection = 'asc',\n sortByColumnType = 'string',\n }: SortOptions = {}\n): FeatureData[] {\n // If sortBy is undefined, pass all features\n if (sortBy === undefined) {\n return features;\n }\n\n // sortOptions exists, but are bad formatted\n const isValidSortBy =\n (Array.isArray(sortBy) && sortBy.length) || // sortBy can be an array of columns\n typeof sortBy === 'string'; // or just one column\n\n if (!isValidSortBy) {\n throw new Error('Sorting options are bad formatted');\n }\n const sortFn = createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType: sortByColumnType || 'string',\n });\n return features.sort(sortFn);\n}\n\n// Aux\nfunction createSortFn({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const [firstSortOption, ...othersSortOptions] = normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n }) as Parameters<typeof firstBy>[];\n\n let sortFn = firstBy(...firstSortOption);\n for (const sortOptions of othersSortOptions) {\n sortFn = sortFn.thenBy(...sortOptions);\n }\n\n return sortFn;\n}\n\nfunction normalizeSortByOptions({\n sortBy,\n sortByDirection,\n sortByColumnType,\n}: Required<SortOptions>) {\n const numberFormat = sortByColumnType === 'number' && {\n cmp: (a: number, b: number) => a - b,\n };\n if (!Array.isArray(sortBy)) {\n sortBy = [sortBy];\n }\n return sortBy.map((sortByEl) => {\n // sortByEl is 'column'\n if (typeof sortByEl === 'string') {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n if (Array.isArray(sortByEl)) {\n // sortBy is ['column']\n if (sortByEl[1] === undefined) {\n return [sortByEl, {direction: sortByDirection, ...numberFormat}];\n }\n\n // sortBy is ['column', { ... }]\n if (typeof sortByEl[1] === 'object') {\n const othersSortOptions = numberFormat\n ? {...numberFormat, ...sortByEl[1]}\n : sortByEl[1];\n return [\n sortByEl[0],\n {direction: sortByDirection, ...othersSortOptions},\n ];\n }\n }\n return sortByEl;\n });\n}\n","import {aggregationFunctions, aggregate} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {\n CategoryOrderBy,\n CategoryResponseEntry,\n CategoryResponseRaw,\n} from '../widget-sources/types.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n operation,\n othersThreshold,\n orderBy = 'frequency_desc',\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: AggregationType;\n keysColumn: string;\n operation: AggregationType;\n othersThreshold?: number;\n orderBy?: CategoryOrderBy;\n}): CategoryResponseRaw | null {\n if (Array.isArray(data) && data.length === 0) {\n return {rows: null};\n }\n const groups = data.reduce((accumulator, item) => {\n const group = item[keysColumn];\n\n const values = accumulator.get(group) || [];\n accumulator.set(group, values);\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid =\n (operation === 'count' ? true : aggregatedValue !== null) &&\n aggregatedValue !== undefined;\n\n if (isValid) {\n values.push(aggregatedValue);\n accumulator.set(group, values);\n }\n\n return accumulator;\n }, new Map()); // We use a map to be able to maintain the type in the key value\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n if (!targetOperation) {\n return {rows: []};\n }\n\n const allCategories = Array.from(groups)\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort(getSorter(orderBy));\n\n if (othersThreshold && allCategories.length > othersThreshold) {\n const otherValue = allCategories\n .slice(othersThreshold)\n .flatMap(({name}) => groups.get(name));\n return {\n rows: allCategories,\n metadata: {\n others: targetOperation(otherValue),\n },\n };\n }\n\n return {\n rows: allCategories,\n };\n}\n\nexport function getSorter(\n orderBy: CategoryOrderBy\n): (a: CategoryResponseEntry, b: CategoryResponseEntry) => number {\n switch (orderBy) {\n case 'frequency_asc':\n // 'value ASC, name ASC'\n return (a, b) => a.value - b.value || nameCompare(a.name, b.name);\n case 'frequency_desc':\n // 'value DESC, name ASC'\n return (a, b) => b.value - a.value || nameCompare(a.name, b.name);\n case 'alphabetical_asc':\n // 'name ASC, value DESC'\n return (a, b) => nameCompare(a.name, b.name) || b.value - a.value;\n case 'alphabetical_desc':\n // 'name DESC, value DESC'\n return (a, b) => nameCompare(b.name, a.name) || b.value - a.value;\n }\n}\n\nfunction nameCompare(\n a?: CategoryResponseEntry['name'],\n b?: CategoryResponseEntry['name']\n) {\n // Despite the naming of 'alphabetical_*' sort options, we still want to\n // sort numeric category names (usually raster datasets) numerically.\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n return String(a ?? 'null').localeCompare(String(b ?? 'null'));\n}\n","/**\n * Returns midnight (local time) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getDay();\n const diff = dateCp.getDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setDate(diff);\n dateCp.setHours(0, 0, 0, 0);\n return dateCp.getTime();\n}\n\n/**\n * Returns midnight (UTC) on the Monday preceeding a given date, in\n * milliseconds since the UNIX epoch.\n */\nexport function getUTCMonday(date: number | Date): number {\n const dateCp = new Date(date);\n const day = dateCp.getUTCDay();\n const diff = dateCp.getUTCDate() - day + (day ? 1 : -6); // adjust when day is sunday\n dateCp.setUTCDate(diff);\n return Date.UTC(\n dateCp.getUTCFullYear(),\n dateCp.getUTCMonth(),\n dateCp.getUTCDate()\n );\n}\n","import type {AggregationType, GroupDateType} from '../types.js';\nimport {getUTCMonday} from '../utils/dateUtils.js';\nimport {aggregate, aggregationFunctions} from './aggregation.js';\n\n/** @privateRemarks Source: @carto/react-core */\nexport type GroupByFeature = {\n name: string;\n value: number;\n}[];\n\nconst GROUP_KEY_FN_MAPPING: Record<GroupDateType, (date: Date) => number> = {\n year: (date: Date) => Date.UTC(date.getUTCFullYear()),\n month: (date: Date) => Date.UTC(date.getUTCFullYear(), date.getUTCMonth()),\n week: (date: Date) => getUTCMonday(date),\n day: (date: Date) =>\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()),\n hour: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours()\n ),\n minute: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes()\n ),\n second: (date: Date) =>\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds()\n ),\n};\n\n/** @privateRemarks Source: @carto/react-core */\nexport function groupValuesByDateColumn({\n data,\n valuesColumns,\n joinOperation,\n keysColumn,\n groupType,\n operation,\n}: {\n data: Record<string, unknown>[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n keysColumn: string;\n groupType: GroupDateType;\n operation?: Exclude<AggregationType, 'custom'>;\n}): GroupByFeature | null {\n if (Array.isArray(data) && data.length === 0) {\n return null;\n }\n\n const groupKeyFn = GROUP_KEY_FN_MAPPING[groupType];\n\n if (!groupKeyFn) {\n return null;\n }\n\n const groups = data.reduce((acc, item) => {\n const value = item[keysColumn];\n const formattedValue = new Date(value as number);\n const groupKey = groupKeyFn(formattedValue);\n\n if (!isNaN(groupKey)) {\n let groupedValues = acc.get(groupKey);\n if (!groupedValues) {\n groupedValues = [];\n acc.set(groupKey, groupedValues);\n }\n\n const aggregatedValue = aggregate(item, valuesColumns, joinOperation);\n\n const isValid = aggregatedValue !== null && aggregatedValue !== undefined;\n\n if (isValid) {\n groupedValues.push(aggregatedValue);\n acc.set(groupKey, groupedValues);\n }\n }\n\n return acc;\n }, new Map());\n\n const targetOperation =\n aggregationFunctions[operation as Exclude<AggregationType, 'custom'>];\n\n return [...groups.entries()]\n .map(([name, value]) => ({\n name,\n value: targetOperation(value),\n }))\n .sort((a, b) => a.name - b.name);\n}\n","import {aggregate, aggregationFunctions} from './aggregation.js';\nimport type {AggregationType} from '../types.js';\nimport type {FeatureData} from '../types-internal.js';\n\n/**\n * Histogram computation.\n * @privateRemarks Source: @carto/react-core\n */\nexport function histogram({\n data,\n valuesColumns,\n joinOperation,\n ticks,\n operation,\n}: {\n data: FeatureData[];\n valuesColumns?: string[];\n joinOperation?: Exclude<AggregationType, 'custom'>;\n ticks: number[];\n operation: Exclude<AggregationType, 'custom'>;\n}): number[] {\n if (Array.isArray(data) && data.length === 0) {\n return [];\n }\n\n const binsContainer = [Number.MIN_SAFE_INTEGER, ...ticks].map(\n (tick, index, arr) => ({\n bin: index,\n start: tick,\n end: index === arr.length - 1 ? Number.MAX_SAFE_INTEGER : arr[index + 1],\n values: [] as number[],\n })\n );\n\n data.forEach((feature) => {\n const featureValue = aggregate(\n feature,\n valuesColumns,\n joinOperation\n ) as number;\n\n const isValid = featureValue !== null && featureValue !== undefined;\n\n if (!isValid) {\n return;\n }\n\n const binContainer = binsContainer.find(\n (bin) => bin.start <= featureValue && bin.end > featureValue\n );\n\n if (!binContainer) {\n return;\n }\n\n binContainer.values.push(featureValue);\n });\n\n const targetOperation = aggregationFunctions[operation];\n const transformedBins = binsContainer.map(\n (binContainer) => binContainer.values\n );\n return transformedBins.map((values) =>\n values.length ? targetOperation(values) : 0\n );\n}\n","import {aggregate} from './aggregation.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {AggregationType} from '../types.js';\n\nexport type ScatterPlotFeature = [number, number][];\n\n/**\n * Filters invalid features and formats data.\n * @privateRemarks Source: @carto/react-core\n */\nexport function scatterPlot({\n data,\n xAxisColumns,\n xAxisJoinOperation,\n yAxisColumns,\n yAxisJoinOperation,\n}: {\n data: FeatureData[];\n xAxisColumns: string[];\n xAxisJoinOperation?: AggregationType;\n yAxisColumns: string[];\n yAxisJoinOperation?: AggregationType;\n}): ScatterPlotFeature {\n return data.reduce(\n (acc, feature) => {\n const xValue = aggregate(\n feature,\n xAxisColumns,\n xAxisJoinOperation\n ) as number;\n\n const xIsValid = xValue !== null && xValue !== undefined;\n\n const yValue = aggregate(\n feature,\n yAxisColumns,\n yAxisJoinOperation\n ) as number;\n\n const yIsValid = yValue !== null && yValue !== undefined;\n\n if (xIsValid && yIsValid) {\n acc.push([xValue, yValue]);\n }\n\n return acc;\n },\n [] as [number, number][]\n );\n}\n","import {\n Feature,\n LineString,\n Position,\n GeoJSON,\n Point,\n Polygon,\n GeometryCollection,\n FeatureCollection,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n\n * GeoJSON equality checking utility.\n * Adapted from https://github.com/geosquare/geojson-equality\n *\n * @memberof helpers\n * @type {Class}\n */\nclass GeojsonEquality {\n private precision: number;\n private direction = false;\n private compareProperties = true;\n\n constructor(opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }) {\n this.precision = 10 ** -(opts?.precision ?? 17);\n this.direction = opts?.direction ?? false;\n this.compareProperties = opts?.compareProperties ?? true;\n }\n\n compare(g1: GeoJSON, g2: GeoJSON): boolean {\n if (g1.type !== g2.type) {\n return false;\n }\n\n if (!sameLength(g1, g2)) {\n return false;\n }\n\n switch (g1.type) {\n case \"Point\":\n return this.compareCoord(g1.coordinates, (g2 as Point).coordinates);\n case \"LineString\":\n return this.compareLine(g1.coordinates, (g2 as LineString).coordinates);\n case \"Polygon\":\n return this.comparePolygon(g1, g2 as Polygon);\n case \"GeometryCollection\":\n return this.compareGeometryCollection(g1, g2 as GeometryCollection);\n case \"Feature\":\n return this.compareFeature(g1, g2 as Feature);\n case \"FeatureCollection\":\n return this.compareFeatureCollection(g1, g2 as FeatureCollection);\n default:\n if (g1.type.startsWith(\"Multi\")) {\n const g1s = explode(g1);\n const g2s = explode(\n g2 as MultiLineString | MultiPoint | MultiPolygon\n );\n return g1s.every((g1part) =>\n g2s.some((g2part) => this.compare(g1part as any, g2part as any))\n );\n }\n }\n return false;\n }\n\n private compareCoord(c1: Position, c2: Position) {\n return (\n c1.length === c2.length &&\n c1.every((c, i) => Math.abs(c - c2[i]) < this.precision)\n );\n }\n\n private compareLine(\n path1: Position[],\n path2: Position[],\n ind = 0,\n isPoly = false\n ): boolean {\n if (!sameLength(path1, path2)) {\n return false;\n }\n const p1 = path1;\n let p2 = path2;\n if (isPoly && !this.compareCoord(p1[0], p2[0])) {\n // fix start index of both to same point\n const startIndex = this.fixStartIndex(p2, p1);\n if (!startIndex) {\n return false;\n } else {\n p2 = startIndex;\n }\n }\n // for linestring ind =0 and for polygon ind =1\n const sameDirection = this.compareCoord(p1[ind], p2[ind]);\n if (this.direction || sameDirection) {\n return this.comparePath(p1, p2);\n } else {\n if (this.compareCoord(p1[ind], p2[p2.length - (1 + ind)])) {\n return this.comparePath(p1.slice().reverse(), p2);\n }\n return false;\n }\n }\n\n private fixStartIndex(sourcePath: Position[], targetPath: Position[]) {\n //make sourcePath first point same as of targetPath\n let correctPath,\n ind = -1;\n for (let i = 0; i < sourcePath.length; i++) {\n if (this.compareCoord(sourcePath[i], targetPath[0])) {\n ind = i;\n break;\n }\n }\n if (ind >= 0) {\n correctPath = ([] as Position[]).concat(\n sourcePath.slice(ind, sourcePath.length),\n sourcePath.slice(1, ind + 1)\n );\n }\n return correctPath;\n }\n\n private comparePath(p1: Position[], p2: Position[]) {\n return p1.every((c, i) => this.compareCoord(c, p2[i]));\n }\n\n private comparePolygon(g1: Polygon, g2: Polygon) {\n if (this.compareLine(g1.coordinates[0], g2.coordinates[0], 1, true)) {\n const holes1 = g1.coordinates.slice(1, g1.coordinates.length);\n const holes2 = g2.coordinates.slice(1, g2.coordinates.length);\n return holes1.every((h1) =>\n holes2.some((h2) => this.compareLine(h1, h2, 1, true))\n );\n }\n return false;\n }\n\n private compareGeometryCollection(\n g1: GeometryCollection,\n g2: GeometryCollection\n ) {\n return (\n sameLength(g1.geometries, g2.geometries) &&\n this.compareBBox(g1, g2) &&\n g1.geometries.every((g, i) => this.compare(g, g2.geometries[i]))\n );\n }\n\n private compareFeature(g1: Feature, g2: Feature) {\n return (\n g1.id === g2.id &&\n (this.compareProperties ? equal(g1.properties, g2.properties) : true) &&\n this.compareBBox(g1, g2) &&\n this.compare(g1.geometry, g2.geometry)\n );\n }\n\n private compareFeatureCollection(\n g1: FeatureCollection,\n g2: FeatureCollection\n ) {\n return (\n sameLength(g1.features, g2.features) &&\n this.compareBBox(g1, g2) &&\n g1.features.every((f, i) => this.compare(f, g2.features[i]))\n );\n }\n\n private compareBBox(g1: GeoJSON, g2: GeoJSON): boolean {\n return (\n Boolean(!g1.bbox && !g2.bbox) ||\n (g1.bbox && g2.bbox ? this.compareCoord(g1.bbox, g2.bbox) : false)\n );\n }\n}\n\nfunction sameLength(g1: any, g2: any) {\n return g1.coordinates\n ? g1.coordinates.length === g2.coordinates.length\n : g1.length === g2.length;\n}\n\nfunction explode(g: MultiLineString | MultiPoint | MultiPolygon) {\n return g.coordinates.map((part) => ({\n type: g.type.replace(\"Multi\", \"\"),\n coordinates: part,\n }));\n}\n\nfunction geojsonEquality(\n g1: GeoJSON,\n g2: GeoJSON,\n opts?: {\n precision?: number;\n direction?: boolean;\n compareProperties?: boolean;\n }\n): boolean {\n const eq = new GeojsonEquality(opts);\n\n return eq.compare(g1, g2);\n}\n\n// Adapted from https://medium.com/syncfusion/5-different-ways-to-deep-compare-javascript-objects-6708a0da9f05\nfunction equal(object1: GeoJsonProperties, object2: GeoJsonProperties) {\n if (object1 === null && object2 === null) {\n return true;\n }\n\n if (object1 === null || object2 === null) {\n return false;\n }\n\n const objKeys1 = Object.keys(object1);\n const objKeys2 = Object.keys(object2);\n\n if (objKeys1.length !== objKeys2.length) return false;\n\n for (var key of objKeys1) {\n const value1 = object1[key];\n const value2 = object2[key];\n\n const isObjects = isObject(value1) && isObject(value2);\n\n if (\n (isObjects && !equal(value1, value2)) ||\n (!isObjects && value1 !== value2)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst isObject = (object: any) => {\n return object != null && typeof object === \"object\";\n};\n\nexport { GeojsonEquality, geojsonEquality };\nexport default GeojsonEquality;\n","import { Position } from \"geojson\";\nimport { feature } from \"@turf/helpers\";\nimport { getCoords, getType } from \"@turf/invariant\";\n\n// To-Do => Improve Typescript GeoJSON handling\n\n/**\n * Removes redundant coordinates from any GeoJSON Geometry.\n *\n * @function\n * @param {Geometry|Feature} geojson Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated\n * @returns {Geometry|Feature} the cleaned input Feature/Geometry\n * @example\n * var line = turf.lineString([[0, 0], [0, 2], [0, 5], [0, 8], [0, 8], [0, 10]]);\n * var multiPoint = turf.multiPoint([[0, 0], [0, 0], [2, 2]]);\n *\n * turf.cleanCoords(line).geometry.coordinates;\n * //= [[0, 0], [0, 10]]\n *\n * turf.cleanCoords(multiPoint).geometry.coordinates;\n * //= [[0, 0], [2, 2]]\n */\nfunction cleanCoords(\n geojson: any,\n options: {\n mutate?: boolean;\n } = {}\n) {\n // Backwards compatible with v4.0\n var mutate = typeof options === \"object\" ? options.mutate : options;\n if (!geojson) throw new Error(\"geojson is required\");\n var type = getType(geojson);\n\n // Store new \"clean\" points in this Array\n var newCoords = [];\n\n switch (type) {\n case \"LineString\":\n newCoords = cleanLine(geojson, type);\n break;\n case \"MultiLineString\":\n case \"Polygon\":\n getCoords(geojson).forEach(function (line) {\n newCoords.push(cleanLine(line, type));\n });\n break;\n case \"MultiPolygon\":\n getCoords(geojson).forEach(function (polygons: any) {\n var polyPoints: Position[] = [];\n polygons.forEach(function (ring: Position[]) {\n polyPoints.push(cleanLine(ring, type));\n });\n newCoords.push(polyPoints);\n });\n break;\n case \"Point\":\n return geojson;\n case \"MultiPoint\":\n var existing: Record<string, true> = {};\n getCoords(geojson).forEach(function (coord: any) {\n var key = coord.join(\"-\");\n if (!Object.prototype.hasOwnProperty.call(existing, key)) {\n newCoords.push(coord);\n existing[key] = true;\n }\n });\n break;\n default:\n throw new Error(type + \" geometry not supported\");\n }\n\n // Support input mutation\n if (geojson.coordinates) {\n if (mutate === true) {\n geojson.coordinates = newCoords;\n return geojson;\n }\n return { type: type, coordinates: newCoords };\n } else {\n if (mutate === true) {\n geojson.geometry.coordinates = newCoords;\n return geojson;\n }\n return feature({ type: type, coordinates: newCoords }, geojson.properties, {\n bbox: geojson.bbox,\n id: geojson.id,\n });\n }\n}\n\n/**\n * Clean Coords\n *\n * @private\n * @param {Array<number>|LineString} line Line\n * @param {string} type Type of geometry\n * @returns {Array<number>} Cleaned coordinates\n */\nfunction cleanLine(line: Position[], type: string) {\n var points = getCoords(line);\n // handle \"clean\" segment\n if (points.length === 2 && !equals(points[0], points[1])) return points;\n\n var newPoints = [];\n var secondToLast = points.length - 1;\n var newPointsLength = newPoints.length;\n\n newPoints.push(points[0]);\n for (var i = 1; i < secondToLast; i++) {\n var prevAddedPoint = newPoints[newPoints.length - 1];\n if (\n points[i][0] === prevAddedPoint[0] &&\n points[i][1] === prevAddedPoint[1]\n )\n continue;\n else {\n newPoints.push(points[i]);\n newPointsLength = newPoints.length;\n if (newPointsLength > 2) {\n if (\n isPointOnLineSegment(\n newPoints[newPointsLength - 3],\n newPoints[newPointsLength - 1],\n newPoints[newPointsLength - 2]\n )\n )\n newPoints.splice(newPoints.length - 2, 1);\n }\n }\n }\n newPoints.push(points[points.length - 1]);\n newPointsLength = newPoints.length;\n\n // (Multi)Polygons must have at least 4 points, but a closed LineString with only 3 points is acceptable\n if (\n (type === \"Polygon\" || type === \"MultiPolygon\") &&\n equals(points[0], points[points.length - 1]) &&\n newPointsLength < 4\n ) {\n throw new Error(\"invalid polygon\");\n }\n\n if (type === \"LineString\" && newPointsLength < 3) {\n return newPoints;\n }\n\n if (\n isPointOnLineSegment(\n newPoints[newPointsLength - 3],\n newPoints[newPointsLength - 1],\n newPoints[newPointsLength - 2]\n )\n )\n newPoints.splice(newPoints.length - 2, 1);\n\n return newPoints;\n}\n\n/**\n * Compares two points and returns if they are equals\n *\n * @private\n * @param {Position} pt1 point\n * @param {Position} pt2 point\n * @returns {boolean} true if they are equals\n */\nfunction equals(pt1: Position, pt2: Position) {\n return pt1[0] === pt2[0] && pt1[1] === pt2[1];\n}\n\n/**\n * Returns if `point` is on the segment between `start` and `end`.\n * Borrowed from `@turf/boolean-point-on-line` to speed up the evaluation (instead of using the module as dependency)\n *\n * @private\n * @param {Position} start coord pair of start of line\n * @param {Position} end coord pair of end of line\n * @param {Position} point coord pair of point to check\n * @returns {boolean} true/false\n */\nfunction isPointOnLineSegment(start: Position, end: Position, point: Position) {\n var x = point[0],\n y = point[1];\n var startX = start[0],\n startY = start[1];\n var endX = end[0],\n endY = end[1];\n\n var dxc = x - startX;\n var dyc = y - startY;\n var dxl = endX - startX;\n var dyl = endY - startY;\n var cross = dxc * dyl - dyc * dxl;\n\n if (cross !== 0) return false;\n else if (Math.abs(dxl) >= Math.abs(dyl))\n return dxl > 0 ? startX <= x && x <= endX : endX <= x && x <= startX;\n else return dyl > 0 ? startY <= y && y <= endY : endY <= y && y <= startY;\n}\n\nexport { cleanCoords };\nexport default cleanCoords;\n","import { Feature, Geometry } from \"geojson\";\nimport { geojsonEquality } from \"geojson-equality-ts\";\nimport { cleanCoords } from \"@turf/clean-coords\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Determine whether two geometries of the same type have identical X,Y coordinate values.\n * See http://edndoc.esri.com/arcsde/9.0/general_topics/understand_spatial_relations.htm\n *\n * @function\n * @param {Geometry|Feature} feature1 GeoJSON input\n * @param {Geometry|Feature} feature2 GeoJSON input\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.precision=6] decimal precision to use when comparing coordinates\n * @returns {boolean} true if the objects are equal, false otherwise\n * @example\n * var pt1 = turf.point([0, 0]);\n * var pt2 = turf.point([0, 0]);\n * var pt3 = turf.point([1, 1]);\n *\n * turf.booleanEqual(pt1, pt2);\n * //= true\n * turf.booleanEqual(pt2, pt3);\n * //= false\n */\nfunction booleanEqual(\n feature1: Feature<any> | Geometry,\n feature2: Feature<any> | Geometry,\n options: {\n precision?: number;\n } = {}\n): boolean {\n let precision = options.precision;\n\n precision =\n precision === undefined || precision === null || isNaN(precision)\n ? 6\n : precision;\n\n if (typeof precision !== \"number\" || !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n\n const type1 = getGeom(feature1).type;\n const type2 = getGeom(feature2).type;\n if (type1 !== type2) return false;\n\n return geojsonEquality(cleanCoords(feature1), cleanCoords(feature2), {\n precision,\n });\n}\n\nexport { booleanEqual };\nexport default booleanEqual;\n","/* eslint-disable @typescript-eslint/require-await */\nimport type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport {InvalidColumnError, assert, assignOptional} from '../utils.js';\nimport type {Filter, SpatialFilter, Tile} from '../types.js';\n\nimport {\n type TileFeatureExtractOptions,\n applyFilters,\n geojsonFeatures,\n tileFeatures,\n} from '../filters/index.js';\nimport {\n aggregationFunctions,\n applySorting,\n groupValuesByColumn,\n groupValuesByDateColumn,\n histogram,\n scatterPlot,\n} from '../operations/index.js';\nimport type {FeatureData} from '../types-internal.js';\nimport type {FeatureCollection} from 'geojson';\nimport {WidgetSource} from './widget-source.js';\nimport {booleanEqual} from '@turf/boolean-equal';\nimport type {WidgetTilesetSourceProps} from './widget-tileset-source.js';\nimport {getApplicableFilters} from '../filters.js';\nimport {AggregationTypes} from '../constants.js';\nimport {OTHERS_CATEGORY_NAME} from './constants.js';\n\n// TODO(cleanup): Parameter defaults in source functions and widget API calls are\n// currently duplicated and possibly inconsistent. Consider consolidating and\n// operating on Required<T> objects. See:\n// https://github.com/CartoDB/carto-api-client/issues/39\n\n/**\n * Local (in-memory) implementation of tileset widget calculations. This class\n * may be instantiated by {@link WidgetTilesetSource} in a Web Worker when\n * supported, or on the main thread.\n */\nexport class WidgetTilesetSourceImpl extends WidgetSource<WidgetTilesetSourceProps> {\n private _tiles: Tile[] = [];\n private _features: FeatureData[] = [];\n private _tileFeatureExtractOptions: TileFeatureExtractOptions = {};\n private _tileFeatureExtractPreviousInputs: {spatialFilter?: SpatialFilter} =\n {};\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n this._tiles = tiles as Tile[];\n this._features.length = 0;\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n this._tileFeatureExtractOptions = options;\n this._features.length = 0;\n }\n\n protected _extractTileFeatures(spatialFilter?: SpatialFilter) {\n // When spatial filter has not changed, don't redo extraction. If tiles or\n // tile extract options change, features will have been cleared already.\n const prevInputs = this._tileFeatureExtractPreviousInputs;\n if (\n this._features.length &&\n spatialFilterEquals(prevInputs.spatialFilter, spatialFilter)\n ) {\n return;\n }\n\n this._features = tileFeatures({\n ...assignOptional({}, this.props, this._tileFeatureExtractOptions),\n tiles: this._tiles,\n spatialFilter,\n });\n\n prevInputs.spatialFilter = spatialFilter;\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n this._features = geojsonFeatures({\n geojson,\n spatialFilter,\n ...this._tileFeatureExtractOptions,\n });\n this._tileFeatureExtractPreviousInputs.spatialFilter = spatialFilter;\n }\n\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n column = '*',\n operation = AggregationTypes.Count,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (filteredFeatures.length === 0 && operation !== AggregationTypes.Count) {\n return {value: null};\n }\n\n if (operation === AggregationTypes.Custom) {\n throw new Error('Custom aggregation not supported for tilesets');\n }\n\n // Column is required except when operation is 'count'.\n if ((column && column !== '*') || operation !== AggregationTypes.Count) {\n assertColumn(this._features, column);\n }\n\n const targetOperation = aggregationFunctions[operation];\n assert(targetOperation, `Unsupported aggregation operation: ${operation}`);\n\n return {\n value: targetOperation(filteredFeatures, column, joinOperation),\n };\n }\n\n override async getHistogram({\n operation = AggregationTypes.Count,\n ticks,\n column,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n return [];\n }\n\n assertColumn(this._features, column);\n\n return histogram({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(column),\n joinOperation,\n ticks,\n operation,\n });\n }\n\n override async getCategories({\n column,\n operation = AggregationTypes.Count,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n othersThreshold,\n orderBy = 'frequency_desc',\n rawResult,\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, column, operationColumn as string);\n\n const result = groupValuesByColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n joinOperation,\n keysColumn: column,\n operation,\n othersThreshold,\n orderBy,\n });\n\n if (rawResult) {\n return result as unknown as CategoryResponse;\n }\n\n if (!othersThreshold) {\n return result?.rows || [];\n }\n\n return [\n ...(result?.rows || []),\n {name: OTHERS_CATEGORY_NAME, value: result?.metadata?.others as number},\n ];\n }\n\n override async getScatter({\n xAxisColumn,\n yAxisColumn,\n xAxisJoinOperation,\n yAxisJoinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return [];\n }\n\n assertColumn(this._features, xAxisColumn, yAxisColumn);\n\n return scatterPlot({\n data: filteredFeatures,\n xAxisColumns: normalizeColumns(xAxisColumn),\n xAxisJoinOperation,\n yAxisColumns: normalizeColumns(yAxisColumn),\n yAxisJoinOperation,\n });\n }\n\n override async getTable({\n columns,\n searchFilterColumn,\n searchFilterText,\n sortBy,\n sortDirection,\n sortByColumnType,\n offset = 0,\n limit = 10,\n filters,\n filterOwner,\n spatialFilter,\n }: TableRequestOptions): Promise<TableResponse> {\n // Filter.\n let filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: [], totalCount: 0};\n }\n\n // Search.\n // TODO(v0.6): Remove \"searchFilterText\" and \"searchFilterColumn\".\n if (searchFilterColumn && searchFilterText) {\n console.warn(\n 'WidgetTilesetSource: \"searchFilterText\" is deprecated, use \"filters\" and FilterType.STRING_SEARCH instead.'\n );\n filteredFeatures = filteredFeatures.filter(\n (row) =>\n row[searchFilterColumn] &&\n String(row[searchFilterColumn] as unknown)\n .toLowerCase()\n .includes(String(searchFilterText).toLowerCase())\n );\n }\n\n // Sort.\n let rows = applySorting(filteredFeatures, {\n sortBy,\n sortByDirection: sortDirection,\n sortByColumnType,\n });\n const totalCount = rows.length;\n\n // Offset and limit.\n rows = rows.slice(\n Math.min(offset, totalCount),\n Math.min(offset + limit, totalCount)\n );\n\n // Select columns.\n rows = rows.map((srcRow: FeatureData) => {\n const dstRow: FeatureData = {};\n for (const column of columns) {\n dstRow[column] = srcRow[column];\n }\n return dstRow;\n });\n\n return {rows, totalCount} as TableResponse;\n }\n\n override async getTimeSeries({\n column,\n stepSize,\n operation,\n operationColumn,\n joinOperation,\n filters,\n filterOwner,\n spatialFilter,\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!filteredFeatures.length) {\n return {rows: []};\n }\n\n assertColumn(this._features, column, operationColumn as string);\n assert(\n operation !== 'custom',\n 'Custom operation not supported for tilesets'\n );\n\n const rows =\n groupValuesByDateColumn({\n data: filteredFeatures,\n valuesColumns: normalizeColumns(operationColumn || column),\n keysColumn: column,\n groupType: stepSize,\n operation,\n joinOperation,\n }) || [];\n\n return {rows};\n }\n\n override async getRange({\n column,\n filters,\n filterOwner,\n spatialFilter,\n }: RangeRequestOptions): Promise<RangeResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n // TODO: Is this the only nullable response in the Widgets API? If so,\n // can we do something more consistent?\n return null;\n }\n\n assertColumn(this._features, column);\n\n return {\n min: aggregationFunctions.min(filteredFeatures, column),\n max: aggregationFunctions.max(filteredFeatures, column),\n };\n }\n\n async getAggregations({\n aggregations,\n filters,\n filterOwner,\n spatialFilter,\n }: AggregationsRequestOptions): Promise<AggregationsResponse> {\n const filteredFeatures = this._getFilteredFeatures(\n spatialFilter,\n filters,\n filterOwner\n );\n\n if (!this._features.length) {\n return {rows: []};\n }\n\n // SQL aggregations require remote execution, and are not supported for tilesets.\n assert(\n typeof aggregations !== 'string',\n 'Unsupported tileset SQL aggregation'\n );\n\n // Handle array-based aggregations\n const result: Record<string, number> = {};\n const usedAliases = new Set<string>();\n\n for (const {column, operation, alias} of aggregations) {\n // Column is required except when operation is 'count'.\n if ((column && column !== '*') || operation !== AggregationTypes.Count) {\n assertColumn(this._features, column);\n }\n\n const aliasKey = alias.toLowerCase();\n assert(!usedAliases.has(aliasKey), `Duplicate alias: ${aliasKey}`);\n usedAliases.add(aliasKey);\n\n const targetOperation = aggregationFunctions[operation];\n assert(targetOperation, `Unsupported operation: ${operation}`);\n\n result[alias] = targetOperation(filteredFeatures, column);\n }\n\n return {rows: [result]};\n }\n\n /** @experimental */\n async getExtent(): Promise<ExtentResponse> {\n return Promise.reject(new Error('not implemented'));\n }\n\n /****************************************************************************\n * INTERNAL\n */\n\n private _getFilteredFeatures(\n spatialFilter?: SpatialFilter,\n filters?: Record<string, Filter>,\n filterOwner?: string\n ): FeatureData[] {\n this._extractTileFeatures(spatialFilter);\n return applyFilters(\n this._features,\n getApplicableFilters(filterOwner, filters || this.props.filters),\n this.props.filtersLogicalOperator || 'and'\n );\n }\n}\n\nfunction assertColumn(\n features: FeatureData[],\n ...columnArgs: string[] | string[][]\n) {\n // Due to the multiple column shape, we normalise it as an array with normalizeColumns\n const columns = Array.from(new Set(columnArgs.map(normalizeColumns).flat()));\n\n const featureKeys = Object.keys(features[0]);\n\n // For backward compatibility, '' should pass column validation. For example,\n // operation='count',operationColumn='' is accepted.\n const invalidColumns = columns.filter(\n (column) => column && !featureKeys.includes(column)\n );\n\n if (invalidColumns.length) {\n throw new InvalidColumnError(\n `Missing column(s): ${invalidColumns.join(', ')}`\n );\n }\n}\n\nfunction normalizeColumns(columns: string | string[]): string[] {\n return Array.isArray(columns)\n ? columns\n : typeof columns === 'string'\n ? [columns]\n : [];\n}\n\nfunction spatialFilterEquals(a?: SpatialFilter, b?: SpatialFilter) {\n if (a === b) return true;\n if (!a || !b) return false;\n return booleanEqual(a, b);\n}\n","import type {\n AggregationsRequestOptions,\n AggregationsResponse,\n CategoryRequestOptions,\n CategoryResponse,\n ExtentResponse,\n FeaturesResponse,\n FormulaRequestOptions,\n FormulaResponse,\n HistogramRequestOptions,\n HistogramResponse,\n RangeRequestOptions,\n RangeResponse,\n ScatterRequestOptions,\n ScatterResponse,\n TableRequestOptions,\n TableResponse,\n TimeSeriesRequestOptions,\n TimeSeriesResponse,\n} from './types.js';\nimport type {SpatialFilter, Tile} from '../types.js';\nimport type {TileFeatureExtractOptions} from '../filters/index.js';\nimport type {BBox, FeatureCollection} from 'geojson';\nimport {WidgetSource, type WidgetSourceProps} from './widget-source.js';\nimport {Method} from '../workers/constants.js';\nimport type {WorkerRequest, WorkerResponse} from '../workers/types.js';\nimport type {SpatialDataType, TilesetSourceOptions} from '../sources/types.js';\nimport {TileFormat} from '../constants.js';\nimport {WidgetTilesetSourceImpl} from './widget-tileset-source-impl.js';\n\nexport type WidgetTilesetSourceProps = WidgetSourceProps &\n Omit<TilesetSourceOptions, 'filters'> & {\n tileFormat: TileFormat;\n spatialDataType: SpatialDataType;\n /**\n * Extent of spatial data, typically from TileJSON. Does not include filters.\n */\n spatialDataBounds: BBox;\n };\n\nexport type WidgetTilesetSourceResult = {widgetSource: WidgetTilesetSource};\n\n/**\n * Source for Widget API requests on a data source defined by a tileset.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTilesetSource}, {@link h3TilesetSource}, or {@link quadbinTilesetSource},\n * which can be shared with map layers. Sources contain a `widgetSource`\n * property, for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTilesetSource } from '@carto/api-client';\n *\n * const data = vectorTilesetSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_rasters.my_tileset_source'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTilesetSource<\n Props extends WidgetTilesetSourceProps = WidgetTilesetSourceProps,\n> extends WidgetSource<Props> {\n protected _localImpl: WidgetTilesetSourceImpl | null = null;\n\n protected _workerImpl: Worker | null = null;\n protected _workerEnabled: boolean;\n protected _workerNextRequestId = 1;\n\n constructor(props: Props) {\n super(props);\n\n this._workerEnabled =\n (props.widgetWorker ?? true) &&\n TSUP_FORMAT !== 'cjs' &&\n typeof Worker !== 'undefined';\n\n if (!this._workerEnabled) {\n this._localImpl = new WidgetTilesetSourceImpl(this.props);\n }\n }\n\n destroy() {\n this._localImpl?.destroy();\n this._localImpl = null;\n\n this._workerImpl?.terminate();\n this._workerImpl = null;\n\n super.destroy();\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WEB WORKER MANAGEMENT\n\n /**\n * Returns an initialized Worker, to be reused for the lifecycle of this\n * source instance.\n */\n protected _getWorker(): Worker {\n if (this._workerImpl) {\n return this._workerImpl;\n }\n\n if (this.props.widgetWorkerUrl) {\n this._workerImpl = new Worker(this.props.widgetWorkerUrl, {\n name: 'cartowidgettileset',\n });\n } else {\n // For Vite (and perhaps other bundlers) to parse WorkerOptions, it\n // must be a static, inline object – duplicated below.\n this._workerImpl = new Worker(\n new URL('@carto/api-client/worker', import.meta.url),\n {\n type: 'module',\n name: 'cartowidgettileset',\n }\n );\n }\n\n this._workerImpl.addEventListener('error', (e) => {\n console.error('widget-tileset-source worker error', e);\n });\n\n this._workerImpl.postMessage({\n method: Method.INIT,\n params: [this.props],\n } as WorkerRequest);\n\n return this._workerImpl;\n }\n\n /** Executes a given method on the worker. */\n protected _executeWorkerMethod<T>(\n method: Method,\n params: unknown[],\n signal?: AbortSignal\n ): Promise<T> {\n if (!this._workerEnabled) {\n // @ts-expect-error No type-checking dynamic method name.\n return this._localImpl[method](...params);\n }\n\n const worker = this._getWorker();\n const requestId = this._workerNextRequestId++;\n\n let resolve: ((value: T) => void) | null = null;\n let reject: ((reason: any) => void) | null = null;\n\n // If worker sends message to main process, check whether it's a response\n // to this request, and whether the request can been aborted. Then resolve\n // or reject the Promise.\n function onMessage(e: MessageEvent) {\n const response = e.data as WorkerResponse;\n if (response.requestId !== requestId) return;\n if (signal?.aborted) return; // handled by 'abort' listener\n\n if (response.ok) {\n resolve!(response.result as T);\n } else {\n reject!(new Error(response.error));\n }\n }\n\n // If request is aborted by user, immediately reject the Promise.\n function onAbort() {\n reject!(new Error(signal!.reason));\n }\n\n worker.addEventListener('message', onMessage);\n signal?.addEventListener('abort', onAbort);\n\n // Send the task to the worker, creating a Promise to resolve/reject later.\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n\n worker.postMessage({\n requestId,\n method,\n params,\n } as WorkerRequest);\n });\n\n // Whether the task completes, fails, or aborts: clean up afterward.\n void promise.finally(() => {\n worker.removeEventListener('message', onMessage);\n signal?.removeEventListener('abort', onAbort);\n });\n\n return promise;\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // DATA LOADING\n\n /**\n * Loads features as a list of tiles (typically provided by deck.gl).\n * After tiles are loaded, {@link extractTileFeatures} must be called\n * before computing statistics on the tiles.\n */\n loadTiles(tiles: unknown[]) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadTiles(tiles);\n }\n\n const worker = this._getWorker();\n\n // We cannot pass an instance of Tile2DHeader to a Web Worker, and must\n // extract properties required for widget calculations. Note that the\n // `tile: Tile = {...}` assignment is structured so TS will warn if any\n // types required by the internal 'Tile' type are missing.\n tiles = (tiles as Tile[]).map(\n ({id, index, bbox, isVisible, data}: Tile) => {\n const tile: Tile = {\n id,\n index,\n isVisible,\n data,\n bbox,\n };\n return tile;\n }\n );\n\n worker.postMessage({\n method: Method.LOAD_TILES,\n params: [tiles],\n } as WorkerRequest);\n }\n\n /** Configures options used to extract features from tiles. */\n setTileFeatureExtractOptions(options: TileFeatureExtractOptions) {\n if (!this._workerEnabled) {\n return this._localImpl?.setTileFeatureExtractOptions(options);\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.SET_TILE_FEATURE_EXTRACT_OPTIONS,\n params: [options],\n });\n }\n\n /**\n * Loads features as GeoJSON (used for testing).\n * @experimental\n * @internal Not for public use. Spatial filters in other method calls will be ignored.\n */\n loadGeoJSON({\n geojson,\n spatialFilter,\n }: {\n geojson: FeatureCollection;\n spatialFilter: SpatialFilter;\n }) {\n if (!this._workerEnabled) {\n return this._localImpl!.loadGeoJSON({geojson, spatialFilter});\n }\n\n const worker = this._getWorker();\n\n worker.postMessage({\n method: Method.LOAD_GEOJSON,\n params: [{geojson, spatialFilter}],\n } as WorkerRequest);\n }\n\n /////////////////////////////////////////////////////////////////////////////\n // WIDGETS API\n\n // eslint-disable-next-line @typescript-eslint/require-await\n override async getFeatures(): Promise<FeaturesResponse> {\n throw new Error('getFeatures not supported for tilesets');\n }\n\n async getFormula({\n signal,\n ...options\n }: FormulaRequestOptions): Promise<FormulaResponse> {\n return this._executeWorkerMethod(Method.GET_FORMULA, [options], signal);\n }\n\n override async getHistogram({\n signal,\n ...options\n }: HistogramRequestOptions): Promise<HistogramResponse> {\n return this._executeWorkerMethod(Method.GET_HISTOGRAM, [options], signal);\n }\n\n override async getCategories({\n signal,\n ...options\n }: CategoryRequestOptions): Promise<CategoryResponse> {\n return this._executeWorkerMethod(Method.GET_CATEGORIES, [options], signal);\n }\n\n override async getScatter({\n signal,\n ...options\n }: ScatterRequestOptions): Promise<ScatterResponse> {\n return this._executeWorkerMethod(Method.GET_SCATTER, [options], signal);\n }\n\n override async getTable({\n signal,\n ...options\n }: TableRequestOptions): Promise<TableResponse> {\n return this._executeWorkerMethod(Method.GET_TABLE, [options], signal);\n }\n\n override async getTimeSeries({\n signal,\n ...options\n }: TimeSeriesRequestOptions): Promise<TimeSeriesResponse> {\n return this._executeWorkerMethod(Method.GET_TIME_SERIES, [options], signal);\n }\n\n override async getRange({\n signal,\n ...options\n }: RangeRequestOptions): Promise<RangeResponse> {\n return this._executeWorkerMethod(Method.GET_RANGE, [options], signal);\n }\n\n async getAggregations({\n signal,\n ...options\n }: AggregationsRequestOptions): Promise<AggregationsResponse> {\n return this._executeWorkerMethod(\n Method.GET_AGGREGATIONS,\n [options],\n signal\n );\n }\n\n /** @experimental */\n async getExtent(): Promise<ExtentResponse> {\n return Promise.resolve({\n bbox: this.props.spatialDataBounds,\n });\n }\n}\n","import type {RasterMetadata} from '../sources/index.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceProps,\n} from './widget-tileset-source.js';\n\nexport type WidgetRasterSourceProps = WidgetTilesetSourceProps & {\n rasterMetadata: RasterMetadata;\n spatialDataType: 'quadbin';\n};\n\nexport type WidgetRasterSourceResult = {widgetSource: WidgetRasterSource};\n\nexport class WidgetRasterSource extends WidgetTilesetSource<WidgetRasterSourceProps> {}\n","import type {\n H3TableSourceOptions,\n QuadbinTableSourceOptions,\n VectorTableSourceOptions,\n} from '../sources/index.js';\nimport {\n WidgetRemoteSource,\n type WidgetRemoteSourceProps,\n} from './widget-remote-source.js';\nimport type {ModelSource} from '../models/model.js';\nimport type {Filters} from '../types.js';\n\ntype LayerTableSourceOptions =\n | Omit<VectorTableSourceOptions, 'filters'>\n | Omit<H3TableSourceOptions, 'filters'>\n | Omit<QuadbinTableSourceOptions, 'filters'>;\n\nexport type WidgetTableSourceResult = {widgetSource: WidgetTableSource};\n\n/**\n * Source for Widget API requests on a data source defined as a table.\n *\n * Generally not intended to be constructed directly. Instead, call\n * {@link vectorTableSource}, {@link h3TableSource}, or {@link quadbinTableSource},\n * which can be shared with map layers. Sources contain a `widgetSource` property,\n * for use by widget implementations.\n *\n * Example:\n *\n * ```javascript\n * import { vectorTableSource } from '@carto/api-client';\n *\n * const data = vectorTableSource({\n * accessToken: '••••',\n * connectionName: 'carto_dw',\n * tableName: 'carto-demo-data.demo_tables.retail_stores'\n * });\n *\n * const { widgetSource } = await data;\n * ```\n */\nexport class WidgetTableSource extends WidgetRemoteSource<\n LayerTableSourceOptions & WidgetRemoteSourceProps\n> {\n protected override getModelSource(\n filters: Filters | undefined,\n filterOwner?: string\n ): ModelSource {\n return {\n ...super._getModelSource(filters, filterOwner),\n type: 'table',\n data: this.props.tableName,\n };\n }\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type H3QuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type H3QuerySourceResponse = TilejsonResult & WidgetQuerySourceResult;\n\nexport const h3QuerySource = async function (\n options: H3QuerySourceOptions\n): Promise<H3QuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n sqlQuery,\n spatialDataColumn = 'h3',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n spatialDataColumn,\n spatialDataType,\n q: sqlQuery,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_H3} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type H3TableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type H3TableSourceResponse = TilejsonResult & WidgetTableSourceResult;\n\nexport const h3TableSource = async function (\n options: H3TableSourceOptions\n): Promise<H3TableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3,\n spatialDataColumn = 'h3',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'h3';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","import {TileFormat} from '../constants.js';\nimport type {Tilejson} from '../sources/types.js';\n\nexport function getTileFormat(tilejson: Tilejson): TileFormat {\n const tileParams = new URL(tilejson.tiles[0]).searchParams;\n return tileParams.get('formatTiles') === 'mvt'\n ? TileFormat.MVT\n : TileFormat.BINARY;\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type H3TilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type H3TilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const h3TilesetSource = async function (\n options: H3TilesetSourceOptions\n): Promise<H3TilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'h3'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'h3',\n spatialDataBounds: result.bounds,\n }),\n })\n ) as Promise<H3TilesetSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n QuerySourceOptions,\n SourceOptions,\n SpatialDataType,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const quadbinQuerySource = async function (\n options: QuadbinQuerySourceOptions\n): Promise<QuadbinQuerySourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n sqlQuery,\n spatialDataColumn = 'quadbin',\n queryParameters,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n q: sqlQuery,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN} from '../constants-internal.js';\nimport {getWidgetSpatialDataType} from '../utils.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n AggregationOptions,\n FilterOptions,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type QuadbinTableSourceOptions = SourceOptions &\n TableSourceOptions &\n AggregationOptions &\n FilterOptions;\n\ntype UrlParameters = {\n aggregationExp: string;\n aggregationResLevel?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type QuadbinTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const quadbinTableSource = async function (\n options: QuadbinTableSourceOptions\n): Promise<QuadbinTableSourceResponse> {\n const {\n aggregationExp,\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n spatialDataColumn = 'quadbin',\n tableName,\n filters,\n } = options;\n\n const spatialDataType = 'quadbin';\n\n const urlParameters: UrlParameters = {\n aggregationExp,\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n };\n\n if (aggregationResLevel) {\n urlParameters.aggregationResLevel = String(aggregationResLevel);\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType: getWidgetSpatialDataType(\n spatialDataType,\n spatialDataColumn,\n result.schema\n ),\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type QuadbinTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type QuadbinTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const quadbinTilesetSource = async function (\n options: QuadbinTilesetSourceOptions\n): Promise<QuadbinTilesetSourceResponse> {\n const {tableName, spatialDataColumn = 'quadbin'} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'quadbin',\n spatialDataBounds: result.bounds,\n }),\n })\n ) as Promise<QuadbinTilesetSourceResponse>;\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetRasterSource,\n type WidgetRasterSourceResult,\n} from '../widget-sources/index.js';\n\nimport type {\n FilterOptions,\n SourceOptions,\n TilejsonResult,\n TilesetSourceOptions,\n} from './types.js';\n\nexport type RasterSourceOptions = SourceOptions &\n TilesetSourceOptions &\n FilterOptions;\ntype UrlParameters = {\n name: string;\n filters?: Record<string, unknown>;\n};\n\nexport type RasterSourceResponse = TilejsonResult & WidgetRasterSourceResult;\n\nexport const rasterSource = async function (\n options: RasterSourceOptions\n): Promise<RasterSourceResponse> {\n const {tableName, filters} = options;\n const urlParameters: UrlParameters = {name: tableName};\n if (filters) {\n urlParameters.filters = filters;\n }\n\n return baseSource<UrlParameters>('raster', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetRasterSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn: 'quadbin',\n spatialDataType: 'quadbin',\n spatialDataBounds: result.bounds,\n rasterMetadata: result.raster_metadata!,\n }),\n })\n ) as Promise<RasterSourceResponse>;\n};\n","import {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetQuerySource,\n type RangeResponse,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n SourceOptions,\n QuerySourceOptions,\n SpatialDataType,\n TilejsonResult,\n ColumnsOption,\n} from './types.js';\n\nexport type TrajectoryQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n ColumnsOption & {\n /** Column name containing the trajectory identifier */\n trajectoryIdColumn: string;\n /** Column name containing the timestamp */\n timestampColumn: string;\n };\n\ntype UrlParameters = {\n columns?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n aggregationExp?: string;\n trajectoryIdColumn: string;\n timestampColumn: string;\n};\n\nexport type TrajectoryQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult & {\n timestampRange: RangeResponse;\n };\n\nexport const trajectoryQuerySource = async function (\n options: TrajectoryQuerySourceOptions\n): Promise<TrajectoryQuerySourceResponse> {\n const {\n columns,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n sqlQuery,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n queryParameters,\n aggregationExp,\n trajectoryIdColumn,\n timestampColumn,\n } = options;\n\n const spatialDataType = 'trajectory';\n\n const urlParameters: UrlParameters = {\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n q: sqlQuery,\n trajectoryIdColumn,\n timestampColumn,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n const result = await baseSource<UrlParameters>(\n 'query',\n options,\n urlParameters\n );\n\n const widgetSource = new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n });\n\n const timestampRange = await widgetSource.getRange({column: timestampColumn});\n\n return {\n ...result,\n widgetSource,\n timestampRange,\n };\n};\n","import {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetTableSource,\n type RangeResponse,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n ColumnsOption,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type TrajectoryTableSourceOptions = SourceOptions &\n TableSourceOptions &\n ColumnsOption & {\n /** Column name containing the trajectory identifier */\n trajectoryIdColumn: string;\n /** Column name containing the timestamp */\n timestampColumn: string;\n };\n\ntype UrlParameters = {\n columns?: string;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n name: string;\n aggregationExp?: string;\n trajectoryIdColumn: string;\n timestampColumn: string;\n};\n\nexport type TrajectoryTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult & {\n timestampRange: RangeResponse;\n };\n\nexport const trajectoryTableSource = async function (\n options: TrajectoryTableSourceOptions\n): Promise<TrajectoryTableSourceResponse> {\n const {\n columns,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n tableName,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n aggregationExp,\n trajectoryIdColumn,\n timestampColumn,\n } = options;\n\n const spatialDataType = 'trajectory';\n\n const urlParameters: UrlParameters = {\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n trajectoryIdColumn,\n timestampColumn,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n const result = await baseSource<UrlParameters>(\n 'table',\n options,\n urlParameters\n );\n\n const widgetSource = new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n });\n\n const timestampRange = await widgetSource.getRange({column: timestampColumn});\n\n return {\n ...result,\n widgetSource,\n timestampRange,\n };\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetQuerySource,\n type WidgetQuerySourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n SourceOptions,\n QuerySourceOptions,\n SpatialDataType,\n TilejsonResult,\n ColumnsOption,\n} from './types.js';\n\nexport type VectorQuerySourceOptions = SourceOptions &\n QuerySourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n aggregationExp?: string;\n};\n\nexport type VectorQuerySourceResponse = TilejsonResult &\n WidgetQuerySourceResult;\n\nexport const vectorQuerySource = async function (\n options: VectorQuerySourceOptions\n): Promise<VectorQuerySourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n sqlQuery,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n queryParameters,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n q: sqlQuery,\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('query', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetQuerySource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n DEFAULT_GEO_COLUMN,\n DEFAULT_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n WidgetTableSource,\n type WidgetTableSourceResult,\n} from '../widget-sources/index.js';\nimport {baseSource} from './base-source.js';\nimport type {\n FilterOptions,\n ColumnsOption,\n SourceOptions,\n SpatialDataType,\n TableSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTableSourceOptions = SourceOptions &\n TableSourceOptions &\n FilterOptions &\n ColumnsOption;\n\ntype UrlParameters = {\n columns?: string;\n filters?: Record<string, unknown>;\n spatialDataType: SpatialDataType;\n spatialDataColumn?: string;\n tileResolution?: string;\n name: string;\n aggregationExp?: string;\n};\n\nexport type VectorTableSourceResponse = TilejsonResult &\n WidgetTableSourceResult;\n\nexport const vectorTableSource = async function (\n options: VectorTableSourceOptions\n): Promise<VectorTableSourceResponse> {\n const {\n columns,\n filters,\n spatialDataColumn = DEFAULT_GEO_COLUMN,\n tableName,\n tileResolution = DEFAULT_TILE_RESOLUTION,\n aggregationExp,\n } = options;\n\n const spatialDataType = 'geo';\n\n const urlParameters: UrlParameters = {\n name: tableName,\n spatialDataColumn,\n spatialDataType,\n tileResolution: tileResolution.toString(),\n };\n\n if (columns) {\n urlParameters.columns = columns.join(',');\n }\n if (filters) {\n urlParameters.filters = filters;\n }\n if (aggregationExp) {\n urlParameters.aggregationExp = aggregationExp;\n }\n\n return baseSource<UrlParameters>('table', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTableSource({\n ...options,\n // NOTE: Parameters with default values above must be explicitly passed here.\n spatialDataColumn,\n spatialDataType,\n tileResolution,\n }),\n })\n );\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {baseSource} from './base-source.js';\nimport {DEFAULT_GEO_COLUMN} from '../constants-internal.js';\nimport {getTileFormat} from '../utils/getTileFormat.js';\nimport {\n WidgetTilesetSource,\n type WidgetTilesetSourceResult,\n} from '../widget-sources/index.js';\nimport type {\n SourceOptions,\n TilesetSourceOptions,\n TilejsonResult,\n} from './types.js';\n\nexport type VectorTilesetSourceOptions = SourceOptions & TilesetSourceOptions;\ntype UrlParameters = {name: string};\n\nexport type VectorTilesetSourceResponse = TilejsonResult &\n WidgetTilesetSourceResult;\n\nexport const vectorTilesetSource = async function (\n options: VectorTilesetSourceOptions\n): Promise<VectorTilesetSourceResponse> {\n const {tableName, spatialDataColumn = DEFAULT_GEO_COLUMN} = options;\n const urlParameters: UrlParameters = {name: tableName};\n\n return baseSource<UrlParameters>('tileset', options, urlParameters).then(\n (result) => ({\n ...result,\n widgetSource: new WidgetTilesetSource({\n ...options,\n tileFormat: getTileFormat(result),\n spatialDataColumn,\n spatialDataType: 'geo',\n spatialDataBounds: result.bounds,\n }),\n })\n ) as Promise<VectorTilesetSourceResponse>;\n};\n","export enum RasterBandColorinterp {\n Gray = 'gray',\n Red = 'red',\n Green = 'green',\n Blue = 'blue',\n Alpha = 'alpha',\n Palette = 'palette',\n}\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Import all source functions\nimport {boundaryQuerySource} from './boundary-query-source.js';\nimport {boundaryTableSource} from './boundary-table-source.js';\nimport {h3QuerySource} from './h3-query-source.js';\nimport {h3TableSource} from './h3-table-source.js';\nimport {h3TilesetSource} from './h3-tileset-source.js';\nimport {quadbinQuerySource} from './quadbin-query-source.js';\nimport {quadbinTableSource} from './quadbin-table-source.js';\nimport {quadbinTilesetSource} from './quadbin-tileset-source.js';\nimport {rasterSource} from './raster-source.js';\nimport {trajectoryQuerySource} from './trajectory-query-source.js';\nimport {trajectoryTableSource} from './trajectory-table-source.js';\nimport {vectorQuerySource} from './vector-query-source.js';\nimport {vectorTableSource} from './vector-table-source.js';\nimport {vectorTilesetSource} from './vector-tileset-source.js';\n\nexport {SOURCE_DEFAULTS} from './base-source.js';\nexport {RasterBandColorinterp} from './constants.js';\nexport type {\n SourceOptions,\n SourceRequiredOptions,\n SourceOptionalOptions,\n TilejsonResult,\n QueryResult,\n FilterOptions,\n QuerySourceOptions,\n TableSourceOptions,\n TilesetSourceOptions,\n ColumnsOption,\n SpatialDataType,\n SpatialFilterPolyfillMode,\n TileResolution,\n Tilejson,\n Tilestats,\n Layer,\n Attribute,\n VectorLayer,\n RasterMetadata,\n RasterMetadataBand,\n RasterMetadataBandStats,\n RasterBandType,\n} from './types.js';\n\nexport {boundaryQuerySource};\nexport type {\n BoundaryQuerySourceOptions,\n BoundaryQuerySourceResponse,\n} from './boundary-query-source.js';\n\nexport {boundaryTableSource};\nexport type {\n BoundaryTableSourceOptions,\n BoundaryTableSourceResponse,\n} from './boundary-table-source.js';\n\nexport {h3QuerySource};\nexport type {\n H3QuerySourceOptions,\n H3QuerySourceResponse,\n} from './h3-query-source.js';\n\nexport {h3TableSource};\nexport type {\n H3TableSourceOptions,\n H3TableSourceResponse,\n} from './h3-table-source.js';\n\nexport {h3TilesetSource};\nexport type {\n H3TilesetSourceOptions,\n H3TilesetSourceResponse,\n} from './h3-tileset-source.js';\n\nexport {rasterSource};\nexport type {RasterSourceOptions} from './raster-source.js';\n\nexport {quadbinQuerySource};\nexport type {\n QuadbinQuerySourceOptions,\n QuadbinQuerySourceResponse,\n} from './quadbin-query-source.js';\n\nexport {quadbinTableSource};\nexport type {\n QuadbinTableSourceOptions,\n QuadbinTableSourceResponse,\n} from './quadbin-table-source.js';\n\nexport {quadbinTilesetSource};\nexport type {\n QuadbinTilesetSourceOptions,\n QuadbinTilesetSourceResponse,\n} from './quadbin-tileset-source.js';\n\nexport {vectorQuerySource};\nexport type {\n VectorQuerySourceOptions,\n VectorQuerySourceResponse,\n} from './vector-query-source.js';\n\nexport {vectorTableSource};\nexport type {\n VectorTableSourceOptions,\n VectorTableSourceResponse,\n} from './vector-table-source.js';\n\nexport {vectorTilesetSource};\nexport type {\n VectorTilesetSourceOptions,\n VectorTilesetSourceResponse,\n} from './vector-tileset-source.js';\n\nexport {trajectoryQuerySource};\nexport type {\n TrajectoryQuerySourceOptions,\n TrajectoryQuerySourceResponse,\n} from './trajectory-query-source.js';\n\nexport {trajectoryTableSource};\nexport type {\n TrajectoryTableSourceOptions,\n TrajectoryTableSourceResponse,\n} from './trajectory-table-source.js';\n\nexport const CARTO_SOURCES = {\n boundaryQuerySource,\n boundaryTableSource,\n h3QuerySource,\n h3TableSource,\n h3TilesetSource,\n quadbinQuerySource,\n quadbinTableSource,\n quadbinTilesetSource,\n rasterSource,\n trajectoryQuerySource,\n trajectoryTableSource,\n vectorQuerySource,\n vectorTableSource,\n vectorTilesetSource,\n};\n","// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {SOURCE_DEFAULTS} from '../sources/index.js';\nimport type {\n SourceOptions,\n QuerySourceOptions,\n QueryResult,\n} from '../sources/types.js';\nimport {buildQueryUrl} from './endpoints.js';\nimport {requestWithParameters} from './request-with-parameters.js';\nimport type {APIErrorContext} from './carto-api-error.js';\nimport {getClient} from '../client.js';\n\nexport type QueryOptions = SourceOptions &\n QuerySourceOptions & {\n /**\n * @internal\n * @experimental\n * Used to append additional parameters to the SQL API request for features specific to providers or integrations.\n */\n internalParameters?: Record<string, string | boolean | number>;\n /** Used to abort the request. */\n signal?: AbortSignal;\n };\ntype UrlParameters = {\n q: string;\n queryParameters?: Record<string, unknown> | unknown[];\n};\n\nexport const query = async function (\n options: QueryOptions\n): Promise<QueryResult> {\n const {\n apiBaseUrl = SOURCE_DEFAULTS.apiBaseUrl,\n maxLengthURL = SOURCE_DEFAULTS.maxLengthURL,\n clientId = getClient(),\n localCache,\n connectionName,\n sqlQuery,\n queryParameters,\n internalParameters,\n } = options;\n const urlParameters: UrlParameters = {q: sqlQuery};\n\n if (queryParameters) {\n urlParameters.queryParameters = queryParameters;\n }\n\n const baseUrl = buildQueryUrl({apiBaseUrl, connectionName});\n const headers = {\n Authorization: `Bearer ${options.accessToken}`,\n ...options.headers,\n };\n const parameters = {\n client: clientId,\n ...options.tags,\n ...internalParameters,\n ...urlParameters,\n };\n\n const errorContext: APIErrorContext = {\n requestType: 'SQL',\n connection: options.connectionName,\n type: 'query',\n source: JSON.stringify(parameters, undefined, 2),\n };\n return await requestWithParameters<QueryResult>({\n baseUrl,\n parameters,\n headers,\n errorContext,\n maxLengthURL,\n localCache,\n signal: options.signal,\n });\n};\n","import {CartoAPIError, type APIErrorContext} from '../api/index.js';\nimport type {GoogleBasemapProps} from './types.js';\n\nconst cartoStyleUrlTemplate =\n 'https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json';\n\nexport const CARTO_MAP_STYLES = ['positron', 'dark-matter', 'voyager'];\n\nexport const GOOGLE_BASEMAPS: Record<string, GoogleBasemapProps> = {\n roadmap: {\n mapTypeId: 'roadmap',\n mapId: '3754c817b510f791',\n },\n 'google-positron': {\n mapTypeId: 'roadmap',\n mapId: 'ea84ae4203ef21cd',\n },\n 'google-dark-matter': {\n mapTypeId: 'roadmap',\n mapId: '2fccc3b36c22a0e2',\n },\n 'google-voyager': {\n mapTypeId: 'roadmap',\n mapId: '885caf1e15bb9ef2',\n },\n satellite: {\n mapTypeId: 'satellite',\n },\n hybrid: {\n mapTypeId: 'hybrid',\n },\n terrain: {\n mapTypeId: 'terrain',\n },\n};\n\ntype StyleLayerGroupSlug =\n | 'label'\n | 'road'\n | 'border'\n | 'building'\n | 'water'\n | 'land';\ntype StyleLayerGroup = {\n slug: StyleLayerGroupSlug;\n filter: (layer: any) => boolean;\n defaultVisibility: boolean;\n};\n\nexport const STYLE_LAYER_GROUPS: StyleLayerGroup[] = [\n {\n slug: 'label',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(\n /(?=(label|_label|place-|place_|poi-|poi_|watername_|roadname_|housenumber))/\n )\n ),\n defaultVisibility: true,\n },\n {\n slug: 'road',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(road|railway|tunnel|street|bridge))(?!.*label)/)),\n defaultVisibility: true,\n },\n {\n slug: 'border',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/border|boundaries|boundary_/)),\n defaultVisibility: false,\n },\n {\n slug: 'building',\n filter: ({id}: {id: string}) => Boolean(id.match(/building/)),\n defaultVisibility: true,\n },\n {\n slug: 'water',\n filter: ({id}: {id: string}) =>\n Boolean(id.match(/(?=(water|stream|ferry))/)),\n defaultVisibility: true,\n },\n {\n slug: 'land',\n filter: ({id}: {id: string}) =>\n Boolean(\n id.match(/(?=(parks|landcover|industrial|sand|hillshade|park_))/)\n ),\n defaultVisibility: true,\n },\n];\n\nexport function applyLayerGroupFilters(\n style: any, // this Maplibre/Mapbox style, we don't want to add a dependency on Maplibre\n visibleLayerGroups: Record<StyleLayerGroupSlug, boolean>\n) {\n if (!Array.isArray(style?.layers)) {\n return style;\n }\n\n const removedLayerFilters = STYLE_LAYER_GROUPS.filter(\n (lg) => !visibleLayerGroups[lg.slug]\n ).map((lg) => lg.filter);\n\n const visibleLayers = style.layers.filter((layer: any) =>\n removedLayerFilters.every((match) => !match(layer))\n );\n\n return {\n ...style,\n layers: visibleLayers,\n };\n}\n\nexport function someLayerGroupsDisabled(\n visibleLayerGroups?: Record<StyleLayerGroupSlug, boolean>\n) {\n return (\n visibleLayerGroups &&\n Object.values(visibleLayerGroups).every(Boolean) === false\n );\n}\n\nexport function getStyleUrl(styleType: string) {\n return cartoStyleUrlTemplate.replace('{basemap}', styleType);\n}\n\nexport async function fetchStyle({\n styleUrl,\n errorContext,\n}: {\n styleUrl: string;\n errorContext?: APIErrorContext;\n}) {\n /* global fetch */\n let response: Response | undefined;\n return await fetch(styleUrl, {mode: 'cors'})\n .then((res) => {\n response = res;\n return res.json();\n })\n .catch((error) => {\n throw new CartoAPIError(\n error,\n {...errorContext, requestType: 'Basemap style'},\n response\n );\n });\n}\n\nexport default {\n VOYAGER: getStyleUrl('voyager'),\n POSITRON: getStyleUrl('positron'),\n DARK_MATTER: getStyleUrl('dark-matter'),\n VOYAGER_NOLABELS: getStyleUrl('voyager-nolabels'),\n POSITRON_NOLABELS: getStyleUrl('positron-nolabels'),\n DARK_MATTER_NOLABELS: getStyleUrl('dark-matter-nolabels'),\n} as const;\n","import jsep from 'jsep';\n\n/**\n * Create vector expresion evaluator.\n *\n * Used to calculate vector expressions, such as `(band_1 * 3) + band_2/2`,\n * where `band_1` and `band_2` are arrays or typed arrays.\n *\n * Note that all vector operations are element-wise, in paricular `band_1 * band_2`\n * is not \"mathematical\" dot or cross product, but just element-wise multiplication.\n *\n * Based on:\n * - Copyright (c) 2013 Stephen Oney, http://jsep.from.so/, MIT License\n * - Copyright (c) 2023 Don McCurdy, https://github.com/donmccurdy/expression-eval, MIT License\n */\nexport function createVecExprEvaluator(\n expression: string | jsep.Expression\n): VecExprEvaluator | null {\n try {\n const parsed = compile(expression);\n const evalFun = (context: Record<string, VecExprResult>) =>\n evaluate(parsed, context);\n evalFun.symbols = getSymbols(parsed);\n return evalFun as VecExprEvaluator;\n } catch {\n return null;\n }\n}\n\nexport function evaluateVecExpr(\n expression: string | jsep.Expression,\n context: Record<string, VecExprResult>\n) {\n try {\n return createVecExprEvaluator(expression)?.(context);\n } catch {\n return null;\n }\n}\n\nexport enum ErrorCode {\n InvalidSyntax,\n UnknownIdentifier,\n}\n\nexport type ValidationResult = {\n valid: boolean;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport function validateVecExprSyntax(\n expression: string | jsep.Expression,\n context: Record<string, unknown>\n): ValidationResult {\n let parsed: jsep.Expression;\n try {\n parsed = compile(expression);\n } catch (e: any) {\n return {\n valid: false,\n errorCode: ErrorCode.InvalidSyntax,\n errorMessage: e && 'message' in e ? String(e.message) : String(e),\n };\n }\n return validate(parsed, context);\n}\n\nexport type VecExprVecLike =\n | number[]\n | Float32Array\n | Float64Array\n | Uint8Array\n | Int8Array\n | Int32Array\n | Uint32Array\n | Uint16Array\n | Int16Array;\n\nexport type VecExprResult = number | VecExprVecLike;\n\nexport type VecExprEvaluator = {\n (context: object): VecExprResult;\n\n symbols?: string[];\n};\n\nfunction createResultArray(\n typeTemplate: VecExprVecLike,\n length: number = typeTemplate.length\n): number[] {\n return new Array(length);\n}\n\nfunction isVecLike(a: unknown): a is number[] {\n return Array.isArray(a) || ArrayBuffer.isView(a);\n}\n\nconst createBinopVec =\n (scalarBinOp: (a: number, b: number) => number) =>\n (left: number[], right: number[]) => {\n const length = Math.min(left.length, right.length);\n const r = createResultArray(left, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarBinOp(left[i], right[i]);\n }\n return r;\n };\n\nconst createBinopVecNum =\n (scalarBinOp: (a: number, b: number) => number) =>\n (left: number[], right: number) => {\n const length = left.length;\n const r = createResultArray(left, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarBinOp(left[i], right);\n }\n return r;\n };\n\n// number vec op\nconst createBinopNumVec =\n (scalarBinOp: (a: number, b: number) => number) =>\n (left: number, right: number[]) => {\n const length = right.length;\n const r = createResultArray(right, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarBinOp(left, right[i]);\n }\n return r;\n };\n\nconst createUnopVec = (scalarUnop: (a: number) => number) => (a: number[]) => {\n const length = a.length;\n const r = createResultArray(a, length);\n for (let i = 0; i < length; i++) {\n r[i] = scalarUnop(a[i]);\n }\n return r;\n};\n\nfunction mapDictValues<V, NewV>(dict: Record<string, V>, fun: (v: V) => NewV) {\n return Object.keys(dict).reduce(\n (acc, key) => {\n acc[key] = fun(dict[key]);\n return acc;\n },\n {} as Record<string, NewV>\n );\n}\n\nconst binopsNum: Record<string, (a: number, b: number) => number> = {\n '||': (a: number, b: number) => a || b,\n '&&': (a: number, b: number) => a && b,\n '|': (a: number, b: number) => a | b,\n '^': (a: number, b: number) => a ^ b,\n '&': (a: number, b: number) => a & b,\n '==': (a: number, b: number) => Number(a == b),\n '!=': (a: number, b: number) => Number(a != b),\n '===': (a: number, b: number) => Number(a === b),\n '!==': (a: number, b: number) => Number(a !== b),\n '<': (a: number, b: number) => Number(a < b),\n '>': (a: number, b: number) => Number(a > b),\n '<=': (a: number, b: number) => Number(a <= b),\n '>=': (a: number, b: number) => Number(a >= b),\n '<<': (a: number, b: number) => a << b,\n '>>': (a: number, b: number) => a >> b,\n '>>>': (a: number, b: number) => a >>> b,\n '+': (a: number, b: number) => a + b,\n '-': (a: number, b: number) => a - b,\n '*': (a: number, b: number) => a * b,\n '/': (a: number, b: number) => a / b,\n '%': (a: number, b: number) => a % b,\n};\n\nconst unopsNum: Record<string, (a: number) => number> = {\n '-': (a: number) => -a,\n '+': (a: number) => +a,\n '~': (a: number) => ~a,\n '!': (a: number) => Number(!a),\n};\n\nconst binopsVector = mapDictValues(binopsNum, createBinopVec) as Record<\n string,\n Binop\n>;\nconst binopsNumVec = mapDictValues(binopsNum, createBinopNumVec) as Record<\n string,\n Binop\n>;\nconst binopsVecNum = mapDictValues(binopsNum, createBinopVecNum) as Record<\n string,\n Binop\n>;\n\nconst unopsVector = mapDictValues(unopsNum, createUnopVec) as Record<\n string,\n UnOp\n>;\n\ntype UnOp = (a: VecExprResult) => VecExprResult;\ntype Binop = (a: VecExprResult, b: VecExprResult) => VecExprResult;\n\nfunction getBinop(\n operator: string,\n left: VecExprResult,\n right: VecExprResult\n): Binop {\n const isLeftVec = isVecLike(left);\n const isRightVec = isVecLike(right);\n if (isLeftVec && isRightVec) {\n return binopsVector[operator];\n } else if (isLeftVec) {\n return binopsVecNum[operator];\n } else if (isRightVec) {\n return binopsNumVec[operator];\n } else {\n return binopsNum[operator] as Binop;\n }\n}\n\ntype AnyExpression =\n | jsep.ArrayExpression\n | jsep.BinaryExpression\n | jsep.MemberExpression\n | jsep.CallExpression\n | jsep.ConditionalExpression\n | jsep.Identifier\n | jsep.Literal\n | jsep.ThisExpression\n | jsep.UnaryExpression;\n\nexport function evaluate(\n _node: jsep.Expression,\n context: Record<string, VecExprResult>\n): VecExprResult {\n const node = _node as AnyExpression;\n\n switch (node.type) {\n case 'BinaryExpression': {\n const left = evaluate(node.left, context);\n const right = evaluate(node.right, context);\n const binopFun = getBinop(node.operator, left, right);\n\n return binopFun(left, right);\n }\n\n case 'ConditionalExpression': {\n const val = evaluate(node.test, context);\n if (isVecLike(val)) {\n const length = val.length;\n const consequentVal = evaluate(node.consequent, context);\n const alternateVal = evaluate(node.alternate, context);\n const r = createResultArray(val);\n for (let i = 0; i < length; i++) {\n const entryVal = val[i] ? consequentVal : alternateVal;\n r[i] = isVecLike(entryVal)\n ? (entryVal[i] ?? NaN)\n : (entryVal as number);\n }\n return r;\n } else {\n return val\n ? evaluate(node.consequent, context)\n : evaluate(node.alternate, context);\n }\n }\n\n case 'Identifier':\n return context[node.name];\n\n case 'Literal':\n return node.value as number;\n\n case 'UnaryExpression': {\n const val = evaluate(node.argument, context);\n const unopFun = isVecLike(val)\n ? unopsVector[node.operator]\n : (unopsNum[node.operator] as UnOp);\n return unopFun(val);\n }\n\n default:\n return undefined as unknown as VecExprResult;\n }\n}\n\nconst validResult = {valid: true};\n\nfunction visit(_node: jsep.Expression, visitor: (node: AnyExpression) => void) {\n const node = _node as AnyExpression;\n\n visitor(node);\n switch (node.type) {\n case 'BinaryExpression': {\n visit(node.left, visitor);\n visit(node.right, visitor);\n break;\n }\n\n case 'ConditionalExpression': {\n visit(node.test, visitor);\n visit(node.consequent, visitor);\n visit(node.alternate, visitor);\n break;\n }\n\n case 'UnaryExpression': {\n visit(node.argument, visitor);\n break;\n }\n }\n}\n\nconst supportedExpressionTypes = [\n 'BinaryExpression',\n 'UnaryExpression',\n 'ConditionalExpression',\n 'LogicalExpression',\n 'Identifier',\n 'Literal',\n];\n\nfunction validate(_node: jsep.Expression, context: object): ValidationResult {\n const node = _node as AnyExpression;\n\n const errors: ValidationResult[] = [];\n\n visit(node, (node) => {\n if (!supportedExpressionTypes.includes(node.type)) {\n errors.push({\n valid: false,\n errorCode: ErrorCode.InvalidSyntax,\n errorMessage: `Not allowed`,\n });\n return;\n }\n if (node.type === 'Identifier') {\n if (!Object.prototype.hasOwnProperty.call(context, node.name)) {\n return errors.push({\n valid: false,\n errorCode: ErrorCode.UnknownIdentifier,\n errorMessage: `\"${node.name}\" not found`,\n });\n }\n }\n if (node.type === 'Literal') {\n // we actually support only numbers\n if (typeof node.value !== 'number') {\n return errors.push({\n valid: false,\n errorCode: ErrorCode.InvalidSyntax,\n errorMessage: `Only number literals are supported`,\n });\n }\n }\n });\n return errors.length ? errors[0] : validResult;\n}\n\nfunction getSymbols(node: jsep.Expression): string[] {\n const symbols = new Set<string>();\n\n visit(node, (node) => {\n if (node.type === 'Identifier') {\n symbols.add(node.name);\n }\n });\n return Array.from(symbols);\n}\n\nexport function compile(expression: string | jsep.Expression) {\n return jsep(expression);\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","export default function identity(x) {\n return x;\n}\n","import {InternMap} from \"internmap\";\nimport identity from \"./identity.js\";\n\nexport default function group(values, ...keys) {\n return nest(values, identity, identity, keys);\n}\n\nexport function groups(values, ...keys) {\n return nest(values, Array.from, identity, keys);\n}\n\nfunction flatten(groups, keys) {\n for (let i = 1, n = keys.length; i < n; ++i) {\n groups = groups.flatMap(g => g.pop().map(([key, value]) => [...g, key, value]));\n }\n return groups;\n}\n\nexport function flatGroup(values, ...keys) {\n return flatten(groups(values, ...keys), keys);\n}\n\nexport function flatRollup(values, reduce, ...keys) {\n return flatten(rollups(values, reduce, ...keys), keys);\n}\n\nexport function rollup(values, reduce, ...keys) {\n return nest(values, identity, reduce, keys);\n}\n\nexport function rollups(values, reduce, ...keys) {\n return nest(values, Array.from, reduce, keys);\n}\n\nexport function index(values, ...keys) {\n return nest(values, identity, unique, keys);\n}\n\nexport function indexes(values, ...keys) {\n return nest(values, Array.from, unique, keys);\n}\n\nfunction unique(values) {\n if (values.length !== 1) throw new Error(\"duplicate key\");\n return values[0];\n}\n\nfunction nest(values, map, reduce, keys) {\n return (function regroup(values, i) {\n if (i >= keys.length) return reduce(values);\n const groups = new InternMap();\n const keyof = keys[i++];\n let index = -1;\n for (const value of values) {\n const key = keyof(value, ++index, values);\n const group = groups.get(key);\n if (group) group.push(value);\n else groups.set(key, [value]);\n }\n for (const [key, values] of groups) {\n groups.set(key, regroup(values, i));\n }\n return map(groups);\n })(values, 0);\n}\n","export default function permute(source, keys) {\n return Array.from(keys, key => source[key]);\n}\n","import ascending from \"./ascending.js\";\nimport permute from \"./permute.js\";\n\nexport default function sort(values, ...F) {\n if (typeof values[Symbol.iterator] !== \"function\") throw new TypeError(\"values is not iterable\");\n values = Array.from(values);\n let [f] = F;\n if ((f && f.length !== 2) || F.length > 1) {\n const index = Uint32Array.from(values, (d, i) => i);\n if (F.length > 1) {\n F = F.map(f => values.map(f));\n index.sort((i, j) => {\n for (const f of F) {\n const c = ascendingDefined(f[i], f[j]);\n if (c) return c;\n }\n });\n } else {\n f = values.map(f);\n index.sort((i, j) => ascendingDefined(f[i], f[j]));\n }\n return permute(values, index);\n }\n return values.sort(compareDefined(f));\n}\n\nexport function compareDefined(compare = ascending) {\n if (compare === ascending) return ascendingDefined;\n if (typeof compare !== \"function\") throw new TypeError(\"compare is not a function\");\n return (a, b) => {\n const x = compare(a, b);\n if (x || x === 0) return x;\n return (compare(b, b) === 0) - (compare(a, a) === 0);\n };\n}\n\nexport function ascendingDefined(a, b) {\n return (a == null || !(a >= a)) - (b == null || !(b >= b)) || (a < b ? -1 : a > b ? 1 : 0);\n}\n","import ascending from \"./ascending.js\";\nimport group, {rollup} from \"./group.js\";\nimport sort from \"./sort.js\";\n\nexport default function groupSort(values, reduce, key) {\n return (reduce.length !== 2\n ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk)))\n : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk))))\n .map(([key]) => key);\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","import {extent, groupSort} from 'd3-array';\nimport {rgb} from 'd3-color';\nimport {\n scaleLinear,\n scaleOrdinal,\n scaleLog,\n scalePoint,\n scaleQuantile,\n scaleQuantize,\n scaleSqrt,\n scaleThreshold,\n} from 'd3-scale';\nimport {format as d3Format} from 'd3-format';\n\nexport type LayerType =\n | 'clusterTile'\n | 'h3'\n | 'heatmapTile'\n | 'mvt'\n | 'quadbin'\n | 'raster'\n | 'tileset';\n\nimport {\n createBinaryProxy,\n formatDate,\n formatTimestamp,\n getLog10ScaleSteps,\n scaleIdentity,\n} from './utils.js';\nimport type {\n ColorRange,\n CustomMarkersRange,\n Dataset,\n MapLayerConfig,\n VisConfig,\n VisualChannelField,\n VisualChannels,\n} from './types.js';\nimport type {ProviderType, SchemaField} from '../types.js';\nimport {DEFAULT_AGGREGATION_EXP_ALIAS} from '../constants-internal.js';\nimport {AggregationTypes} from '../constants.js';\nimport type {Attribute, TilejsonResult} from '../sources/types.js';\n\nexport type D3Scale = {\n domain: (d?: any) => any[];\n range: (d?: any) => any[];\n unknown?: (d?: string) => any;\n} & ((d: any) => any);\ntype D3ScaleFactory = () => D3Scale;\n\nexport type ScaleType =\n | 'linear'\n | 'ordinal'\n | 'log'\n | 'point'\n | 'quantile'\n | 'quantize'\n | 'sqrt'\n | 'custom'\n | 'identity';\nconst SCALE_FUNCS: Record<ScaleType, D3ScaleFactory> = {\n linear: scaleLinear,\n ordinal: scaleOrdinal,\n log: scaleLog,\n point: scalePoint,\n quantile: scaleQuantile,\n quantize: scaleQuantize,\n sqrt: scaleSqrt,\n custom: scaleThreshold,\n identity: scaleIdentity,\n};\n\nfunction identity<T>(v: T): T {\n return v;\n}\n\nconst hexToRGB = (c: any) => {\n const {r, g, b} = rgb(c);\n return [r, g, b];\n};\n\nconst rgbToHex = (c: number[]) => {\n const [r, g, b] = c;\n const rStr = r.toString(16).padStart(2, '0');\n const gStr = g.toString(16).padStart(2, '0');\n const bStr = b.toString(16).padStart(2, '0');\n return `#${rStr}${gStr}${bStr}`.toUpperCase();\n};\n\nconst UNKNOWN_COLOR = '#868d91';\nconst UNKNOWN_COLOR_RGB = hexToRGB(UNKNOWN_COLOR);\n\nexport const OPACITY_MAP: Record<string, string> = {\n getFillColor: 'opacity',\n getLineColor: 'strokeOpacity',\n getTextColor: 'opacity',\n};\n\nconst hexToRGBA = (c: any) => {\n const {r, g, b, opacity} = rgb(c);\n return [r, g, b, 255 * opacity];\n};\n\n// Kepler prop value -> Deck.gl prop value\n// Supports nested definitions, and function transforms:\n// {keplerProp: 'deckProp'} is equivalent to:\n// {keplerProp: x => ({deckProp: x})}\nconst sharedPropMap = {\n // Apply the value of Kepler `color` prop to the deck `getFillColor` prop\n color: 'getFillColor',\n isVisible: 'visible',\n label: 'cartoLabel',\n textLabel: {\n alignment: 'getTextAlignmentBaseline',\n anchor: 'getTextAnchor',\n // Apply the value of Kepler `textLabel.color` prop to the deck `getTextColor` prop\n color: 'getTextColor',\n size: 'getTextSize',\n },\n visConfig: {\n enable3d: 'extruded',\n elevationScale: 'elevationScale',\n filled: 'filled',\n strokeColor: 'getLineColor',\n stroked: 'stroked',\n thickness: 'getLineWidth',\n radius: 'getPointRadius',\n wireframe: 'wireframe',\n },\n};\n\nconst rasterPropsMap = {\n isVisible: 'visible',\n visConfig: {\n opacity: 'opacity',\n },\n};\n\nconst customMarkersPropsMap = {\n color: 'getIconColor',\n visConfig: {\n radius: 'getIconSize',\n },\n};\n\nconst heatmapTilePropsMap = {\n visConfig: {\n colorRange: (x: any) => ({colorRange: x.colors.map(hexToRGBA)}),\n radius: (radius: number) => ({radiusPixels: 20 + radius}),\n opacity: 'opacity',\n },\n};\n\nconst defaultProps = {\n lineMiterLimit: 2,\n lineWidthUnits: 'pixels',\n pointRadiusUnits: 'pixels',\n rounded: true,\n wrapLongitude: false,\n};\n\nfunction mergePropMaps(\n a: Record<string, any> = {},\n b: Record<string, any> = {}\n) {\n return {...a, ...b, visConfig: {...a.visConfig, ...b.visConfig}};\n}\n\nconst deprecatedLayerTypes = [\n 'geojson',\n 'grid',\n 'heatmap',\n 'hexagon',\n 'hexagonId',\n 'point',\n];\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_LABEL_INDEX = 0;\n\n/** @privateRemarks Source: Builder */\nexport const TEXT_OUTLINE_OPACITY = 64;\n\nexport const TEXT_NUMBER_FORMATTER = new Intl.NumberFormat('en-US', {\n maximumFractionDigits: 2,\n notation: 'compact',\n});\n\nexport function getLayerProps(\n type: LayerType,\n config: MapLayerConfig,\n dataset: Dataset\n): {propMap: any; defaultProps: any} {\n if (deprecatedLayerTypes.includes(type)) {\n throw new Error(\n `Outdated layer type: ${type}. Please open map in CARTO Builder to automatically migrate.`\n );\n }\n\n if (type === 'raster') {\n return {\n propMap: rasterPropsMap,\n defaultProps: {},\n };\n }\n\n let basePropMap: any = sharedPropMap;\n if (config.visConfig?.customMarkers) {\n basePropMap = mergePropMaps(basePropMap, customMarkersPropsMap);\n }\n if (type === 'heatmapTile') {\n basePropMap = mergePropMaps(basePropMap, heatmapTilePropsMap);\n }\n const {aggregationExp, aggregationResLevel} = dataset;\n\n return {\n propMap: basePropMap,\n defaultProps: {\n ...defaultProps,\n ...(aggregationExp && {aggregationExp}),\n ...(aggregationResLevel && {aggregationResLevel}),\n uniqueIdProperty: 'geoid',\n },\n };\n}\n\nfunction domainFromAttribute(\n attribute: Attribute,\n scaleType: ScaleType,\n scaleLength: number\n): number[] | string[] {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n if (!attribute.categories) {\n return [0, 1];\n }\n return attribute.categories\n .map((c: any) => c.category)\n .filter((c: any) => c !== undefined && c !== null);\n }\n\n if (scaleType === 'quantile' && attribute.quantiles) {\n const quantiles: Record<number, number[]> =\n 'global' in attribute.quantiles\n ? attribute.quantiles.global\n : attribute.quantiles;\n\n // Stats API doesn't provide quantile[2] - which would be effecively [min, median, max]\n // so let's derive median from Quartiles (quantile[4]), of which second is median\n if (scaleLength === 2 && !quantiles[2] && quantiles[4]?.length === 5) {\n return [quantiles[4][0], quantiles[4][2], quantiles[4][4]];\n }\n if (quantiles[scaleLength]) {\n return quantiles[scaleLength];\n }\n }\n\n let {min} = attribute;\n if (scaleType === 'log' && min === 0) {\n min = 1e-5;\n }\n return [min ?? 0, attribute.max ?? 1];\n}\n\nfunction domainFromValues(values: any, scaleType: ScaleType) {\n if (scaleType === 'ordinal' || scaleType === 'point') {\n return groupSort(\n values,\n (g) => -g.length,\n (d) => d\n );\n } else if (scaleType === 'quantile') {\n return values.sort((a: any, b: any) => a - b);\n } else if (scaleType === 'log') {\n const [d0, d1] = extent(values as number[]);\n return [d0 === 0 ? 1e-5 : d0, d1];\n }\n return extent(values);\n}\n\nfunction calculateDomain(\n data: TilejsonResult,\n name: string,\n scaleType: ScaleType,\n scaleLength?: number\n) {\n if (data.tilestats) {\n // Tileset data type\n const {attributes} = data.tilestats.layers[0];\n const attribute = attributes.find((a: any) => a.attribute === name);\n if (attribute) {\n return domainFromAttribute(attribute, scaleType, scaleLength as number);\n }\n }\n\n return [0, 1];\n}\n\nfunction normalizeAccessor(accessor: any, data: any) {\n if (data.features || data.tilestats || data.raster_metadata) {\n return (object: any, info: any) => {\n if (object) {\n return accessor(object.properties || object.__source.object.properties);\n }\n\n const {data, index} = info;\n const proxy = createBinaryProxy(data, index);\n return accessor(proxy);\n };\n }\n return accessor;\n}\n\nexport function opacityToAlpha(opacity?: number) {\n return opacity !== undefined\n ? Math.round(255 * Math.pow(opacity, 1 / 2.2))\n : 255;\n}\n\nfunction getAccessorKeys(name: string, aggregation?: string | null): string[] {\n let keys = [name];\n if (aggregation) {\n // Snowflake will capitalized the keys, need to check lower and upper case version\n keys = keys.concat(\n [aggregation, aggregation.toUpperCase()].map((a) => `${name}_${a}`)\n );\n }\n return keys;\n}\n\nfunction findAccessorKey(keys: string[], properties: any): string[] {\n for (const key of keys) {\n if (key in properties) {\n return [key];\n }\n }\n\n // If data doesn't contain any valid keys, return all keys to run search\n // on next feature\n return keys;\n}\n\nexport function getColorAccessor(\n {name, colorColumn}: VisualChannelField,\n scaleType: ScaleType,\n {aggregation, range}: {aggregation?: string; range: ColorRange},\n opacity: number | undefined,\n data: TilejsonResult\n): {\n accessor: any;\n domain: number[] | string[];\n scaleDomain: number[] | string[];\n range: string[];\n} {\n const {scale, domain} = calculateLayerScale(\n colorColumn || name,\n colorColumn ? 'identity' : scaleType,\n range,\n data\n );\n const alpha = opacityToAlpha(opacity);\n\n let accessorKeys = getAccessorKeys(colorColumn || name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n const scaled = scale(propertyValue);\n const rgb = typeof scaled === 'string' ? hexToRGB(scaled) : scaled;\n return [...rgb, propertyValue === null ? 0 : alpha];\n };\n return {\n accessor: normalizeAccessor(accessor, data),\n scaleDomain: scale.domain(),\n domain,\n range: (scale.range() || []).map(rgbToHex),\n };\n}\n\nexport function calculateLayerScale(\n name: string,\n scaleType: ScaleType,\n range: ColorRange,\n data: TilejsonResult\n): {scale: D3Scale; domain: string[] | number[]} {\n let scaleDomain: number[] | string[] | undefined;\n let scaleColors: string[] = [];\n const {colors} = range;\n\n const domain = calculateDomain(data, name, scaleType, colors.length);\n if (scaleType !== 'identity') {\n if (range.colorMap) {\n const {colorMap} = range;\n scaleDomain = [];\n colorMap.forEach(([value, color]) => {\n (scaleDomain as any[]).push(value);\n scaleColors.push(color);\n });\n } else {\n if (scaleType === 'custom' && range.uiCustomScaleType === 'logarithmic') {\n const [min, max] = domain as number[];\n scaleDomain = getLog10ScaleSteps({\n min,\n max,\n steps: colors.length,\n });\n\n scaleColors = colors;\n } else {\n scaleColors = colors;\n }\n }\n }\n return {\n scale: createColorScale(\n scaleType,\n scaleDomain || domain,\n scaleColors.map(hexToRGB),\n UNKNOWN_COLOR_RGB\n ),\n domain,\n };\n}\n\nexport function createColorScale<T>(\n scaleType: ScaleType,\n domain: string[] | number[],\n range: T[],\n unknown: T\n) {\n const scale = SCALE_FUNCS[scaleType]();\n scale.domain(domain);\n scale.range(range);\n scale.unknown!(unknown as any);\n\n return scale;\n}\n\nconst FALLBACK_ICON =\n 'data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNTAiLz4NCjwvc3ZnPg==';\n\nexport function getIconUrlAccessor(\n field: VisualChannelField | null | undefined,\n range: CustomMarkersRange | null | undefined,\n {\n fallbackUrl,\n maxIconSize,\n useMaskedIcons,\n }: {\n fallbackUrl?: string | null;\n maxIconSize: number;\n useMaskedIcons?: boolean;\n },\n data: any\n) {\n const urlToUnpackedIcon = (url: string) => ({\n id: `${url}@@${maxIconSize}`,\n url,\n width: maxIconSize,\n height: maxIconSize,\n mask: useMaskedIcons,\n });\n let unknownValue = fallbackUrl || FALLBACK_ICON;\n\n if (range?.othersMarker) {\n unknownValue = range.othersMarker;\n }\n\n const unknownIcon = urlToUnpackedIcon(unknownValue);\n if (!range || !field) {\n return () => unknownIcon;\n }\n\n const mapping: Record<string, any> = {};\n for (const {value, markerUrl} of range.markerMap) {\n if (markerUrl) {\n mapping[value] = urlToUnpackedIcon(markerUrl);\n }\n }\n\n const accessor = (properties: any) => {\n const propertyValue = properties[field.name];\n return mapping[propertyValue] || unknownIcon;\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport function getMaxMarkerSize(\n visConfig: VisConfig,\n visualChannels: VisualChannels\n): number {\n const {radiusRange, radius} = visConfig;\n const {radiusField, sizeField} = visualChannels;\n const field = radiusField || sizeField;\n return Math.ceil(radiusRange && field ? radiusRange[1] : radius);\n}\n\ntype Accessor = number | ((d: any, i: any) => number);\nexport function negateAccessor(accessor: Accessor): Accessor {\n if (typeof accessor === 'function') {\n return (d: any, i: any) => -accessor(d, i);\n }\n return -accessor;\n}\n\nexport function getSizeAccessor(\n {name}: VisualChannelField,\n scaleType: ScaleType | undefined,\n aggregation: string | null | undefined,\n range: number[] | undefined,\n data: TilejsonResult\n): {\n accessor: any;\n domain: number[];\n scaleDomain: number[];\n range: number[] | undefined;\n} {\n const scale = scaleType ? SCALE_FUNCS[scaleType]() : identity;\n let domain: number[] = [];\n if (scaleType && range) {\n if (aggregation !== AggregationTypes.Count) {\n domain = calculateDomain(data, name, scaleType) as number[];\n (scale as D3Scale).domain(domain);\n } else {\n domain = (scale as D3Scale).domain();\n }\n (scale as D3Scale).range(range);\n }\n\n let accessorKeys = getAccessorKeys(name, aggregation);\n const accessor = (properties: any) => {\n if (!(accessorKeys[0] in properties)) {\n accessorKeys = findAccessorKey(accessorKeys, properties);\n }\n const propertyValue = properties[accessorKeys[0]];\n return scale(propertyValue);\n };\n return {\n accessor: normalizeAccessor(accessor, data),\n domain,\n scaleDomain: domain,\n range,\n };\n}\n\nconst FORMATS: Record<string, (value: any) => string> = {\n date: formatDate,\n integer: d3Format('i'),\n float: d3Format('.5f'),\n timestamp: formatTimestamp,\n default: String,\n};\n\nexport function getTextAccessor({name, type}: VisualChannelField, data: any) {\n const format = FORMATS[type] || FORMATS.default;\n const accessor = (properties: any) => {\n return format(properties[name]);\n };\n return normalizeAccessor(accessor, data);\n}\n\nexport {domainFromValues as _domainFromValues};\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterRadius(\n properties: {[column: string]: number},\n stats: Record<string, {min: number; max: number}>,\n radiusRange: [number, number],\n column: string\n): number {\n const {min, max} = stats[column];\n const value = properties[column];\n\n // When there's a single cluster on the screen, min and max are equivalent, so we should return the maximum radius\n if (min === max) return radiusRange[1];\n\n const normalizedValue = (value - min) / (max - min);\n return radiusRange[0] + normalizedValue * (radiusRange[1] - radiusRange[0]);\n}\n\n/** @privateRemarks Source: Builder */\nexport function getDefaultAggregationExpColumnAliasForLayerType(\n layerType: LayerType,\n provider: ProviderType,\n schema: SchemaField[]\n): string {\n if (schema && layerType === 'clusterTile') {\n return getColumnAliasForAggregationExp(\n getDefaultColumnFromSchemaForAggregationExp(schema),\n 'count',\n provider\n );\n } else {\n return DEFAULT_AGGREGATION_EXP_ALIAS;\n }\n}\n\n/** @privateRemarks Source: Builder */\nfunction getColumnAliasForAggregationExp(\n name: string,\n aggregation: string,\n provider: ProviderType\n) {\n const columnAlias = `${name}_${aggregation}`;\n return provider === 'snowflake' ? columnAlias.toUpperCase() : columnAlias;\n}\n\n/** @privateRemarks Source: Builder */\nfunction getDefaultColumnFromSchemaForAggregationExp(\n schema: SchemaField[]\n): string {\n return schema ? schema[0].name : '';\n}\n\n/** @privateRemarks Source: Builder */\nexport function calculateClusterTextFontSize(radius: number): number {\n if (radius >= 80) return 24;\n if (radius >= 72) return 24;\n if (radius >= 56) return 20;\n if (radius >= 40) return 16;\n if (radius >= 24) return 13;\n if (radius >= 8) return 11;\n return 11;\n}\n","import type {BinaryFeature} from '@loaders.gl/schema';\nimport type {Dataset} from './types.js';\ntype Properties = BinaryFeature['properties'];\ntype NumericProps = BinaryFeature['numericProps'];\n\n// Returns a Proxy object that allows accessing binary data\n// as if it were JSON properties\nexport function createBinaryProxy(\n data: {numericProps: NumericProps; properties: Properties[]},\n index: number\n) {\n const {properties, numericProps} = data;\n return new Proxy(properties[index] || {}, {\n get(target, property) {\n if (property in numericProps) {\n return numericProps[property as string].value[index];\n }\n return target[property as any];\n },\n\n has(target, property) {\n return property in numericProps || property in target;\n },\n\n ownKeys(target) {\n return [...Object.keys(numericProps), ...Reflect.ownKeys(target)];\n },\n\n getOwnPropertyDescriptor() {\n return {enumerable: true, configurable: true};\n },\n });\n}\n\nexport function scaleIdentity() {\n let unknown: any;\n\n function scale(x: any) {\n return x === null ? unknown : x;\n }\n\n scale.invert = scale;\n\n scale.domain = scale.range = (d: any) => d;\n\n scale.unknown = (u: any) => {\n if (u) {\n unknown = u;\n }\n\n return unknown;\n };\n\n scale.copy = () => {\n const scaleCopy = scaleIdentity();\n scaleCopy.unknown(unknown);\n return scaleCopy;\n };\n\n return scale;\n}\n\nexport function isRemoteCalculationSupported(dataset: Dataset) {\n if (dataset?.type === 'tileset' || dataset.providerId === 'databricks') {\n return false;\n }\n\n return true;\n}\n\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n year: '2-digit',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function formatDate(value: string | number | Date): string {\n return DATE_FORMATTER.format(new Date(value));\n}\n\nexport function formatTimestamp(value: string | number | Date): string {\n return String(Math.floor(new Date(value).getTime() / 1000));\n}\n\nfunction roundedPow10(exp: number) {\n // Math.pow(10, less than 4) generates \"0.0...009999999999999999\" instead of \"0.0...01\"\n // round it ...\n const raw = Math.pow(10, exp);\n if (exp < 0) {\n const shift = Math.pow(10, -exp);\n return Math.round(raw * shift) / shift;\n }\n return raw;\n}\n\n/**\n * Create domain for D3 threshold scale with logarithmic steps.\n *\n * If min is 0, it starts with max and goes down to fill color scale.\n * If max is Infinity, it starts with 10 and goes up to fill color scale.\n * Othersise it starts on first power of 10 that is greater than min.\n *\n * Generates `steps-1` entries, as this is what d3 threshold scale expects\n *\n * @see https://d3js.org/d3-scale/threshold\n */\nexport function getLog10ScaleSteps({\n min,\n max,\n steps,\n}: {\n min: number;\n max: number;\n steps: number;\n}): number[] {\n if (min === 0) {\n if (max === Infinity) {\n // count aggregations have [0, Infinity]\n // that will yield [10, 100, 1000, ...]\n return [...Array(steps - 1)].map((_v, i) => roundedPow10(i + 1));\n }\n // if stats.min = 0, we only can attempt to start from max and decrease powers until\n // we use all color buckets ...\n const maxLog = Math.log10(max);\n const endExponent = Math.ceil(maxLog);\n const startExponent = endExponent - steps + 1;\n return [...Array(steps - 1)].map((_v, i) =>\n roundedPow10(startExponent + i)\n );\n } else {\n const minLog = Math.log10(min);\n const startExponent =\n Math.ceil(minLog) === minLog ? minLog + 1 : Math.ceil(minLog);\n\n return [...Array(steps - 1)].map((_v, i) =>\n roundedPow10(startExponent + i)\n );\n }\n}\n","import type {RasterMetadata, RasterMetadataBand} from '../sources/types.js';\n\nimport {\n createVecExprEvaluator,\n type VecExprResult,\n type VecExprVecLike,\n} from './vec-expr-evaluator.js';\nimport type {\n ColorBand,\n ColorRange,\n MapLayerConfig,\n RasterLayerConfigColorBand,\n VisualChannels,\n} from './types.js';\nimport {createColorScale, type ScaleType} from './layer-map.js';\nimport {getLog10ScaleSteps} from './utils.js';\n\nconst UNKNOWN_COLOR = [134, 141, 145];\n\nconst RASTER_COLOR_BANDS = ['red', 'green', 'blue'] as const;\n\nfunction getHasDataPredicate(noData: number | string | undefined) {\n if (noData === 'nan') {\n return (v: number) => !isNaN(v);\n }\n if (typeof noData === 'string') {\n noData = parseFloat(noData);\n }\n if (typeof noData === 'number') {\n return (v: number) => v !== noData && !isNaN(v);\n }\n\n return () => true;\n}\n\n// this is data as seen in RasterLayer\ntype RasterLayerData = {\n blockSize: number;\n cells: BinaryDataCells;\n};\n\n// this is data as seen in RasterColumnLayer - the one that actually renders pixels\n// (binary data is just wrapped)\ntype RasterColumnLayerData = {\n length: number; // number of pixels\n data: RasterLayerData;\n\n // used to store buffers directly to be used by deck.gl, so we can skip accessors\n attributes?: Record<string, ArrayLike<number>>;\n\n // temporary storage for expression results filled in dataTransform\n expressionEvalContext?: Record<string, ArrayLike<number>>;\n customExpressionResults?: Record<string, VecExprResult>;\n};\n\ntype BinaryDataCells = {\n numericProps: Record<string, {value: VecExprVecLike}>;\n};\n\nfunction createRasterColumnLayerDataTransform(\n transform: (dataWrapped: RasterColumnLayerData) => RasterColumnLayerData\n) {\n return (data: RasterLayerData | RasterColumnLayerData) => {\n if (!data || !('data' in data) || !data?.data?.cells?.numericProps) {\n // we're in RasterLayer, or we've got invalid data\n return data as RasterLayerData;\n }\n // we only transform data when in RasterColumnLayer\n return transform(data);\n };\n}\n\nfunction createEvaluationContext(\n numericProps: Record<string, {value: VecExprVecLike}>,\n noData: number | string | undefined\n) {\n // Optimization note\n // Seems like Array.from(256k+typed array takes even 15ms), so _we_ can afford to copy the array if we really don't need it to\n // only copy values to array only if we really see nodata in all bands\n const hasData = getHasDataPredicate(noData);\n const bands = Object.entries(numericProps).map(([bandName, {value}]) => ({\n bandName,\n values: value,\n copied: false,\n }));\n\n const length = bands[0].values.length;\n\n for (let i = 0; i < length; i++) {\n let hasSomeData = false;\n for (let j = 0; j < bands.length; j++) {\n hasSomeData = hasSomeData || hasData(bands[j].values[i]);\n }\n if (!hasSomeData) {\n for (let j = 0; j < bands.length; j++) {\n if (!bands[j].copied) {\n bands[j].copied = true;\n bands[j].values = Array.from(bands[j].values);\n }\n bands[j].values[i] = NaN;\n }\n }\n }\n\n const context = bands.reduce(\n (agg, {bandName, values}) => {\n agg[bandName] = values;\n return agg;\n },\n {} as Record<string, ArrayLike<number>>\n );\n return context;\n}\n\nfunction createExprDataTransform({\n colorBand,\n rasterMetadata,\n usedSymbols,\n}: {\n colorBand: RasterLayerConfigColorBand | null | undefined;\n rasterMetadata: RasterMetadata;\n usedSymbols: string[];\n}) {\n if (!colorBand || !colorBand.type || colorBand.type === 'none') {\n return undefined;\n }\n\n const expr = colorBand?.type === 'expression' ? colorBand.value : undefined;\n const vecExprEvaluator = expr ? createVecExprEvaluator(expr) : undefined;\n\n const dataTransform = createRasterColumnLayerDataTransform(\n (dataWrapped: RasterColumnLayerData) => {\n const data = dataWrapped.data;\n if (expr) {\n const cachedResult = dataWrapped.customExpressionResults?.[expr];\n if (cachedResult) {\n return dataWrapped;\n }\n }\n\n let context = dataWrapped.expressionEvalContext;\n if (!context) {\n const usedNumericProps = usedSymbols.reduce(\n (acc, symbol) => {\n acc[symbol] = data.cells.numericProps[symbol];\n return acc;\n },\n {} as Record<string, {value: VecExprVecLike}>\n );\n context = createEvaluationContext(\n usedNumericProps,\n rasterMetadata.nodata\n );\n dataWrapped = {\n ...dataWrapped,\n expressionEvalContext: context,\n };\n }\n\n if (!vecExprEvaluator || !expr) return dataWrapped;\n\n const evalResult = vecExprEvaluator(context);\n return {\n ...dataWrapped,\n customExpressionResults: {\n ...dataWrapped.customExpressionResults,\n [expr]: evalResult,\n },\n };\n }\n );\n return dataTransform;\n}\n\nfunction combineDataTransforms<T>(\n dataTransforms: (((data: T) => T) | undefined)[]\n): ((data: T) => T) | undefined {\n const actualTransforms = dataTransforms.filter((v) => v) as ((\n data: T\n ) => T)[];\n\n if (actualTransforms.length === 0) return undefined;\n if (actualTransforms.length === 1) return actualTransforms[0];\n\n return (data: T) =>\n actualTransforms.reduce(\n (aggData, transformFun) => transformFun(aggData),\n data\n );\n}\n\nfunction createRgbToColorBufferDataTransform({\n bandDefs,\n attribute,\n}: {\n bandDefs: Partial<Record<ColorBand, RasterLayerConfigColorBand>>;\n attribute: string;\n}) {\n return createRasterColumnLayerDataTransform(\n (dataWrapped: RasterColumnLayerData) => {\n const length = dataWrapped.length;\n\n const getBandBufferOrValue = (colorBand?: RasterLayerConfigColorBand) => {\n if (colorBand?.type === 'expression') {\n return dataWrapped.customExpressionResults?.[colorBand.value];\n }\n if (colorBand?.type === 'band') {\n // we could use original band, but this one is already cleared from nodata if needed\n return dataWrapped.expressionEvalContext?.[colorBand.value];\n }\n return 0;\n };\n\n const red = getBandBufferOrValue(bandDefs.red);\n const green = getBandBufferOrValue(bandDefs.green);\n const blue = getBandBufferOrValue(bandDefs.blue);\n\n const colorBuffer = new Uint8Array(length * 4);\n for (\n let inputIndex = 0, outputIndex = 0;\n inputIndex < length;\n inputIndex++, outputIndex += 4\n ) {\n const redRaw =\n typeof red === 'number' ? red : red ? red[inputIndex] : NaN;\n const greenRaw =\n typeof green === 'number' ? green : green ? green[inputIndex] : NaN;\n const blueRaw =\n typeof blue === 'number' ? blue : blue ? blue[inputIndex] : NaN;\n\n if (isNaN(redRaw) && isNaN(greenRaw) && isNaN(blueRaw)) {\n // skip pixel\n bufferSetRgba(colorBuffer, outputIndex, 0, 0, 0, 0);\n } else {\n bufferSetRgba(\n colorBuffer,\n outputIndex,\n redRaw,\n greenRaw,\n blueRaw,\n 255\n );\n }\n }\n\n // clear cached buffers\n // This transform is applied last -after expression & band evaluators which store and\n // cache values for _this_ transform.\n // Now, _assuming_ this is last transform we can clear those buffers.\n dataWrapped.customExpressionResults = undefined;\n dataWrapped.expressionEvalContext = undefined;\n\n return {\n ...dataWrapped,\n attributes: {\n [attribute]: colorBuffer,\n },\n };\n }\n );\n}\n\nfunction getUsedSymbols(colorBands: RasterLayerConfigColorBand[]) {\n return Array.from(\n colorBands.reduce((symbols, band) => {\n if (band.type === 'expression') {\n const expressionSymbols =\n createVecExprEvaluator(band.value)?.symbols || [];\n expressionSymbols.forEach((symbol) => symbols.add(symbol));\n }\n if (band.type === 'band') {\n symbols.add(band.value);\n }\n return symbols;\n }, new Set<string>())\n );\n}\n\nexport function getRasterTileLayerStylePropsRgb({\n layerConfig,\n rasterMetadata,\n visualChannels,\n}: {\n layerConfig: MapLayerConfig;\n rasterMetadata: RasterMetadata;\n visualChannels: VisualChannels;\n}) {\n const {visConfig} = layerConfig;\n const {colorBands} = visConfig;\n\n const bandDefs = {\n red: colorBands?.find((band) => band.band === 'red'),\n green: colorBands?.find((band) => band.band === 'green'),\n blue: colorBands?.find((band) => band.band === 'blue'),\n };\n\n const rgbToInstanceFillColorsDataTransform =\n createRgbToColorBufferDataTransform({\n bandDefs,\n attribute: 'instanceFillColors',\n });\n\n const usedSymbols = colorBands ? getUsedSymbols(colorBands) : [];\n const bandTransforms = RASTER_COLOR_BANDS.map((band) =>\n createExprDataTransform({\n colorBand: bandDefs[band],\n rasterMetadata,\n usedSymbols,\n })\n );\n const combinedDataTransform = combineDataTransforms([\n ...bandTransforms,\n rgbToInstanceFillColorsDataTransform,\n ]);\n\n return {\n dataTransform: combinedDataTransform as () => any,\n updateTriggers: getRasterTileLayerUpdateTriggers({\n layerConfig,\n visualChannels,\n }),\n };\n}\n\nfunction createBandColorScaleDataTransform({\n bandName,\n scaleFun,\n nodata,\n attribute,\n}: {\n bandName: string;\n scaleFun: (v: number) => number[];\n nodata: number | string | undefined;\n attribute: string;\n}) {\n const hasData = getHasDataPredicate(nodata);\n\n return createRasterColumnLayerDataTransform(\n (dataWrapped: RasterColumnLayerData) => {\n const length = dataWrapped.length;\n const bandBuffer = dataWrapped.data.cells.numericProps[bandName].value;\n const colorBuffer = new Uint8Array(length * 4);\n\n for (let i = 0; i < length; i++) {\n const rawValue = bandBuffer[i];\n if (!hasData(rawValue)) {\n // skip pixel\n bufferSetRgba(colorBuffer, i * 4, 0, 0, 0, 0);\n } else {\n const colorRgb = scaleFun(rawValue);\n bufferSetRgba(\n colorBuffer,\n i * 4,\n colorRgb[0],\n colorRgb[1],\n colorRgb[2],\n 255\n );\n }\n }\n return {\n ...dataWrapped,\n attributes: {\n [attribute]: colorBuffer,\n },\n };\n }\n );\n}\n\nexport function domainFromRasterMetadataBand(\n band: RasterMetadataBand,\n scaleType: ScaleType,\n colorRange: ColorRange\n) {\n if (scaleType === 'ordinal') {\n return colorRange.colorMap?.map(([value]) => value) || [];\n }\n if (scaleType === 'custom') {\n if (colorRange.uiCustomScaleType === 'logarithmic') {\n return getLog10ScaleSteps({\n min: band.stats.min,\n max: band.stats.max,\n steps: colorRange.colors.length,\n });\n } else {\n // actually custom, read colorMap\n return colorRange.colorMap?.map(([value]) => value) || [];\n }\n }\n const scaleLength = colorRange.colors.length;\n if (scaleType === 'quantile') {\n const quantiles = band.stats.quantiles?.[scaleLength];\n if (!quantiles) {\n return [0, 1];\n }\n return [band.stats.min, ...quantiles, band.stats.max];\n }\n return [band.stats.min, band.stats.max];\n}\n\n/**\n * Get RasterLayerStyle props for ColorRange and UniqueValues modes\n *\n * Effectively, applies selected color scale applied to one band.\n */\nexport function getRasterTileLayerStylePropsScaledBand({\n layerConfig,\n rasterMetadata,\n visualChannels,\n}: {\n layerConfig: MapLayerConfig;\n visualChannels: VisualChannels;\n rasterMetadata: RasterMetadata;\n}) {\n const {visConfig} = layerConfig;\n const {colorField} = visualChannels;\n const {rasterStyleType} = visConfig;\n\n const colorRange =\n rasterStyleType === 'ColorRange'\n ? visConfig.colorRange\n : visConfig.uniqueValuesColorRange;\n const scaleType =\n rasterStyleType === 'ColorRange' ? visualChannels.colorScale : 'ordinal';\n const bandInfo = rasterMetadata.bands.find(\n (band) => band.name === colorField?.name\n );\n\n if (!colorField?.name || !scaleType || !colorRange || !bandInfo) {\n return {};\n }\n\n const domain = domainFromRasterMetadataBand(bandInfo, scaleType, colorRange);\n\n const scaleFun = createColorScale(\n scaleType,\n domain,\n colorRange.colors.map(hexToRGB),\n UNKNOWN_COLOR\n );\n\n const bandColorScaleDataTransform = createBandColorScaleDataTransform({\n bandName: bandInfo.name,\n scaleFun,\n nodata: bandInfo?.nodata ?? rasterMetadata.nodata,\n attribute: 'instanceFillColors',\n });\n\n return {\n dataTransform: bandColorScaleDataTransform as () => any,\n updateTriggers: getRasterTileLayerUpdateTriggers({\n layerConfig,\n visualChannels,\n }),\n };\n}\n\nexport function getRasterTileLayerStyleProps({\n layerConfig,\n visualChannels,\n rasterMetadata,\n}: {\n layerConfig: MapLayerConfig;\n visualChannels: VisualChannels;\n rasterMetadata: RasterMetadata;\n}) {\n const {visConfig} = layerConfig;\n const {rasterStyleType} = visConfig;\n\n if (rasterStyleType === 'Rgb') {\n return getRasterTileLayerStylePropsRgb({\n layerConfig,\n rasterMetadata,\n visualChannels,\n });\n } else {\n return getRasterTileLayerStylePropsScaledBand({\n layerConfig,\n rasterMetadata,\n visualChannels,\n });\n }\n}\n\nexport function getRasterTileLayerUpdateTriggers({\n layerConfig,\n visualChannels,\n}: {\n layerConfig: MapLayerConfig;\n visualChannels: VisualChannels;\n}) {\n const {visConfig} = layerConfig;\n const {rasterStyleType} = visConfig;\n const getFillColorUpdateTriggers: Record<string, unknown> = {\n rasterStyleType,\n };\n if (rasterStyleType === 'ColorRange') {\n getFillColorUpdateTriggers.colorRange = visConfig.colorRange?.colors;\n getFillColorUpdateTriggers.colorMap = visConfig.colorRange?.colorMap;\n getFillColorUpdateTriggers.colorScale = visualChannels.colorScale;\n getFillColorUpdateTriggers.colorFieldId = visualChannels.colorField?.name;\n } else if (rasterStyleType === 'UniqueValues') {\n getFillColorUpdateTriggers.colorMap =\n visConfig.uniqueValuesColorRange?.colorMap;\n getFillColorUpdateTriggers.colorFieldId = visualChannels.colorField?.name;\n } else if (rasterStyleType === 'Rgb') {\n getFillColorUpdateTriggers.colorBands = visConfig.colorBands;\n }\n\n return {\n getFillColor: getFillColorUpdateTriggers,\n };\n}\n\nfunction bufferSetRgba(\n target: VecExprVecLike,\n index: number,\n r: number,\n g: number,\n b: number,\n a: number\n) {\n target[index + 0] = r;\n target[index + 1] = g;\n target[index + 2] = b;\n target[index + 3] = a;\n}\n\nfunction hexToRGB(hexColor: string): [number, number, number] {\n const r = parseInt(hexColor.slice(1, 3), 16);\n const g = parseInt(hexColor.slice(3, 5), 16);\n const b = parseInt(hexColor.slice(5, 7), 16);\n\n return [r, g, b];\n}\n","import type {ColorParameters} from '@luma.gl/core';\nimport {\n calculateClusterRadius,\n calculateClusterTextFontSize,\n getDefaultAggregationExpColumnAliasForLayerType,\n getLayerProps,\n getColorAccessor,\n getSizeAccessor,\n getTextAccessor,\n opacityToAlpha,\n getIconUrlAccessor,\n negateAccessor,\n getMaxMarkerSize,\n type LayerType,\n OPACITY_MAP,\n TEXT_NUMBER_FORMATTER,\n TEXT_LABEL_INDEX,\n TEXT_OUTLINE_OPACITY,\n type ScaleType,\n} from './layer-map.js';\n\nimport {assert, isEmptyObject} from '../utils.js';\nimport type {Filters} from '../types.js';\nimport type {\n KeplerMapConfig,\n MapLayerConfig,\n VisualChannels,\n VisConfig,\n MapConfigLayer,\n Dataset,\n VisualChannelField,\n} from './types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\nimport {\n getRasterTileLayerStylePropsRgb,\n getRasterTileLayerStylePropsScaledBand,\n} from './raster-layer.js';\nimport type {TilejsonResult} from '../sources/types.js';\n\nexport type Scale = {\n type: ScaleType;\n field: VisualChannelField;\n\n /** Natural domain of the scale, as defined by the data */\n domain: string[] | number[];\n\n /** Domain of the user to construct d3 scale */\n scaleDomain?: string[] | number[];\n range?: string[] | number[];\n};\n\nexport type ScaleKey =\n | 'fillColor'\n | 'pointRadius'\n | 'lineColor'\n | 'elevation'\n | 'weight';\n\nexport type Scales = Partial<Record<ScaleKey, Scale>>;\n\nexport type LayerDescriptor = {\n type: LayerType;\n props: Record<string, any>;\n filters?: Filters;\n scales: Scales;\n};\n\nexport type ParseMapResult = {\n /** Map id. */\n id: string;\n\n /** Title of map. */\n title: string;\n\n /** Description of map. */\n description?: string;\n createdAt: string;\n updatedAt: string;\n initialViewState: any;\n\n /** @deprecated Use `basemap`. */\n mapStyle: any;\n popupSettings: any;\n token: string;\n\n layers: LayerDescriptor[];\n};\n\nexport function getLayerDescriptor({\n mapConfig,\n layer,\n dataset,\n}: {\n mapConfig: KeplerMapConfig;\n layer: MapConfigLayer;\n dataset: Dataset;\n}) {\n const {filters, visState} = mapConfig;\n const {layerBlending, interactionConfig} = visState;\n const {id, type, config, visualChannels} = layer;\n const {data, id: datasetId} = dataset;\n\n const {propMap, defaultProps} = getLayerProps(type, config, dataset);\n\n const styleProps = createStyleProps(config, propMap);\n\n const {channelProps, scales} = createChannelProps(\n id,\n type,\n config,\n visualChannels,\n data,\n dataset\n );\n const layerDescriptor: LayerDescriptor = {\n type,\n filters:\n isEmptyObject(filters) || isRemoteCalculationSupported(dataset)\n ? undefined\n : filters[datasetId],\n props: {\n id,\n data,\n ...defaultProps,\n ...createInteractionProps(interactionConfig),\n ...styleProps,\n ...channelProps,\n ...createParametersProp(layerBlending, styleProps.parameters || {}), // Must come after style\n ...createLoadOptions(data.accessToken),\n },\n scales,\n };\n return layerDescriptor;\n}\n\nexport function parseMap(json: any) {\n const {keplerMapConfig, datasets, token} = json;\n assert(keplerMapConfig.version === 'v1', 'Only support Kepler v1');\n const mapConfig = keplerMapConfig.config as KeplerMapConfig;\n const {mapState, mapStyle, popupSettings, legendSettings, visState} =\n mapConfig;\n const {layers} = visState;\n\n const layersReverse = [...layers].reverse();\n return {\n id: json.id,\n title: json.title,\n description: json.description,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n initialViewState: mapState,\n /** @deprecated Use `basemap`. */\n mapStyle,\n popupSettings,\n legendSettings,\n token,\n layers: layersReverse.map((layer: MapConfigLayer) => {\n try {\n const {dataId} = layer.config;\n const dataset: Dataset | null = datasets.find(\n (d: any) => d.id === dataId\n );\n assert(dataset, `No dataset matching dataId: ${dataId}`);\n const layerDescriptor = getLayerDescriptor({\n mapConfig,\n layer,\n dataset,\n });\n return layerDescriptor;\n } catch (e: any) {\n console.error(e.message);\n return undefined;\n }\n }),\n };\n}\n\nfunction createParametersProp(\n layerBlending: string,\n parameters: ColorParameters\n) {\n if (layerBlending === 'additive') {\n parameters.blendColorSrcFactor = parameters.blendAlphaSrcFactor =\n 'src-alpha';\n parameters.blendColorDstFactor = parameters.blendAlphaDstFactor =\n 'dst-alpha';\n parameters.blendColorOperation = parameters.blendAlphaOperation = 'add';\n } else if (layerBlending === 'subtractive') {\n parameters.blendColorSrcFactor = 'one';\n parameters.blendColorDstFactor = 'one-minus-dst-color';\n parameters.blendAlphaSrcFactor = 'src-alpha';\n parameters.blendAlphaDstFactor = 'dst-alpha';\n parameters.blendColorOperation = 'subtract';\n parameters.blendAlphaOperation = 'add';\n }\n\n return Object.keys(parameters).length ? {parameters} : {};\n}\n\nfunction createInteractionProps(interactionConfig: any) {\n const pickable = interactionConfig && interactionConfig.tooltip.enabled;\n return {\n autoHighlight: pickable,\n pickable,\n };\n}\n\nfunction mapProps(source: any, target: any, mapping: any) {\n for (const sourceKey in mapping) {\n const sourceValue = source[sourceKey];\n const targetKey = mapping[sourceKey];\n if (sourceValue === undefined) {\n continue;\n }\n if (typeof targetKey === 'string') {\n target[targetKey] = sourceValue;\n } else if (typeof targetKey === 'function') {\n const [key, value] = Object.entries(targetKey(sourceValue))[0];\n target[key] = value;\n } else if (typeof targetKey === 'object') {\n // Nested definition, recurse down one level (also handles arrays)\n mapProps(sourceValue, target, targetKey);\n }\n }\n}\n\nfunction createStyleProps(config: MapLayerConfig, mapping: any) {\n const result: Record<string, any> = {};\n mapProps(config, result, mapping);\n\n // Kepler format sometimes omits strokeColor. TODO: remove once we can rely on\n // `strokeColor` always being set when `stroke: true`.\n if (result.stroked && !result.getLineColor) {\n result.getLineColor = result.getFillColor;\n }\n\n for (const colorAccessor in OPACITY_MAP) {\n if (Array.isArray(result[colorAccessor])) {\n const color = [...result[colorAccessor]];\n const opacityKey = OPACITY_MAP[colorAccessor];\n const opacity = config.visConfig[opacityKey as keyof VisConfig] as number;\n color[3] = opacityToAlpha(opacity);\n result[colorAccessor] = color;\n }\n }\n\n result.highlightColor = config.visConfig.enable3d\n ? [255, 255, 255, 60]\n : [252, 242, 26, 255];\n return result;\n}\n\nfunction createChannelProps(\n id: string,\n layerType: LayerType,\n config: MapLayerConfig,\n visualChannels: VisualChannels,\n data: TilejsonResult,\n dataset: Dataset\n): {\n channelProps: Record<string, any>;\n scales: Partial<Record<ScaleKey, Scale>>;\n} {\n if (layerType === 'raster') {\n const rasterMetadata = data.raster_metadata;\n if (!rasterMetadata) {\n return {\n channelProps: {},\n scales: {},\n };\n }\n const rasterStyleType = config.visConfig.rasterStyleType;\n if (rasterStyleType === 'Rgb') {\n return {\n channelProps: getRasterTileLayerStylePropsRgb({\n layerConfig: config,\n rasterMetadata,\n visualChannels,\n }),\n scales: {}, // TODO\n };\n } else {\n return {\n channelProps: getRasterTileLayerStylePropsScaledBand({\n layerConfig: config,\n visualChannels,\n rasterMetadata,\n }),\n scales: {\n // TODO\n },\n };\n }\n }\n const {textLabel, visConfig} = config;\n const result: Record<string, any> = {};\n const updateTriggers: Record<string, any> = {};\n\n const scales: Record<string, Scale> = {};\n\n // fill color\n {\n const {colorField, colorScale} = visualChannels;\n const {colorRange, colorAggregation} = visConfig;\n if (colorField && colorScale && colorRange) {\n const {accessor, ...scaleProps} = getColorAccessor(\n colorField,\n colorScale,\n {aggregation: colorAggregation, range: colorRange},\n visConfig.opacity,\n data\n );\n result.getFillColor = accessor;\n scales.fillColor = updateTriggers.getFillColor = {\n field: colorField,\n type: colorScale,\n ...scaleProps,\n };\n } else {\n scales.fillColor = {} as any;\n }\n }\n\n if (layerType === 'clusterTile') {\n const aggregationExpAlias = getDefaultAggregationExpColumnAliasForLayerType(\n layerType,\n dataset.providerId,\n data.schema\n );\n\n result.pointType = visConfig.isTextVisible ? 'circle+text' : 'circle';\n result.clusterLevel = visConfig.clusterLevel;\n\n result.getWeight = (d: any) => {\n return d.properties[aggregationExpAlias];\n };\n\n updateTriggers.getWeight = aggregationExpAlias;\n\n result.getPointRadius = (d: any, info: any) => {\n return calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n };\n updateTriggers.getPointRadius = {\n aggregationExpAlias,\n radiusRange: visConfig.radiusRange,\n };\n\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n\n result.getText = (d: any) =>\n TEXT_NUMBER_FORMATTER.format(d.properties[aggregationExpAlias]);\n\n updateTriggers.getText = aggregationExpAlias;\n\n result.getTextColor = config.textLabel[TEXT_LABEL_INDEX].color;\n result.textOutlineColor = [\n ...(config.textLabel[TEXT_LABEL_INDEX].outlineColor as number[]),\n TEXT_OUTLINE_OPACITY,\n ];\n result.textOutlineWidth = 5;\n result.textSizeUnits = 'pixels';\n\n result.getTextSize = (d: any, info: any) => {\n const radius = calculateClusterRadius(\n d.properties,\n info.data.attributes.stats,\n visConfig.radiusRange as [number, number],\n aggregationExpAlias\n );\n return calculateClusterTextFontSize(radius);\n };\n\n updateTriggers.getTextSize = {\n aggregationExpAlias,\n radiusRange: visConfig.radiusRange,\n };\n }\n\n // point radius\n {\n const radiusRange = visConfig.radiusRange;\n const {radiusField, radiusScale} = visualChannels;\n if (radiusField && radiusRange && radiusScale) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n radiusField,\n radiusScale,\n visConfig.radiusAggregation,\n radiusRange,\n data\n );\n result.getPointRadius = accessor;\n scales.pointRadius = updateTriggers.getPointRadius = {\n field: radiusField,\n type: radiusScale,\n ...scaleProps,\n };\n }\n }\n\n // stroke/ouline color\n {\n const strokeColorRange = visConfig.strokeColorRange;\n const {strokeColorScale, strokeColorField} = visualChannels;\n if (strokeColorField && strokeColorRange && strokeColorScale) {\n const {strokeColorAggregation: aggregation} = visConfig;\n const opacity =\n visConfig.strokeOpacity !== undefined ? visConfig.strokeOpacity : 1;\n\n const {accessor, ...scaleProps} = getColorAccessor(\n strokeColorField,\n strokeColorScale,\n {aggregation, range: strokeColorRange},\n opacity,\n data\n );\n result.getLineColor = accessor;\n scales.lineColor = updateTriggers.getLineColor = {\n field: strokeColorField,\n type: strokeColorScale,\n ...scaleProps,\n };\n }\n }\n\n // stroke/line width\n {\n const {sizeField: strokeWidthField, sizeScale: strokeWidthScale} =\n visualChannels;\n const {sizeRange, sizeAggregation} = visConfig;\n\n if (strokeWidthField && sizeRange) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n strokeWidthField,\n strokeWidthScale,\n sizeAggregation,\n sizeRange,\n data\n );\n result.getLineWidth = accessor;\n scales.lineWidth = updateTriggers.getLineWidth = {\n field: strokeWidthField,\n type: strokeWidthScale || 'identity',\n ...scaleProps,\n };\n }\n }\n\n // height / elevation\n {\n const {enable3d, heightRange} = visConfig;\n const {heightField, heightScale} = visualChannels;\n if (heightField && heightRange && enable3d) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n heightField,\n heightScale,\n visConfig.heightAggregation,\n heightRange,\n data\n );\n result.getElevation = accessor;\n scales.elevation = updateTriggers.getElevation = {\n field: heightField,\n type: heightScale || 'identity',\n ...scaleProps,\n };\n }\n }\n\n // weight\n {\n const {weightField} = visualChannels;\n const {weightAggregation} = visConfig;\n if (weightField && weightAggregation) {\n const {accessor, ...scaleProps} = getSizeAccessor(\n weightField,\n undefined,\n weightAggregation,\n undefined,\n data\n );\n result.getWeight = accessor;\n scales.weight = updateTriggers.getWeight = {\n field: weightField,\n type: 'identity' as ScaleType,\n ...scaleProps,\n };\n }\n }\n\n if (visConfig.customMarkers) {\n const maxIconSize = getMaxMarkerSize(visConfig, visualChannels);\n const {getPointRadius, getFillColor} = result;\n const {\n customMarkersUrl,\n customMarkersRange,\n filled: useMaskedIcons,\n } = visConfig;\n\n result.pointType = 'icon';\n result.getIcon = getIconUrlAccessor(\n visualChannels.customMarkersField,\n customMarkersRange,\n {fallbackUrl: customMarkersUrl, maxIconSize, useMaskedIcons},\n data\n );\n updateTriggers.getIcon = {\n customMarkersUrl,\n customMarkersRange,\n maxIconSize,\n useMaskedIcons,\n };\n result._subLayerProps = {\n 'points-icon': {\n loadOptions: {\n image: {\n type: 'imagebitmap',\n },\n imagebitmap: {\n resizeWidth: maxIconSize,\n resizeHeight: maxIconSize,\n resizeQuality: 'high',\n },\n },\n },\n };\n\n if (getFillColor && useMaskedIcons) {\n result.getIconColor = getFillColor;\n updateTriggers.getIconColor = updateTriggers.getFillColor;\n }\n\n if (getPointRadius) {\n result.getIconSize = getPointRadius;\n updateTriggers.getIconSize = updateTriggers.getPointRadius;\n }\n\n if (visualChannels.rotationField) {\n const {accessor} = getSizeAccessor(\n visualChannels.rotationField,\n undefined,\n null,\n undefined,\n data\n );\n result.getIconAngle = negateAccessor(accessor);\n updateTriggers.getIconAngle = updateTriggers.getRotationField;\n }\n } else if (layerType === 'tileset') {\n result.pointType = 'circle';\n }\n\n if (textLabel && textLabel.length && textLabel[0].field) {\n const [mainLabel, secondaryLabel] = textLabel;\n const collisionGroup = id;\n\n ({\n alignment: result.getTextAlignmentBaseline,\n anchor: result.getTextAnchor,\n color: result.getTextColor,\n outlineColor: result.textOutlineColor,\n size: result.textSizeScale,\n } = mainLabel);\n const {\n color: getSecondaryColor,\n field: secondaryField,\n outlineColor: secondaryOutlineColor,\n size: secondarySizeScale,\n } = secondaryLabel || {};\n\n result.getText = mainLabel.field && getTextAccessor(mainLabel.field, data);\n const getSecondaryText =\n secondaryField && getTextAccessor(secondaryField, data);\n\n result.pointType = `${result.pointType}+text`;\n result.textCharacterSet = 'auto';\n result.textFontFamily = 'Inter, sans';\n result.textFontSettings = {sdf: true};\n result.textFontWeight = 600;\n result.textOutlineWidth = 3;\n\n result._subLayerProps = {\n ...result._subLayerProps,\n 'points-text': {\n collisionEnabled: true,\n collisionGroup,\n\n // getPointRadius already has radiusScale baked in, so only pass one or the other\n ...(result.getPointRadius\n ? {getRadius: result.getPointRadius}\n : {radiusScale: visConfig.radius}),\n\n ...(secondaryField && {\n getSecondaryText,\n getSecondaryColor,\n secondarySizeScale,\n secondaryOutlineColor,\n }),\n },\n };\n }\n\n return {\n channelProps: {\n ...result,\n updateTriggers,\n },\n scales,\n };\n}\n\nfunction createLoadOptions(accessToken: string) {\n return {\n loadOptions: {fetch: {headers: {Authorization: `Bearer ${accessToken}`}}},\n };\n}\n","import {\n GOOGLE_BASEMAPS,\n CARTO_MAP_STYLES,\n applyLayerGroupFilters,\n fetchStyle,\n getStyleUrl,\n someLayerGroupsDisabled,\n} from './basemap-styles.js';\nimport type {Basemap, KeplerMapConfig, MapLibreBasemapProps} from './types.js';\nimport type {APIErrorContext} from '../api/index.js';\n\nconst CUSTOM_STYLE_ID_PREFIX = 'custom:';\nconst DEFAULT_CARTO_STYLE = 'positron';\n\n// Subset of type from @deck.gl/core to avoid adding dependency\ntype MapViewState = {\n /** Longitude of the map center */\n longitude: number;\n /** Latitude of the map center */\n latitude: number;\n /** Zoom level */\n zoom: number;\n /** Pitch (tilt) of the map, in degrees. `0` looks top down */\n pitch?: number;\n /** Bearing (rotation) of the map, in degrees. `0` is north up */\n bearing?: number;\n};\n\nfunction mapLibreViewpros(\n config: KeplerMapConfig\n): Omit<MapLibreBasemapProps, 'style'> {\n const {longitude, latitude, ...rest} = config.mapState as MapViewState;\n return {\n center: [longitude, latitude],\n ...rest,\n };\n}\n\n/**\n * Get basemap properties for Carto map.\n *\n * For maplibre-based basemaps it returns style or style URL that can be used with `maplibregl.Map` compatible component.\n * * style url is returned for non-filtered standard Carto basemaps or if user used style URL directly in configuration\n * * filtered style object returned for Carto basemaps with layer groups filtered\n *\n * For Google-maps base maps, it returns options that can be used with `google.maps.Map` constructor.\n */\nexport async function fetchBasemapProps({\n config,\n errorContext,\n\n applyLayerFilters = true,\n}: {\n config: KeplerMapConfig;\n\n /** By default `fetchBasemapProps` applies layers filters to style. Set this to `false` to disable it. */\n applyLayerFilters?: boolean;\n errorContext?: APIErrorContext;\n}): Promise<Basemap | null> {\n const {mapStyle} = config;\n const styleType = mapStyle.styleType || DEFAULT_CARTO_STYLE;\n if (styleType.startsWith(CUSTOM_STYLE_ID_PREFIX)) {\n const currentCustomStyle = config.customBaseMaps?.customStyle;\n if (currentCustomStyle) {\n return {\n type: 'maplibre',\n props: {\n style: currentCustomStyle.style || currentCustomStyle.url,\n ...mapLibreViewpros(config),\n },\n attribution: currentCustomStyle.customAttribution,\n };\n }\n }\n\n if (CARTO_MAP_STYLES.includes(styleType)) {\n const {visibleLayerGroups} = mapStyle;\n const styleUrl = getStyleUrl(styleType);\n let style = styleUrl;\n let rawStyle = styleUrl;\n if (\n applyLayerFilters &&\n visibleLayerGroups &&\n someLayerGroupsDisabled(visibleLayerGroups)\n ) {\n rawStyle = await fetchStyle({styleUrl, errorContext});\n style = applyLayerGroupFilters(rawStyle, visibleLayerGroups);\n }\n return {\n type: 'maplibre',\n props: {\n style,\n ...mapLibreViewpros(config),\n },\n visibleLayerGroups,\n rawStyle,\n };\n }\n const googleBasemapDef = GOOGLE_BASEMAPS[styleType];\n if (googleBasemapDef) {\n const {mapState} = config;\n return {\n type: 'google-maps',\n props: {\n ...googleBasemapDef,\n center: {lat: mapState.latitude, lng: mapState.longitude},\n zoom: mapState.zoom + 1,\n tilt: mapState.pitch,\n heading: mapState.bearing,\n },\n };\n }\n return {\n type: 'maplibre',\n props: {\n style: getStyleUrl(DEFAULT_CARTO_STYLE),\n ...mapLibreViewpros(config),\n },\n };\n}\n","import type {Dataset} from './types.js';\nimport {SpatialIndex, SpatialIndexColumn} from '../constants.js';\nimport type {\n QuerySourceOptions,\n TableSourceOptions,\n TilejsonResult,\n TileResolution,\n} from '../sources/types.js';\nimport {\n DEFAULT_AGGREGATION_EXP,\n DEFAULT_AGGREGATION_RES_LEVEL_H3,\n DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN,\n DEFAULT_TILE_RESOLUTION,\n REDUCED_QUERIES_TILE_RESOLUTION,\n} from '../constants-internal.js';\nimport {\n h3QuerySource,\n type H3QuerySourceOptions,\n h3TableSource,\n type H3TableSourceOptions,\n quadbinQuerySource,\n type QuadbinQuerySourceOptions,\n quadbinTableSource,\n type QuadbinTableSourceOptions,\n rasterSource,\n vectorQuerySource,\n type VectorQuerySourceOptions,\n vectorTableSource,\n type VectorTableSourceOptions,\n vectorTilesetSource,\n type VectorTilesetSourceOptions,\n} from '../sources/index.js';\nimport type {Filter} from '../types.js';\n\ntype FetchDatasetOptions = {\n accessToken: string;\n apiBaseUrl: string;\n connection: string;\n headers?: Record<string, string>;\n localCache?: {\n cacheControl: 'no-cache'[];\n };\n maxLengthURL?: number;\n};\n\ntype FetchDataset = {\n dataset: Dataset;\n filters?: Filter;\n options: FetchDatasetOptions;\n};\n\n// Copy of getCartoSource from cloud-native:\n// https://github.com/CartoDB/cloud-native/blob/main/workspace-www/src/features/common/utils/cartoDeckGL.ts#L79\nexport function configureSource({\n dataset,\n filters,\n options,\n}: FetchDataset): Promise<TilejsonResult> {\n const {\n geoColumn,\n columns,\n type,\n source,\n queryParameters,\n aggregationExp,\n aggregationResLevel: originalAggregationResLevel,\n } = dataset;\n const sourceOptions = getSourceOptions(options);\n const spatialDataColumn = getColumnNameFromGeoColumn(geoColumn) || undefined;\n const spatialIndex = geoColumn\n ? getSpatialIndexFromGeoColumn(geoColumn)\n : undefined;\n const tileResolution = getDynamicTileResolution(spatialIndex);\n const isH3 = spatialIndex === SpatialIndex.H3;\n const isQuadbin = spatialIndex === SpatialIndex.QUADBIN;\n let aggregationResLevel = originalAggregationResLevel;\n\n if (typeof originalAggregationResLevel !== 'number' && isH3) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_H3;\n } else if (typeof originalAggregationResLevel !== 'number' && isQuadbin) {\n aggregationResLevel = DEFAULT_AGGREGATION_RES_LEVEL_QUADBIN;\n }\n\n const spatialIndexOptions = {\n aggregationExp: !aggregationExp ? DEFAULT_AGGREGATION_EXP : aggregationExp,\n aggregationResLevel: scaleAggregationResLevel(\n aggregationResLevel,\n tileResolution\n ),\n spatialDataColumn,\n ...(filters && {filters}),\n } as H3QuerySourceOptions;\n const tilesetOptions = {\n ...sourceOptions,\n tableName: source,\n } as VectorTilesetSourceOptions;\n const tableOptions = {\n ...sourceOptions,\n tableName: source,\n tileResolution,\n } as TableSourceOptions;\n const queryOptions = {\n ...sourceOptions,\n sqlQuery: source,\n tileResolution,\n ...(queryParameters && {queryParameters}),\n } as QuerySourceOptions;\n const vectorOptions = {\n spatialDataColumn,\n ...(columns && {columns}),\n ...(filters && {filters}),\n ...(aggregationExp && {aggregationExp}),\n } as VectorTableSourceOptions;\n\n if (type === 'raster') {\n return rasterSource({\n ...sourceOptions,\n tableName: source,\n ...(filters && {filters: filters as any}),\n });\n }\n if (type === 'tileset') {\n return vectorTilesetSource({...tilesetOptions});\n }\n\n if (type === 'table') {\n if (isH3) {\n return h3TableSource({\n ...(tableOptions as H3TableSourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinTableSource({\n ...(tableOptions as QuadbinTableSourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorTableSource({\n ...(tableOptions as VectorTableSourceOptions),\n ...vectorOptions,\n });\n }\n }\n\n if (type === 'query') {\n if (isH3) {\n return h3QuerySource({\n ...(queryOptions as H3QuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else if (isQuadbin) {\n return quadbinQuerySource({\n ...(queryOptions as QuadbinQuerySourceOptions),\n ...spatialIndexOptions,\n });\n } else {\n return vectorQuerySource({\n ...(queryOptions as VectorQuerySourceOptions),\n ...vectorOptions,\n });\n }\n }\n throw new Error(`Invalid source type: ${type}`);\n}\n\nfunction getSourceOptions({\n accessToken,\n apiBaseUrl,\n connection,\n headers,\n maxLengthURL,\n}: FetchDatasetOptions) {\n return {\n accessToken,\n connectionName: connection,\n apiBaseUrl,\n headers,\n maxLengthURL,\n ...(headers?.['Cache-Control']?.includes('no-cache') && {\n localCache: {\n cacheControl: ['no-cache'] as 'no-cache'[],\n },\n }),\n };\n}\n\n/**\n * Returns default tile resolution for dynamic tilesets, based on layer configuration\n * Result is not applicable for static tilesets, for which tile resolution is defined\n * by tilejson.\n */\nfunction getDynamicTileResolution(\n spatialIndex?: SpatialIndex | null\n): TileResolution {\n // TODO: Support increased tile size and resolution for dynamic H3 spatial indexes.\n if (spatialIndex !== SpatialIndex.H3) {\n return REDUCED_QUERIES_TILE_RESOLUTION;\n }\n\n return DEFAULT_TILE_RESOLUTION;\n}\n\n/**\n * @internal\n * State of `aggregationResLevel` in the UI and backend config is based on an assumption of\n * 512x512px tiles. Because we may change tile resolution for performance goals, the\n * `aggregationResLevel` passed to the deck.gl layer must be scaled with tile resolution.\n */\nexport function scaleAggregationResLevel(\n aggregationResLevel: number,\n tileResolution: number\n): number | undefined {\n if (typeof aggregationResLevel !== 'number') return;\n return aggregationResLevel - Math.log2(0.5 / tileResolution);\n}\n\n/**\n * @internal\n */\nexport function getColumnNameFromGeoColumn(\n geoColumn: string | null | undefined\n) {\n if (!geoColumn) {\n return geoColumn;\n }\n const parts = geoColumn.split(':');\n return parts.length === 1 ? parts[0] : parts.length === 2 ? parts[1] : null;\n}\n\n/**\n * @internal\n */\nexport function getSpatialIndexFromGeoColumn(geoColumn: string) {\n const spatialIndexToSearch = geoColumn.split(':')[0];\n\n for (const index of Object.values(SpatialIndex)) {\n if (SpatialIndexColumn[index].includes(spatialIndexToSearch)) {\n return index;\n }\n }\n return null;\n}\n","import {DEFAULT_API_BASE_URL} from '../constants.js';\n\nimport {\n type APIErrorContext,\n CartoAPIError,\n buildPublicMapUrl,\n buildStatsUrl,\n requestWithParameters,\n} from '../api/index.js';\n\nimport {type ParseMapResult, parseMap} from './parse-map.js';\nimport {assert} from '../utils.js';\nimport type {Basemap, Dataset, KeplerMapConfig} from './types.js';\nimport {fetchBasemapProps} from './basemap.js';\nimport {configureSource} from './source.js';\nimport type {Filters} from '../types.js';\nimport {isRemoteCalculationSupported} from './utils.js';\n\n/* global clearInterval, setInterval, URL */\nasync function _fetchMapDataset(\n dataset: Dataset,\n filters: Filters,\n context: _FetchMapContext\n) {\n const {connectionName} = dataset;\n const cache: {value?: number} = {};\n const configuredSource = configureSource({\n dataset,\n filters: isRemoteCalculationSupported(dataset) ? filters : undefined,\n options: {\n ...context,\n connection: connectionName,\n headers: context.headers,\n accessToken: context.accessToken!,\n apiBaseUrl: context.apiBaseUrl,\n maxLengthURL: context.maxLengthURL,\n },\n });\n dataset.data = await configuredSource;\n\n let cacheChanged = true;\n if (cache.value) {\n cacheChanged = dataset.cache !== cache.value;\n dataset.cache = cache.value;\n }\n\n return cacheChanged;\n}\n\nasync function _fetchTilestats(\n attribute: string,\n dataset: Dataset,\n context: _FetchMapContext\n) {\n const {connectionName, data, id, source, type, queryParameters} = dataset;\n const {apiBaseUrl} = context;\n const errorContext: APIErrorContext = {\n requestType: 'Tile stats',\n connection: connectionName,\n type,\n source,\n };\n if (!('tilestats' in data)) {\n throw new CartoAPIError(\n new Error(`Invalid dataset for tilestats: ${id}`),\n errorContext\n );\n }\n\n const baseUrl = buildStatsUrl({attribute, apiBaseUrl, ...dataset});\n const client = new URLSearchParams(data.tiles[0]).get('client');\n const headers = {Authorization: `Bearer ${context.accessToken}`};\n const parameters: Record<string, unknown> = {};\n if (client) {\n parameters.client = client;\n }\n if (type === 'query') {\n parameters.q = source;\n if (queryParameters) {\n parameters.queryParameters = queryParameters;\n }\n }\n const stats = await requestWithParameters({\n baseUrl,\n headers,\n parameters,\n errorContext,\n maxLengthURL: context.maxLengthURL,\n });\n\n // Replace tilestats for attribute with value from API\n const {attributes} = data.tilestats.layers[0];\n const index = attributes.findIndex((d) => d.attribute === attribute);\n attributes[index] = stats;\n return true;\n}\n\nasync function fillInMapDatasets(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const {filters} = keplerMapConfig.config as KeplerMapConfig;\n const promises = datasets.map((dataset) =>\n _fetchMapDataset(dataset, filters[dataset.id], context)\n );\n return await Promise.all(promises);\n}\n\nasync function fillInTileStats(\n {datasets, keplerMapConfig}: {datasets: Dataset[]; keplerMapConfig: any},\n context: _FetchMapContext\n) {\n const attributes: {attribute: string; dataset: any}[] = [];\n const {layers} = keplerMapConfig.config.visState;\n for (const layer of layers) {\n for (const channel of Object.keys(layer.visualChannels)) {\n const attribute = layer.visualChannels[channel]?.name;\n if (attribute) {\n const dataset = datasets.find((d) => d.id === layer.config.dataId);\n if (dataset && dataset.type !== 'tileset' && dataset.data.tilestats) {\n // Only fetch stats for QUERY & TABLE map types\n attributes.push({attribute, dataset});\n }\n }\n }\n }\n // Remove duplicates to avoid repeated requests\n const filteredAttributes: {attribute: string; dataset: any}[] = [];\n for (const a of attributes) {\n if (\n !filteredAttributes.find(\n ({attribute, dataset}) =>\n attribute === a.attribute && dataset === a.dataset\n )\n ) {\n filteredAttributes.push(a);\n }\n }\n\n const promises = filteredAttributes.map(({attribute, dataset}) =>\n _fetchTilestats(attribute, dataset, context)\n );\n return await Promise.all(promises);\n}\n\nexport type FetchMapOptions = {\n /**\n * CARTO platform access token. Only required for private maps.\n */\n accessToken?: string;\n\n /**\n * Base URL of the CARTO Maps API.\n *\n * Example for account located in EU-west region: `https://gcp-eu-west1.api.carto.com`\n *\n * @default https://gcp-us-east1.api.carto.com\n */\n apiBaseUrl?: string;\n\n /**\n * Identifier of map created in CARTO Builder.\n */\n cartoMapId: string;\n clientId?: string;\n\n /**\n * Custom HTTP headers added to map instantiation and data requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Interval in seconds at which to autoRefresh the data. If provided, `onNewData` must also be provided.\n */\n autoRefresh?: number;\n\n /**\n * Callback function that will be invoked whenever data in layers is changed. If provided, `autoRefresh` must also be provided.\n */\n onNewData?: (map: any) => void;\n\n /**\n * Maximum URL character length. Above this limit, requests use POST.\n * Used to avoid browser and CDN limits.\n * @default {@link DEFAULT_MAX_LENGTH_URL}\n */\n maxLengthURL?: number;\n};\n\n/**\n * Context reused while fetching and updating a map with fetchMap().\n */\ntype _FetchMapContext = {apiBaseUrl: string} & Pick<\n FetchMapOptions,\n 'accessToken' | 'clientId' | 'headers' | 'maxLengthURL'\n>;\n\nexport type FetchMapResult = ParseMapResult & {\n /**\n * Basemap properties.\n */\n basemap: Basemap | null;\n stopAutoRefresh?: () => void;\n};\n\nexport async function fetchMap({\n accessToken,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n cartoMapId,\n clientId,\n headers,\n autoRefresh,\n onNewData,\n maxLengthURL,\n}: FetchMapOptions): Promise<FetchMapResult> {\n assert(\n cartoMapId,\n 'Must define CARTO map id: fetchMap({cartoMapId: \"XXXX-XXXX-XXXX\"})'\n );\n\n if (accessToken) {\n headers = {Authorization: `Bearer ${accessToken}`, ...headers};\n }\n\n if (autoRefresh || onNewData) {\n assert(onNewData, 'Must define `onNewData` when using autoRefresh');\n assert(typeof onNewData === 'function', '`onNewData` must be a function');\n assert(\n typeof autoRefresh === 'number' && autoRefresh > 0,\n '`autoRefresh` must be a positive number'\n );\n }\n\n const baseUrl = buildPublicMapUrl({apiBaseUrl, cartoMapId});\n const errorContext: APIErrorContext = {\n requestType: 'Public map',\n mapId: cartoMapId,\n };\n const map = await requestWithParameters({\n baseUrl,\n headers,\n errorContext,\n maxLengthURL,\n });\n const context: _FetchMapContext = {\n accessToken: map.token || accessToken,\n apiBaseUrl,\n clientId,\n headers,\n maxLengthURL,\n };\n\n // Periodically check if the data has changed. Note that this\n // will not update when a map is published.\n let stopAutoRefresh: (() => void) | undefined;\n if (autoRefresh) {\n const intervalId = setInterval(async () => {\n const changed = await fillInMapDatasets(map, {\n ...context,\n headers: {\n ...headers,\n 'If-Modified-Since': new Date().toUTCString(),\n },\n });\n if (onNewData && changed.some((v) => v === true)) {\n onNewData(parseMap(map));\n }\n }, autoRefresh * 1000);\n stopAutoRefresh = () => {\n clearInterval(intervalId);\n };\n }\n\n const geojsonLayers = map.keplerMapConfig.config.visState.layers.filter(\n ({type}: {type: string}) => type === 'geojson' || type === 'point'\n );\n const geojsonDatasetIds = geojsonLayers.map(\n ({config}: {config: any}) => config.dataId\n );\n map.datasets.forEach((dataset: any) => {\n if (geojsonDatasetIds.includes(dataset.id)) {\n const {config} = geojsonLayers.find(\n ({config}: {config: any}) => config.dataId === dataset.id\n );\n dataset.format = 'geojson';\n // Support for very old maps. geoColumn was not stored in the past\n if (!dataset.geoColumn && config.columns.geojson) {\n dataset.geoColumn = config.columns.geojson;\n }\n }\n });\n\n const [basemap] = await Promise.all([\n fetchBasemapProps({config: map.keplerMapConfig.config, errorContext}),\n\n // Mutates map.datasets so that dataset.data contains data\n fillInMapDatasets(map, context),\n ]);\n\n // Mutates attributes in visualChannels to contain tile stats\n await fillInTileStats(map, context);\n\n const out = {...parseMap(map), basemap, ...{stopAutoRefresh}};\n\n const textLayers = out.layers.filter((layer: any) => {\n const pointType = layer.props?.pointType || '';\n return pointType.includes('text');\n });\n\n /* global FontFace, window, document */\n if (\n textLayers.length &&\n window.FontFace &&\n !document.fonts.check('12px Inter')\n ) {\n // Fetch font needed for labels\n const font = new FontFace(\n 'Inter',\n 'url(https://fonts.gstatic.com/s/inter/v12/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7W0Q5nw.woff2)'\n );\n await font.load().then((f) => document.fonts.add(f));\n }\n\n return out as FetchMapResult;\n}\n","import * as polyclip from \"polyclip-ts\";\nimport { multiPolygon, polygon } from \"@turf/helpers\";\nimport { geomEach } from \"@turf/meta\";\nimport {\n FeatureCollection,\n Feature,\n Polygon,\n MultiPolygon,\n GeoJsonProperties,\n} from \"geojson\";\n\n/**\n * Takes a collection of input polygons and returns a combined polygon. If the\n * input polygons are not contiguous, this function returns a multi-polygon\n * feature.\n *\n * @function\n * @param {FeatureCollection<Polygon|MultiPolygon>} features input polygon features\n * @param {Object} [options={}] Optional Parameters\n * @param {GeoJsonProperties} [options.properties={}] properties to assign to output feature\n * @returns {Feature<(Polygon|MultiPolygon)>|null} a combined polygon or multi-polygon feature, or null if there were no input polygons to combine\n * @example\n *\n * const poly1 = turf.polygon(\n * [\n * [\n * [-82.574787, 35.594087],\n * [-82.574787, 35.615581],\n * [-82.545261, 35.615581],\n * [-82.545261, 35.594087],\n * [-82.574787, 35.594087],\n * ],\n * ],\n * { fill: \"#0f0\" }\n * );\n *\n * const poly2 = turf.polygon(\n * [\n * [\n * [-82.560024, 35.585153],\n * [-82.560024, 35.602602],\n * [-82.52964, 35.602602],\n * [-82.52964, 35.585153],\n * [-82.560024, 35.585153],\n * ],\n * ],\n * );\n *\n * const union = turf.union(turf.featureCollection([poly1, poly2]));\n *\n * //addToMap\n * const addToMap = { poly1, poly2, union };\n *\n * poly1.properties.fill = \"#0f0\";\n * poly2.properties.fill = \"#00f\";\n * union.properties.stroke = \"red\";\n * union.properties[\"stroke-width\"] = 4;\n * union.properties.fill = \"transparent\";\n */\nfunction union<P extends GeoJsonProperties = GeoJsonProperties>(\n features: FeatureCollection<Polygon | MultiPolygon>,\n options: { properties?: P } = {}\n): Feature<Polygon | MultiPolygon, P> | null {\n const geoms: polyclip.Geom[] = [];\n geomEach(features, (geom) => {\n geoms.push(geom.coordinates as polyclip.Geom);\n });\n\n if (geoms.length < 2) {\n throw new Error(\"Must have at least 2 geometries\");\n }\n\n const unioned = polyclip.union(geoms[0], ...geoms.slice(1));\n if (unioned.length === 0) return null;\n if (unioned.length === 1) return polygon(unioned[0], options.properties);\n else return multiPolygon(unioned, options.properties);\n}\n\nexport { union };\nexport default union;\n","import bboxClip from '@turf/bbox-clip';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport union from '@turf/union';\nimport {getType} from '@turf/invariant';\nimport {polygon, multiPolygon, feature, featureCollection} from '@turf/helpers';\nimport type {BBox, Geometry, MultiPolygon, Polygon, Position} from 'geojson';\nimport type {SpatialFilter} from './types.js';\n\n/**\n * Returns a {@link SpatialFilter} for a given viewport, typically obtained\n * from deck.gl's `viewport.getBounds()` method ([west, south, east, north]).\n * If the viewport covers the entire world (to some margin of error in Web\n * Mercator space), `undefined` is returned instead.\n *\n * If the viewport extends beyond longitude range [-180, +180], the polygon\n * may be reformatted for compatibility with CARTO APIs.\n */\nexport function createViewportSpatialFilter(\n viewport: BBox\n): SpatialFilter | undefined {\n if (_isGlobalViewport(viewport)) {\n return;\n }\n return createPolygonSpatialFilter(bboxPolygon(viewport).geometry);\n}\n\n/**\n * Returns a {@link SpatialFilter} for a given {@link Polygon} or\n * {@link MultiPolygon}. If the polygon(s) extend outside longitude\n * range [-180, +180], the result may be reformatted for compatibility\n * with CARTO APIs.\n */\nexport function createPolygonSpatialFilter(\n spatialFilter: Polygon | MultiPolygon\n): SpatialFilter | undefined {\n return (spatialFilter && _normalizeGeometry(spatialFilter)) || undefined;\n}\n\n/**\n * Check if a viewport is large enough to represent a global coverage.\n * In this case the spatial filter parameter for widget calculation is removed.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _isGlobalViewport(viewport: BBox) {\n const [minx, miny, maxx, maxy] = viewport;\n return maxx - minx > 179.5 * 2 && maxy - miny > 85.05 * 2;\n}\n\n/**\n * Normalized a geometry, coming from a mask or a viewport. The parts\n * spanning outside longitude range [-180, +180] are clipped and \"folded\"\n * back to the valid range and unioned to the polygons inide that range.\n *\n * It results in a Polygon or MultiPolygon strictly inside the validity range.\n *\n * @privateRemarks Source: @carto/react-core\n */\nfunction _normalizeGeometry(\n geometry: Polygon | MultiPolygon\n): Polygon | MultiPolygon | null {\n const WORLD = [-180, -90, +180, +90] as BBox;\n const worldClip = _clean(\n bboxClip(geometry, WORLD).geometry as Polygon | MultiPolygon\n );\n\n const geometryTxWest = _tx(geometry, 360);\n const geometryTxEast = _tx(geometry, -360);\n\n let result: Polygon | MultiPolygon | null = worldClip;\n\n if (result && geometryTxWest) {\n const worldWestClip = _clean(\n bboxClip(geometryTxWest, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldWestClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldWestClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n if (result && geometryTxEast) {\n const worldEastClip = _clean(\n bboxClip(geometryTxEast, WORLD).geometry as Polygon | MultiPolygon\n );\n if (worldEastClip) {\n const collection = featureCollection([\n feature(result),\n feature(worldEastClip),\n ]);\n const merged = union(collection);\n result = merged ? _clean(merged.geometry) : result;\n }\n }\n\n return result;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanPolygonCoords(cc: Position[][]) {\n const coords = cc.filter((c) => c.length > 0);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _cleanMultiPolygonCoords(ccc: Position[][][]) {\n const coords = ccc.map(_cleanPolygonCoords).filter((cc) => cc);\n return coords.length > 0 ? coords : null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _clean(\n geometry: Polygon | MultiPolygon | null\n): Polygon | MultiPolygon | null {\n if (!geometry) {\n return null;\n }\n\n if (_isPolygon(geometry)) {\n const coords = _cleanPolygonCoords(geometry.coordinates);\n return coords ? polygon(coords).geometry : null;\n }\n\n if (_isMultiPolygon(geometry)) {\n const coords = _cleanMultiPolygonCoords(geometry.coordinates);\n return coords ? multiPolygon(coords as Position[][][]).geometry : null;\n }\n\n return null;\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txContourCoords(cc: Position[], distance: number) {\n return cc.map((c) => [c[0] + distance, c[1]]);\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txPolygonCoords(ccc: Position[][], distance: number) {\n return ccc.map((cc) => _txContourCoords(cc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _txMultiPolygonCoords(cccc: Position[][][], distance: number) {\n return cccc.map((ccc) => _txPolygonCoords(ccc, distance));\n}\n\n/** @privateRemarks Source: @carto/react-core */\nfunction _tx(geometry: Polygon | MultiPolygon, distance: number) {\n if (geometry && getType(geometry) === 'Polygon') {\n const coords = _txPolygonCoords(\n (geometry as Polygon).coordinates,\n distance\n );\n return polygon(coords).geometry;\n } else if (geometry && getType(geometry) === 'MultiPolygon') {\n const coords = _txMultiPolygonCoords(\n (geometry as MultiPolygon).coordinates,\n distance\n );\n return multiPolygon(coords).geometry;\n } else {\n return null;\n }\n}\n\nfunction _isPolygon(geometry: Geometry): geometry is Polygon {\n return getType(geometry) === 'Polygon';\n}\n\nfunction _isMultiPolygon(geometry: Geometry): geometry is MultiPolygon {\n return getType(geometry) === 'MultiPolygon';\n}\n","// Default tile display size in deck.gl, in viewport pixels. May differ\n// from size or resolution assumed when generating the tile data,\nconst DEFAULT_TILE_SIZE = 512;\n\n// Relative scale factor (0 = no biasing, 2 = a few hexagons cover view)\nconst BIAS = 2;\n\n/**\n * Resolution conversion function. Takes a WebMercatorViewport and returns\n * a H3 resolution such that the screen space size of the hexagons is\n * \"similar\" to the given tileSize on screen. Intended for use with deck.gl.\n * @internal\n * @privateRemarks Source: https://github.com/visgl/deck.gl/blob/master/modules/carto/src/layers/h3-tileset-2d.ts\n */\nexport function _getHexagonResolution(\n viewport: {zoom: number; latitude: number},\n tileSize: number\n): number {\n // Difference in given tile size compared to deck's internal 512px tile size,\n // expressed as an offset to the viewport zoom.\n const zoomOffset = Math.log2(tileSize / DEFAULT_TILE_SIZE);\n const hexagonScaleFactor = (2 / 3) * (viewport.zoom - zoomOffset);\n const latitudeScaleFactor = Math.log(\n 1 / Math.cos((Math.PI * viewport.latitude) / 180)\n );\n\n // Clip and bias\n return Math.max(\n 0,\n Math.floor(hexagonScaleFactor + latitudeScaleFactor - BIAS)\n );\n}\n","/** Flags 'empty' values in a Uint32Array index. */\nconst EMPTY_U32 = 2 ** 32 - 1;\n\n/**\n * Custom Set-like interface optimized for BigUint64 cell IDs. Unlike Set,\n * limited in most JavaScript runtimes to ~16M entries, this implementation\n * can support up to `n = 2^32 - 1` (4 billion) entries, with lookups in\n * amortized O(1) time.\n */\nexport class CellSet {\n /** List of cells stored by the set. Stored by reference, without copying. */\n private cells: bigint[];\n\n /** DataView representing a single cell ID. Pre-allocated to reduce memory during queries. */\n private cellView = new DataView(new ArrayBuffer(8));\n\n /** Hash table, mapping a hash index (computed) to an index in the 'cells' array. */\n private hashTable: Uint32Array;\n\n constructor(cells: bigint[]) {\n this.cells = cells;\n\n // Pre-allocate hash table for queries.\n this.hashTable = new Uint32Array(hashBuckets(cells.length)).fill(EMPTY_U32);\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n this.hashTable[this.hashLookup(cells[cellIndex])] = cellIndex;\n }\n }\n\n has(cell: bigint): boolean {\n const hashIndex = this.hashLookup(cell);\n return this.hashTable[hashIndex] !== EMPTY_U32;\n }\n\n private hashLookup(cell: bigint): number {\n // Hash implementation operates on 32-bit chunks, so write the cell ID\n // into a pre-allocated DataView for easier iteration.\n this.cellView.setBigUint64(0, cell);\n const hashval = hash(this.cellView);\n const hashmod = this.hashTable.length - 1;\n let bucket = hashval & hashmod;\n\n // Find the first bucket in the hash table where either (a) no cell\n // is yet stored, or (b) the stored cell and the query cell are equal.\n for (let probe = 0; probe <= hashmod; probe++) {\n const cellIndex = this.hashTable[bucket];\n\n if (cellIndex === EMPTY_U32 || cell === this.cells[cellIndex]) {\n return bucket;\n }\n\n bucket = (bucket + probe + 1) & hashmod; // Hash collision; quadratic probing.\n }\n\n throw new Error('Hash table full.'); // Unreachable.\n }\n}\n\n/**\n * MurmurHash2\n *\n * References:\n * - https://github.com/mikolalysenko/murmurhash-js/blob/f19136e9f9c17f8cddc216ca3d44ec7c5c502f60/murmurhash2_gc.js#L14\n * - https://github.com/zeux/meshoptimizer/blob/e47e1be6d3d9513153188216455bdbed40a206ef/src/indexgenerator.cpp#L12\n */\nfunction hash(view: DataView, h = 0): number {\n const m = 0x5bd1e995;\n const r = 24;\n\n for (let i = 0, il = view.byteLength / 4; i < il; i++) {\n let k = view.getUint32(i * 4);\n\n k = Math.imul(k, m) >>> 0;\n k = (k ^ (k >> r)) >>> 0;\n k = Math.imul(k, m) >>> 0;\n\n h = Math.imul(h, m) >>> 0;\n h = (h ^ k) >>> 0;\n }\n\n return h;\n}\n\nfunction hashBuckets(initialCount: number) {\n let buckets = 1;\n while (buckets < initialCount + initialCount / 4) {\n buckets *= 2;\n }\n return buckets;\n}\n"],"mappings":"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","names":["identity","v","FilterType","ApiVersion","TileFormat","SpatialIndex","Provider","stringRegExp","feature","u3","u","bc","ca","ab","u","abt","bct","cat","_8","_16","fin","fin2","ab","bc","_8","_8b","_16","_48","fin","polygon","u2","point","polygon","bbox","compare","featureId","ringId","eventId","intersection","sweeplineIntersections","intersection","featureId","bbox","lineString","polygon","feature","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","RADIANS_TO_DEGREES","DEGREES_TO_RADIANS","bbox","multiLineString","lineString","polygon","multiPolygon","bbox","isPointOnLineSegment","epsilon","isLineOnLine","isLineInPoly","isPolyInPoly","point","compareCoords","lineString","polygon","clone","BigNumber","v","sum","compare","format","min","max","compare","compare","v","u","set","node","v","eps","bbox","point","Segment","pt","nextPt","SplayTreeSet","evt","BigNumber","intersection","intersection","TRANSFORM_FN","transformPoint","transformMultiPoint","transformLineString","transformMultiLineString","transformPolygon","transformMultiPolygon","bbox","getPoints","multiLineString","lineString","polygon","multiPolygon","bbox","intersect","feature","intersection","bbox","featureId","intersection","getResolution","getResolution","intersection","SchemaFieldType","assert","isObject","field","assert","v","feature","assert","FILTER_TYPES","operation","assert","sum","feature","operation","v","min","max","operation","group","operation","operation","feature","feature","_GeojsonEquality","_a","_b","isObject","equals","isPointOnLineSegment","point","precision","operation","assert","bbox","RasterBandColorinterp","ErrorCode","length","node","min","max","key","values","keyof","group","f","compare","key","min","max","scale","u","min","max","identity","v","config","min","data","scale","rgb","color","max","min","max","UNKNOWN_COLOR","v","length","hexToRGB","config","defaultProps","assert","color","config","client","assert","v","config","union","cc"]}