@loaders.gl/i3s 4.0.0-alpha.15 → 4.0.0-alpha.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.min.js +278 -197
- package/dist/es5/arcgis-webscene-loader.js +1 -1
- package/dist/es5/i3s-attribute-loader.js +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
- package/dist/es5/i3s-content-loader.js +1 -1
- package/dist/es5/i3s-loader.js +1 -1
- package/dist/es5/i3s-node-page-loader.js +1 -1
- package/dist/es5/i3s-slpk-loader.js +1 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/constants.js +14 -15
- package/dist/es5/lib/parsers/constants.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +93 -29
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +51 -30
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +61 -42
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js +100 -0
- package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js.map +1 -0
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js +1 -1
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js.map +1 -0
- package/dist/es5/types.js +1 -14
- package/dist/es5/types.js.map +1 -1
- package/dist/esm/arcgis-webscene-loader.js +1 -1
- package/dist/esm/i3s-attribute-loader.js +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
- package/dist/esm/i3s-content-loader.js +1 -1
- package/dist/esm/i3s-loader.js +1 -1
- package/dist/esm/i3s-node-page-loader.js +1 -1
- package/dist/esm/i3s-slpk-loader.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/constants.js +14 -15
- package/dist/esm/lib/parsers/constants.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +49 -16
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +35 -18
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +14 -8
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js +33 -0
- package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js.map +1 -0
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js +1 -1
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js.map +1 -0
- package/dist/esm/types.js +0 -12
- package/dist/esm/types.js.map +1 -1
- package/dist/i3s-content-worker-node.js +47 -47
- package/dist/i3s-content-worker-node.js.map +2 -2
- package/dist/i3s-content-worker.js +22 -34
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/parsers/constants.d.ts.map +1 -1
- package/dist/lib/parsers/constants.js +14 -15
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +2 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.js +61 -15
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +21 -10
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/slpk-archieve.js +53 -24
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +5 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.js +15 -9
- package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts +18 -0
- package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts.map +1 -0
- package/dist/lib/parsers/parse-zip/end-of-central-directory.js +41 -0
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts +1 -1
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/local-file-header.js +1 -1
- package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts.map +1 -0
- package/dist/types.d.ts +17 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -13
- package/package.json +9 -9
- package/src/index.ts +0 -1
- package/src/lib/parsers/constants.ts +14 -15
- package/src/lib/parsers/parse-slpk/parse-slpk.ts +79 -25
- package/src/lib/parsers/parse-slpk/slpk-archieve.ts +55 -37
- package/src/lib/parsers/parse-zip/cd-file-header.ts +27 -9
- package/src/lib/parsers/parse-zip/end-of-central-directory.ts +78 -0
- package/src/lib/parsers/parse-zip/local-file-header.ts +2 -2
- package/src/types.ts +25 -40
- package/dist/es5/lib/parsers/parse-slpk/search-from-the-end.js.map +0 -1
- package/dist/esm/lib/parsers/parse-slpk/search-from-the-end.js.map +0 -1
- package/dist/lib/parsers/parse-slpk/search-from-the-end.d.ts.map +0 -1
- /package/dist/es5/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.js +0 -0
- /package/dist/esm/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.js +0 -0
- /package/dist/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.d.ts +0 -0
- /package/dist/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.js +0 -0
- /package/src/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.ts +0 -0
|
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.I3SNodePageLoader = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
-
var VERSION = typeof "4.0.0-alpha.
|
|
10
|
+
var VERSION = typeof "4.0.0-alpha.16" !== 'undefined' ? "4.0.0-alpha.16" : 'latest';
|
|
11
11
|
function parseNodePage(_x, _x2) {
|
|
12
12
|
return _parseNodePage.apply(this, arguments);
|
|
13
13
|
}
|
|
@@ -9,7 +9,7 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
|
|
|
9
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
10
|
var _parseSlpk = require("./lib/parsers/parse-slpk/parse-slpk");
|
|
11
11
|
var _dataViewFileProvider = require("./lib/parsers/parse-zip/data-view-file-provider");
|
|
12
|
-
var VERSION = typeof "4.0.0-alpha.
|
|
12
|
+
var VERSION = typeof "4.0.0-alpha.16" !== 'undefined' ? "4.0.0-alpha.16" : 'latest';
|
|
13
13
|
var SLPKLoader = {
|
|
14
14
|
name: 'I3S SLPK (Scene Layer Package)',
|
|
15
15
|
id: 'slpk',
|
package/dist/es5/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_constants","require","_i3sLoader","_i3sSlpkLoader","_i3sContentLoader","_i3sAttributeLoader","_i3sBuildingSceneLayerLoader","_i3sNodePageLoader","_arcgisWebsceneLoader","_localFileHeader","_parseSlpk"],"sources":["../../src/index.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nexport type {\n BoundingVolumes,\n Mbs,\n Obb,\n SceneLayer3D,\n AttributeStorageInfo,\n Field,\n ESRIField,\n PopupInfo,\n Node3DIndexDocument,\n LodSelection,\n NodeReference,\n Resource,\n MaxScreenThresholdSQ,\n NodeInPage,\n SharedResources,\n Attribute,\n Extent,\n FeatureAttribute,\n FieldInfo,\n I3SMaterialDefinition,\n TextureDefinitionInfo,\n MaterialDefinitionInfo,\n FullExtent,\n StatisticsInfo,\n StatsInfo,\n Histogram,\n ValueCount,\n BuildingSceneSublayer,\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["_constants","require","_i3sLoader","_i3sSlpkLoader","_i3sContentLoader","_i3sAttributeLoader","_i3sBuildingSceneLayerLoader","_i3sNodePageLoader","_arcgisWebsceneLoader","_localFileHeader","_parseSlpk"],"sources":["../../src/index.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nexport type {\n BoundingVolumes,\n Mbs,\n Obb,\n SceneLayer3D,\n AttributeStorageInfo,\n Field,\n ESRIField,\n PopupInfo,\n Node3DIndexDocument,\n LodSelection,\n NodeReference,\n Resource,\n MaxScreenThresholdSQ,\n NodeInPage,\n SharedResources,\n Attribute,\n Extent,\n FeatureAttribute,\n FieldInfo,\n I3SMaterialDefinition,\n TextureDefinitionInfo,\n MaterialDefinitionInfo,\n FullExtent,\n StatisticsInfo,\n StatsInfo,\n Histogram,\n ValueCount,\n BuildingSceneSublayer,\n OperationalLayer,\n TextureSetDefinitionFormats\n} from './types';\nexport type {FileProvider} from './lib/parsers/parse-zip/file-provider';\n\nexport {COORDINATE_SYSTEM} from './lib/parsers/constants';\n\nexport {I3SLoader} from './i3s-loader';\nexport {SLPKLoader} from './i3s-slpk-loader';\nexport {I3SContentLoader} from './i3s-content-loader';\nexport {I3SAttributeLoader, loadFeatureAttributes} from './i3s-attribute-loader';\nexport {I3SBuildingSceneLayerLoader} from './i3s-building-scene-layer-loader';\nexport {I3SNodePageLoader} from './i3s-node-page-loader';\nexport {ArcGisWebSceneLoader} from './arcgis-webscene-loader';\nexport {parseZipLocalFileHeader} from './lib/parsers/parse-zip/local-file-header';\nexport {parseSLPK} from './lib/parsers/parse-slpk/parse-slpk';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AACA,IAAAI,mBAAA,GAAAJ,OAAA;AACA,IAAAK,4BAAA,GAAAL,OAAA;AACA,IAAAM,kBAAA,GAAAN,OAAA;AACA,IAAAO,qBAAA,GAAAP,OAAA;AACA,IAAAQ,gBAAA,GAAAR,OAAA;AACA,IAAAS,UAAA,GAAAT,OAAA"}
|
|
@@ -8,18 +8,17 @@ exports.STRING_ATTRIBUTE_TYPE = exports.OBJECT_ID_ATTRIBUTE_TYPE = exports.INT_1
|
|
|
8
8
|
exports.getConstructorForDataFormat = getConstructorForDataFormat;
|
|
9
9
|
exports.sizeOf = sizeOf;
|
|
10
10
|
var _constants = _interopRequireDefault(require("@luma.gl/constants"));
|
|
11
|
-
var _types = require("../../types");
|
|
12
11
|
function getConstructorForDataFormat(dataType) {
|
|
13
12
|
switch (dataType) {
|
|
14
|
-
case
|
|
13
|
+
case 'UInt8':
|
|
15
14
|
return Uint8Array;
|
|
16
|
-
case
|
|
15
|
+
case 'UInt16':
|
|
17
16
|
return Uint16Array;
|
|
18
|
-
case
|
|
17
|
+
case 'UInt32':
|
|
19
18
|
return Uint32Array;
|
|
20
|
-
case
|
|
19
|
+
case 'Float32':
|
|
21
20
|
return Float32Array;
|
|
22
|
-
case
|
|
21
|
+
case 'UInt64':
|
|
23
22
|
return Float64Array;
|
|
24
23
|
default:
|
|
25
24
|
throw new Error("parse i3s tile content: unknown type of data: ".concat(dataType));
|
|
@@ -35,18 +34,18 @@ var GL_TYPE_MAP = {
|
|
|
35
34
|
exports.GL_TYPE_MAP = GL_TYPE_MAP;
|
|
36
35
|
function sizeOf(dataType) {
|
|
37
36
|
switch (dataType) {
|
|
38
|
-
case
|
|
37
|
+
case 'UInt8':
|
|
39
38
|
return 1;
|
|
40
|
-
case
|
|
41
|
-
case
|
|
39
|
+
case 'UInt16':
|
|
40
|
+
case 'Int16':
|
|
42
41
|
return 2;
|
|
43
|
-
case
|
|
44
|
-
case
|
|
45
|
-
case
|
|
42
|
+
case 'UInt32':
|
|
43
|
+
case 'Int32':
|
|
44
|
+
case 'Float32':
|
|
46
45
|
return 4;
|
|
47
|
-
case
|
|
48
|
-
case
|
|
49
|
-
case
|
|
46
|
+
case 'UInt64':
|
|
47
|
+
case 'Int64':
|
|
48
|
+
case 'Float64':
|
|
50
49
|
return 8;
|
|
51
50
|
default:
|
|
52
51
|
throw new Error("parse i3s tile content: unknown size of data: ".concat(dataType));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["_constants","_interopRequireDefault","require","
|
|
1
|
+
{"version":3,"file":"constants.js","names":["_constants","_interopRequireDefault","require","getConstructorForDataFormat","dataType","Uint8Array","Uint16Array","Uint32Array","Float32Array","Float64Array","Error","concat","GL_TYPE_MAP","UInt8","GL","UNSIGNED_BYTE","UInt16","UNSIGNED_SHORT","Float32","FLOAT","UInt32","UNSIGNED_INT","UInt64","DOUBLE","exports","sizeOf","STRING_ATTRIBUTE_TYPE","OBJECT_ID_ATTRIBUTE_TYPE","FLOAT_64_TYPE","INT_16_ATTRIBUTE_TYPE","COORDINATE_SYSTEM"],"sources":["../../../../src/lib/parsers/constants.ts"],"sourcesContent":["import GL from '@luma.gl/constants';\n\nexport function getConstructorForDataFormat(dataType: string) {\n switch (dataType) {\n case 'UInt8':\n return Uint8Array;\n case 'UInt16':\n return Uint16Array;\n case 'UInt32':\n return Uint32Array;\n case 'Float32':\n return Float32Array;\n case 'UInt64':\n return Float64Array;\n default:\n throw new Error(`parse i3s tile content: unknown type of data: ${dataType}`);\n }\n}\n\nexport const GL_TYPE_MAP: {[key: string]: number} = {\n UInt8: GL.UNSIGNED_BYTE,\n UInt16: GL.UNSIGNED_SHORT,\n Float32: GL.FLOAT,\n UInt32: GL.UNSIGNED_INT,\n UInt64: GL.DOUBLE\n};\n/**\n * Returns how many bytes a type occupies\n * @param dataType\n * @returns\n */\nexport function sizeOf(dataType: string): number {\n switch (dataType) {\n case 'UInt8':\n return 1;\n case 'UInt16':\n case 'Int16':\n return 2;\n case 'UInt32':\n case 'Int32':\n case 'Float32':\n return 4;\n case 'UInt64':\n case 'Int64':\n case 'Float64':\n return 8;\n default:\n throw new Error(`parse i3s tile content: unknown size of data: ${dataType}`);\n }\n}\n\nexport const STRING_ATTRIBUTE_TYPE = 'String';\nexport const OBJECT_ID_ATTRIBUTE_TYPE = 'Oid32';\nexport const FLOAT_64_TYPE = 'Float64';\nexport const INT_16_ATTRIBUTE_TYPE = 'Int16';\n\n// https://github.com/visgl/deck.gl/blob/9548f43cba2234a1f4877b6b17f6c88eb35b2e08/modules/core/src/lib/constants.js#L27\n// Describes the format of positions\nexport enum COORDINATE_SYSTEM {\n /**\n * `LNGLAT` if rendering into a geospatial viewport, `CARTESIAN` otherwise\n */\n DEFAULT = -1,\n /**\n * Positions are interpreted as [lng, lat, elevation]\n * lng lat are degrees, elevation is meters. distances as meters.\n */\n LNGLAT = 1,\n /**\n * Positions are interpreted as meter offsets, distances as meters\n */\n METER_OFFSETS = 2,\n /**\n * Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]\n * deltaLng, deltaLat are delta degrees, elevation is meters.\n * distances as meters.\n */\n LNGLAT_OFFSETS = 3,\n /**\n * Non-geospatial\n */\n CARTESIAN = 0\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEO,SAASC,2BAA2BA,CAACC,QAAgB,EAAE;EAC5D,QAAQA,QAAQ;IACd,KAAK,OAAO;MACV,OAAOC,UAAU;IACnB,KAAK,QAAQ;MACX,OAAOC,WAAW;IACpB,KAAK,QAAQ;MACX,OAAOC,WAAW;IACpB,KAAK,SAAS;MACZ,OAAOC,YAAY;IACrB,KAAK,QAAQ;MACX,OAAOC,YAAY;IACrB;MACE,MAAM,IAAIC,KAAK,kDAAAC,MAAA,CAAkDP,QAAQ,CAAE,CAAC;EAChF;AACF;AAEO,IAAMQ,WAAoC,GAAG;EAClDC,KAAK,EAAEC,kBAAE,CAACC,aAAa;EACvBC,MAAM,EAAEF,kBAAE,CAACG,cAAc;EACzBC,OAAO,EAAEJ,kBAAE,CAACK,KAAK;EACjBC,MAAM,EAAEN,kBAAE,CAACO,YAAY;EACvBC,MAAM,EAAER,kBAAE,CAACS;AACb,CAAC;AAACC,OAAA,CAAAZ,WAAA,GAAAA,WAAA;AAMK,SAASa,MAAMA,CAACrB,QAAgB,EAAU;EAC/C,QAAQA,QAAQ;IACd,KAAK,OAAO;MACV,OAAO,CAAC;IACV,KAAK,QAAQ;IACb,KAAK,OAAO;MACV,OAAO,CAAC;IACV,KAAK,QAAQ;IACb,KAAK,OAAO;IACZ,KAAK,SAAS;MACZ,OAAO,CAAC;IACV,KAAK,QAAQ;IACb,KAAK,OAAO;IACZ,KAAK,SAAS;MACZ,OAAO,CAAC;IACV;MACE,MAAM,IAAIM,KAAK,kDAAAC,MAAA,CAAkDP,QAAQ,CAAE,CAAC;EAChF;AACF;AAEO,IAAMsB,qBAAqB,GAAG,QAAQ;AAACF,OAAA,CAAAE,qBAAA,GAAAA,qBAAA;AACvC,IAAMC,wBAAwB,GAAG,OAAO;AAACH,OAAA,CAAAG,wBAAA,GAAAA,wBAAA;AACzC,IAAMC,aAAa,GAAG,SAAS;AAACJ,OAAA,CAAAI,aAAA,GAAAA,aAAA;AAChC,IAAMC,qBAAqB,GAAG,OAAO;AAACL,OAAA,CAAAK,qBAAA,GAAAA,qBAAA;AAAA,IAIjCC,iBAAiB,aAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAjBA,iBAAiB,CAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA;AAAAN,OAAA,CAAAM,iBAAA,GAAAA,iBAAA"}
|
|
@@ -7,62 +7,126 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.parseSLPK = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
+
var _md = _interopRequireDefault(require("md5"));
|
|
10
11
|
var _cdFileHeader = require("../parse-zip/cd-file-header");
|
|
12
|
+
var _endOfCentralDirectory = require("../parse-zip/end-of-central-directory");
|
|
11
13
|
var _localFileHeader = require("../parse-zip/local-file-header");
|
|
12
|
-
var _searchFromTheEnd = require("
|
|
14
|
+
var _searchFromTheEnd = require("../parse-zip/search-from-the-end");
|
|
13
15
|
var _slpkArchieve = require("./slpk-archieve");
|
|
14
16
|
var parseSLPK = function () {
|
|
15
|
-
var _ref = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(fileProvider) {
|
|
16
|
-
var
|
|
17
|
+
var _ref = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(fileProvider, cb) {
|
|
18
|
+
var hashCDOffset, cdFileHeader, hashData, localFileHeader, fileDataOffset, hashFile;
|
|
17
19
|
return _regenerator.default.wrap(function _callee$(_context) {
|
|
18
20
|
while (1) switch (_context.prev = _context.next) {
|
|
19
21
|
case 0:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
case 3:
|
|
22
|
+
_context.next = 2;
|
|
23
|
+
return (0, _searchFromTheEnd.searchFromTheEnd)(fileProvider, _cdFileHeader.signature);
|
|
24
|
+
case 2:
|
|
24
25
|
hashCDOffset = _context.sent;
|
|
25
|
-
_context.next =
|
|
26
|
+
_context.next = 5;
|
|
26
27
|
return (0, _cdFileHeader.parseZipCDFileHeader)(hashCDOffset, fileProvider);
|
|
27
|
-
case
|
|
28
|
+
case 5:
|
|
28
29
|
cdFileHeader = _context.sent;
|
|
29
|
-
if (!(cdFileHeader.fileName !== '@specialIndexFileHASH128@')) {
|
|
30
|
-
_context.next = 9;
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
|
-
throw new Error('No hash file in slpk');
|
|
34
|
-
case 9:
|
|
35
|
-
_context.next = 11;
|
|
36
|
-
return (0, _localFileHeader.parseZipLocalFileHeader)(cdFileHeader.localHeaderOffset, fileProvider);
|
|
37
|
-
case 11:
|
|
38
|
-
localFileHeader = _context.sent;
|
|
39
|
-
if (localFileHeader) {
|
|
30
|
+
if (!((cdFileHeader === null || cdFileHeader === void 0 ? void 0 : cdFileHeader.fileName) !== '@specialIndexFileHASH128@')) {
|
|
40
31
|
_context.next = 14;
|
|
41
32
|
break;
|
|
42
33
|
}
|
|
43
|
-
|
|
34
|
+
cb === null || cb === void 0 ? void 0 : cb('SLPK doesnt contain hash file');
|
|
35
|
+
_context.next = 10;
|
|
36
|
+
return generateHashInfo(fileProvider);
|
|
37
|
+
case 10:
|
|
38
|
+
hashData = _context.sent;
|
|
39
|
+
cb === null || cb === void 0 ? void 0 : cb('hash info has been composed according to central directory records');
|
|
40
|
+
_context.next = 25;
|
|
41
|
+
break;
|
|
44
42
|
case 14:
|
|
45
|
-
|
|
43
|
+
cb === null || cb === void 0 ? void 0 : cb('SLPK contains hash file');
|
|
46
44
|
_context.next = 17;
|
|
47
|
-
return
|
|
45
|
+
return (0, _localFileHeader.parseZipLocalFileHeader)(cdFileHeader.localHeaderOffset, fileProvider);
|
|
48
46
|
case 17:
|
|
49
|
-
|
|
50
|
-
if (
|
|
47
|
+
localFileHeader = _context.sent;
|
|
48
|
+
if (localFileHeader) {
|
|
51
49
|
_context.next = 20;
|
|
52
50
|
break;
|
|
53
51
|
}
|
|
54
|
-
throw new Error('
|
|
52
|
+
throw new Error('corrupted SLPK');
|
|
55
53
|
case 20:
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
fileDataOffset = localFileHeader.fileDataOffset;
|
|
55
|
+
_context.next = 23;
|
|
56
|
+
return fileProvider.slice(fileDataOffset, fileDataOffset + localFileHeader.compressedSize);
|
|
57
|
+
case 23:
|
|
58
|
+
hashFile = _context.sent;
|
|
59
|
+
hashData = parseHashFile(hashFile);
|
|
60
|
+
case 25:
|
|
61
|
+
return _context.abrupt("return", new _slpkArchieve.SLPKArchive(fileProvider, hashData));
|
|
62
|
+
case 26:
|
|
58
63
|
case "end":
|
|
59
64
|
return _context.stop();
|
|
60
65
|
}
|
|
61
66
|
}, _callee);
|
|
62
67
|
}));
|
|
63
|
-
return function parseSLPK(_x) {
|
|
68
|
+
return function parseSLPK(_x, _x2) {
|
|
64
69
|
return _ref.apply(this, arguments);
|
|
65
70
|
};
|
|
66
71
|
}();
|
|
67
72
|
exports.parseSLPK = parseSLPK;
|
|
73
|
+
var generateHashInfo = function () {
|
|
74
|
+
var _ref2 = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(fileProvider) {
|
|
75
|
+
var _yield$parseEoCDRecor, cdStartOffset, cdHeader, hashInfo;
|
|
76
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
77
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
78
|
+
case 0:
|
|
79
|
+
_context2.next = 2;
|
|
80
|
+
return (0, _endOfCentralDirectory.parseEoCDRecord)(fileProvider);
|
|
81
|
+
case 2:
|
|
82
|
+
_yield$parseEoCDRecor = _context2.sent;
|
|
83
|
+
cdStartOffset = _yield$parseEoCDRecor.cdStartOffset;
|
|
84
|
+
_context2.next = 6;
|
|
85
|
+
return (0, _cdFileHeader.parseZipCDFileHeader)(cdStartOffset, fileProvider);
|
|
86
|
+
case 6:
|
|
87
|
+
cdHeader = _context2.sent;
|
|
88
|
+
hashInfo = [];
|
|
89
|
+
case 8:
|
|
90
|
+
if (!cdHeader) {
|
|
91
|
+
_context2.next = 15;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
hashInfo.push({
|
|
95
|
+
hash: Buffer.from((0, _md.default)(cdHeader.fileName.split('\\').join('/').toLocaleLowerCase()), 'hex'),
|
|
96
|
+
offset: cdHeader.localHeaderOffset
|
|
97
|
+
});
|
|
98
|
+
_context2.next = 12;
|
|
99
|
+
return (0, _cdFileHeader.parseZipCDFileHeader)(cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength), fileProvider);
|
|
100
|
+
case 12:
|
|
101
|
+
cdHeader = _context2.sent;
|
|
102
|
+
_context2.next = 8;
|
|
103
|
+
break;
|
|
104
|
+
case 15:
|
|
105
|
+
hashInfo.sort(function (a, b) {
|
|
106
|
+
return (0, _slpkArchieve.compareHashes)(a.hash, b.hash);
|
|
107
|
+
});
|
|
108
|
+
return _context2.abrupt("return", hashInfo);
|
|
109
|
+
case 17:
|
|
110
|
+
case "end":
|
|
111
|
+
return _context2.stop();
|
|
112
|
+
}
|
|
113
|
+
}, _callee2);
|
|
114
|
+
}));
|
|
115
|
+
return function generateHashInfo(_x3) {
|
|
116
|
+
return _ref2.apply(this, arguments);
|
|
117
|
+
};
|
|
118
|
+
}();
|
|
119
|
+
var parseHashFile = function parseHashFile(hashFile) {
|
|
120
|
+
var hashFileBuffer = Buffer.from(hashFile);
|
|
121
|
+
var hashArray = [];
|
|
122
|
+
for (var i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
|
|
123
|
+
var offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
|
|
124
|
+
var offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
|
|
125
|
+
hashArray.push({
|
|
126
|
+
hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
|
|
127
|
+
offset: offset
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return hashArray;
|
|
131
|
+
};
|
|
68
132
|
//# sourceMappingURL=parse-slpk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-slpk.js","names":["
|
|
1
|
+
{"version":3,"file":"parse-slpk.js","names":["_md","_interopRequireDefault","require","_cdFileHeader","_endOfCentralDirectory","_localFileHeader","_searchFromTheEnd","_slpkArchieve","parseSLPK","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","fileProvider","cb","hashCDOffset","cdFileHeader","hashData","localFileHeader","fileDataOffset","hashFile","wrap","_callee$","_context","prev","next","searchFromTheEnd","cdHeaderSignature","sent","parseZipCDFileHeader","fileName","generateHashInfo","parseZipLocalFileHeader","localHeaderOffset","Error","slice","compressedSize","parseHashFile","abrupt","SLPKArchive","stop","_x","_x2","apply","arguments","exports","_ref2","_callee2","_yield$parseEoCDRecor","cdStartOffset","cdHeader","hashInfo","_callee2$","_context2","parseEoCDRecord","push","hash","Buffer","from","md5","split","join","toLocaleLowerCase","offset","extraOffset","BigInt","extraFieldLength","sort","a","b","compareHashes","_x3","hashFileBuffer","hashArray","i","buffer","byteLength","offsetBuffer","DataView","byteOffset","getBigUint64","subarray"],"sources":["../../../../../src/lib/parsers/parse-slpk/parse-slpk.ts"],"sourcesContent":["import md5 from 'md5';\nimport {parseZipCDFileHeader, signature as cdHeaderSignature} from '../parse-zip/cd-file-header';\nimport {parseEoCDRecord} from '../parse-zip/end-of-central-directory';\nimport {FileProvider} from '../parse-zip/file-provider';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {searchFromTheEnd} from '../parse-zip/search-from-the-end';\nimport {HashElement, SLPKArchive, compareHashes} from './slpk-archieve';\n\n/**\n * Creates slpk file handler from raw file\n * @param fileProvider raw file data\n * @param cb is called with information message during parsing\n * @returns slpk file handler\n */\nexport const parseSLPK = async (\n fileProvider: FileProvider,\n cb?: (msg: string) => void\n): Promise<SLPKArchive> => {\n const hashCDOffset = await searchFromTheEnd(fileProvider, cdHeaderSignature);\n\n const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);\n\n let hashData: HashElement[];\n if (cdFileHeader?.fileName !== '@specialIndexFileHASH128@') {\n cb?.('SLPK doesnt contain hash file');\n hashData = await generateHashInfo(fileProvider);\n cb?.('hash info has been composed according to central directory records');\n } else {\n cb?.('SLPK contains hash file');\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n fileProvider\n );\n if (!localFileHeader) {\n throw new Error('corrupted SLPK');\n }\n\n const fileDataOffset = localFileHeader.fileDataOffset;\n const hashFile = await fileProvider.slice(\n fileDataOffset,\n fileDataOffset + localFileHeader.compressedSize\n );\n\n hashData = parseHashFile(hashFile);\n }\n\n return new SLPKArchive(fileProvider, hashData);\n};\n\n/**\n * generates hash info from central directory\n * @param fileProvider - provider of the archive\n * @returns ready to use hash info\n */\nconst generateHashInfo = async (fileProvider: FileProvider): Promise<HashElement[]> => {\n const {cdStartOffset} = await parseEoCDRecord(fileProvider);\n let cdHeader = await parseZipCDFileHeader(cdStartOffset, fileProvider);\n const hashInfo: HashElement[] = [];\n while (cdHeader) {\n hashInfo.push({\n hash: Buffer.from(md5(cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase()), 'hex'),\n offset: cdHeader.localHeaderOffset\n });\n cdHeader = await parseZipCDFileHeader(\n cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength),\n fileProvider\n );\n }\n hashInfo.sort((a, b) => compareHashes(a.hash, b.hash));\n return hashInfo;\n};\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param hashFile - bufer containing hash file\n * @returns Array containing file info\n */\nconst parseHashFile = (hashFile: ArrayBuffer): HashElement[] => {\n const hashFileBuffer = Buffer.from(hashFile);\n const hashArray: HashElement[] = [];\n for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {\n const offsetBuffer = new DataView(\n hashFileBuffer.buffer.slice(\n hashFileBuffer.byteOffset + i + 16,\n hashFileBuffer.byteOffset + i + 24\n )\n );\n const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);\n hashArray.push({\n hash: Buffer.from(\n hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)\n ),\n offset\n });\n }\n return hashArray;\n};\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.SLPKArchive = void 0;
|
|
7
|
+
exports.compareHashes = exports.SLPKArchive = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
10
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
@@ -16,6 +16,18 @@ var _compression = require("@loaders.gl/compression");
|
|
|
16
16
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
17
17
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
18
18
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
19
|
+
var compareHashes = function compareHashes(hash1, hash2) {
|
|
20
|
+
var h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);
|
|
21
|
+
var h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);
|
|
22
|
+
var diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];
|
|
23
|
+
if (diff < 0n) {
|
|
24
|
+
return -1;
|
|
25
|
+
} else if (diff === 0n) {
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
return 1;
|
|
29
|
+
};
|
|
30
|
+
exports.compareHashes = compareHashes;
|
|
19
31
|
var PATH_DESCRIPTIONS = [{
|
|
20
32
|
test: /^$/,
|
|
21
33
|
extensions: ['3dSceneLayer.json.gz']
|
|
@@ -23,7 +35,7 @@ var PATH_DESCRIPTIONS = [{
|
|
|
23
35
|
test: /^nodepages\/\d+$/,
|
|
24
36
|
extensions: ['.json.gz']
|
|
25
37
|
}, {
|
|
26
|
-
test: /^nodes
|
|
38
|
+
test: /^nodes\/(\d+|root)$/,
|
|
27
39
|
extensions: ['/3dNodeIndexDocument.json.gz']
|
|
28
40
|
}, {
|
|
29
41
|
test: /^nodes\/\d+\/textures\/.+$/,
|
|
@@ -43,28 +55,30 @@ var PATH_DESCRIPTIONS = [{
|
|
|
43
55
|
}];
|
|
44
56
|
var SLPKArchive = function () {
|
|
45
57
|
function SLPKArchive(slpkArchive, hashFile) {
|
|
58
|
+
var _this = this;
|
|
46
59
|
(0, _classCallCheck2.default)(this, SLPKArchive);
|
|
47
60
|
(0, _defineProperty2.default)(this, "slpkArchive", void 0);
|
|
48
61
|
(0, _defineProperty2.default)(this, "hashArray", void 0);
|
|
62
|
+
(0, _defineProperty2.default)(this, "findBin", function (hashToSearch) {
|
|
63
|
+
var lowerBorder = 0;
|
|
64
|
+
var upperBorder = _this.hashArray.length;
|
|
65
|
+
while (upperBorder - lowerBorder > 1) {
|
|
66
|
+
var middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);
|
|
67
|
+
var value = compareHashes(_this.hashArray[middle].hash, hashToSearch);
|
|
68
|
+
if (value === 0) {
|
|
69
|
+
return _this.hashArray[middle];
|
|
70
|
+
} else if (value < 0) {
|
|
71
|
+
lowerBorder = middle;
|
|
72
|
+
} else {
|
|
73
|
+
upperBorder = middle;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
});
|
|
49
78
|
this.slpkArchive = slpkArchive;
|
|
50
|
-
this.hashArray =
|
|
79
|
+
this.hashArray = hashFile;
|
|
51
80
|
}
|
|
52
81
|
(0, _createClass2.default)(SLPKArchive, [{
|
|
53
|
-
key: "parseHashFile",
|
|
54
|
-
value: function parseHashFile(hashFile) {
|
|
55
|
-
var hashFileBuffer = Buffer.from(hashFile);
|
|
56
|
-
var hashArray = [];
|
|
57
|
-
for (var i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
|
|
58
|
-
var offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
|
|
59
|
-
var offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
|
|
60
|
-
hashArray.push({
|
|
61
|
-
hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
|
|
62
|
-
offset: offset
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return hashArray;
|
|
66
|
-
}
|
|
67
|
-
}, {
|
|
68
82
|
key: "getFile",
|
|
69
83
|
value: function () {
|
|
70
84
|
var _getFile = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(path) {
|
|
@@ -177,28 +191,37 @@ var SLPKArchive = function () {
|
|
|
177
191
|
while (1) switch (_context2.prev = _context2.next) {
|
|
178
192
|
case 0:
|
|
179
193
|
_context2.next = 2;
|
|
180
|
-
return this.getFileBytes(path);
|
|
194
|
+
return this.getFileBytes(path.toLocaleLowerCase());
|
|
181
195
|
case 2:
|
|
182
196
|
data = _context2.sent;
|
|
183
197
|
if (data) {
|
|
184
|
-
_context2.next =
|
|
198
|
+
_context2.next = 7;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
_context2.next = 6;
|
|
202
|
+
return this.getFileBytes(path);
|
|
203
|
+
case 6:
|
|
204
|
+
data = _context2.sent;
|
|
205
|
+
case 7:
|
|
206
|
+
if (data) {
|
|
207
|
+
_context2.next = 9;
|
|
185
208
|
break;
|
|
186
209
|
}
|
|
187
210
|
return _context2.abrupt("return", undefined);
|
|
188
|
-
case
|
|
211
|
+
case 9:
|
|
189
212
|
if (!/\.gz$/.test(path)) {
|
|
190
|
-
_context2.next =
|
|
213
|
+
_context2.next = 15;
|
|
191
214
|
break;
|
|
192
215
|
}
|
|
193
216
|
compression = new _compression.GZipCompression();
|
|
194
|
-
_context2.next =
|
|
217
|
+
_context2.next = 13;
|
|
195
218
|
return compression.decompress(data);
|
|
196
|
-
case
|
|
219
|
+
case 13:
|
|
197
220
|
decompressedData = _context2.sent;
|
|
198
221
|
return _context2.abrupt("return", decompressedData);
|
|
199
|
-
case
|
|
222
|
+
case 15:
|
|
200
223
|
return _context2.abrupt("return", Buffer.from(data));
|
|
201
|
-
case
|
|
224
|
+
case 16:
|
|
202
225
|
case "end":
|
|
203
226
|
return _context2.stop();
|
|
204
227
|
}
|
|
@@ -218,9 +241,7 @@ var SLPKArchive = function () {
|
|
|
218
241
|
while (1) switch (_context3.prev = _context3.next) {
|
|
219
242
|
case 0:
|
|
220
243
|
nameHash = Buffer.from((0, _md.default)(path), 'hex');
|
|
221
|
-
fileInfo = this.
|
|
222
|
-
return Buffer.compare(val.hash, nameHash) === 0;
|
|
223
|
-
});
|
|
244
|
+
fileInfo = this.findBin(nameHash);
|
|
224
245
|
if (fileInfo) {
|
|
225
246
|
_context3.next = 4;
|
|
226
247
|
break;
|
|
@@ -228,7 +249,7 @@ var SLPKArchive = function () {
|
|
|
228
249
|
return _context3.abrupt("return", undefined);
|
|
229
250
|
case 4:
|
|
230
251
|
_context3.next = 6;
|
|
231
|
-
return (0, _localFileHeader.parseZipLocalFileHeader)(fileInfo
|
|
252
|
+
return (0, _localFileHeader.parseZipLocalFileHeader)(fileInfo.offset, this.slpkArchive);
|
|
232
253
|
case 6:
|
|
233
254
|
localFileHeader = _context3.sent;
|
|
234
255
|
if (localFileHeader) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slpk-archieve.js","names":["_md","_interopRequireDefault","require","_localFileHeader","_compression","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","PATH_DESCRIPTIONS","extensions","SLPKArchive","slpkArchive","hashFile","_classCallCheck2","default","_defineProperty2","hashArray","parseHashFile","_createClass2","key","hashFileBuffer","Buffer","buffer","byteLength","offsetBuffer","DataView","byteOffset","offset","getBigUint64","push","hash","subarray","_getFile","_asyncToGenerator2","_regenerator","mark","_callee","path","mode","_PATH_DESCRIPTIONS$fi","data","_iterator","_step","ext","decompressedFile","fileWithoutCompression","_args","arguments","wrap","_callee$","_context","prev","undefined","find","val","getDataByPath","concat","sent","abrupt","t0","finish","getFileBytes","Error","stop","getFile","_x","apply","_getDataByPath","_callee2","compression","decompressedData","_callee2$","_context2","GZipCompression","decompress","_x2","_getFileBytes","_callee3","nameHash","fileInfo","localFileHeader","compressedFile","_callee3$","_context3","md5","compare","parseZipLocalFileHeader","fileDataOffset","compressedSize","_x3","exports"],"sources":["../../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"sourcesContent":["import md5 from 'md5';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {GZipCompression} from '@loaders.gl/compression';\nimport {FileProvider} from '../parse-zip/file-provider';\n\n/** Element of hash array */\ntype HashElement = {\n /**\n * File name hash\n */\n hash: Buffer;\n /**\n * File offset in the archive\n */\n offset: bigint;\n};\n\n/** Description of real paths for different file types */\nconst PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [\n {\n test: /^$/,\n extensions: ['3dSceneLayer.json.gz']\n },\n {\n test: /^nodepages\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+$/,\n extensions: ['/3dNodeIndexDocument.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/textures\\/.+$/,\n extensions: ['.jpg', '.png', '.bin.dds.gz', '.ktx']\n },\n {\n test: /^nodes\\/\\d+\\/geometries\\/\\d+$/,\n extensions: ['.bin.gz', '.draco.gz']\n },\n {\n test: /^nodes\\/\\d+\\/attributes\\/f_\\d+\\/\\d+$/,\n extensions: ['.bin.gz']\n },\n {\n test: /^statistics\\/f_\\d+\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/shared$/,\n extensions: ['/sharedResource.json.gz']\n }\n];\n\n/**\n * Class for handling information about slpk file\n */\nexport class SLPKArchive {\n slpkArchive: FileProvider;\n hashArray: {hash: Buffer; offset: bigint}[];\n constructor(slpkArchive: FileProvider, hashFile: ArrayBuffer) {\n this.slpkArchive = slpkArchive;\n this.hashArray = this.parseHashFile(hashFile);\n }\n\n /**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param hashFile - bufer containing hash file\n * @returns Array containing file info\n */\n private parseHashFile(hashFile: ArrayBuffer): HashElement[] {\n const hashFileBuffer = Buffer.from(hashFile);\n const hashArray: HashElement[] = [];\n for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {\n const offsetBuffer = new DataView(\n hashFileBuffer.buffer.slice(\n hashFileBuffer.byteOffset + i + 16,\n hashFileBuffer.byteOffset + i + 24\n )\n );\n const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);\n hashArray.push({\n hash: Buffer.from(\n hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)\n ),\n offset\n });\n }\n return hashArray;\n }\n\n /**\n * Returns file with the given path from slpk archive\n * @param path - path inside the slpk\n * @param mode - currently only raw mode supported\n * @returns buffer with ready to use file\n */\n async getFile(path: string, mode: 'http' | 'raw' = 'raw'): Promise<Buffer> {\n if (mode === 'http') {\n const extensions = PATH_DESCRIPTIONS.find((val) => val.test.test(path))?.extensions;\n if (extensions) {\n let data: ArrayBuffer | undefined;\n for (const ext of extensions) {\n data = await this.getDataByPath(`${path}${ext}`);\n if (data) {\n break;\n }\n }\n if (data) {\n return Buffer.from(data);\n }\n }\n }\n if (mode === 'raw') {\n const decompressedFile = await this.getDataByPath(`${path}.gz`);\n if (decompressedFile) {\n return Buffer.from(decompressedFile);\n }\n const fileWithoutCompression = await this.getFileBytes(path);\n if (fileWithoutCompression) {\n return Buffer.from(fileWithoutCompression);\n }\n }\n\n throw new Error('No such file in the archieve');\n }\n\n /**\n * returning uncompressed data for paths that ends with .gz and raw data for all other paths\n * @param path - path inside the archive\n * @returns buffer with the file data\n */\n private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {\n const data = await this.getFileBytes(path);\n if (!data) {\n return undefined;\n }\n if (/\\.gz$/.test(path)) {\n const compression = new GZipCompression();\n\n const decompressedData = await compression.decompress(data);\n return decompressedData;\n }\n return Buffer.from(data);\n }\n\n /**\n * Trying to get raw file data by adress\n * @param path - path inside the archive\n * @returns buffer with the raw file data\n */\n private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {\n const nameHash = Buffer.from(md5(path), 'hex');\n const fileInfo = this.hashArray.find((val) => Buffer.compare(val.hash, nameHash) === 0);\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(fileInfo?.offset, this.slpkArchive);\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slpk-archieve.js","names":["_md","_interopRequireDefault","require","_localFileHeader","_compression","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","compareHashes","hash1","hash2","h1","BigUint64Array","buffer","byteOffset","h2","diff","exports","PATH_DESCRIPTIONS","extensions","SLPKArchive","slpkArchive","hashFile","_this","_classCallCheck2","default","_defineProperty2","hashToSearch","lowerBorder","upperBorder","hashArray","middle","Math","floor","hash","undefined","_createClass2","key","_getFile","_asyncToGenerator2","_regenerator","mark","_callee","path","mode","_PATH_DESCRIPTIONS$fi","data","_iterator","_step","ext","decompressedFile","fileWithoutCompression","_args","arguments","wrap","_callee$","_context","prev","find","val","getDataByPath","concat","sent","abrupt","t0","finish","Buffer","getFileBytes","Error","stop","getFile","_x","apply","_getDataByPath","_callee2","compression","decompressedData","_callee2$","_context2","toLocaleLowerCase","GZipCompression","decompress","_x2","_getFileBytes","_callee3","nameHash","fileInfo","localFileHeader","compressedFile","_callee3$","_context3","md5","findBin","parseZipLocalFileHeader","offset","fileDataOffset","compressedSize","_x3"],"sources":["../../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"sourcesContent":["import md5 from 'md5';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {GZipCompression} from '@loaders.gl/compression';\nimport {FileProvider} from '../parse-zip/file-provider';\n\n/** Element of hash array */\nexport type HashElement = {\n /** File name hash */\n hash: Buffer;\n /** File offset in the archive */\n offset: bigint;\n};\n\n/**\n * Comparing md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md step 5\n * @param hash1 hash to compare\n * @param hash2 hash to compare\n * @returns -1 if hash1 < hash2, 0 of hash1 === hash2, 1 if hash1 > hash2\n */\nexport const compareHashes = (hash1: Buffer, hash2: Buffer): number => {\n const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);\n const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);\n\n const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];\n\n if (diff < 0n) {\n return -1;\n } else if (diff === 0n) {\n return 0;\n }\n return 1;\n};\n\n/** Description of real paths for different file types */\nconst PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [\n {\n test: /^$/,\n extensions: ['3dSceneLayer.json.gz']\n },\n {\n test: /^nodepages\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/(\\d+|root)$/,\n extensions: ['/3dNodeIndexDocument.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/textures\\/.+$/,\n extensions: ['.jpg', '.png', '.bin.dds.gz', '.ktx']\n },\n {\n test: /^nodes\\/\\d+\\/geometries\\/\\d+$/,\n extensions: ['.bin.gz', '.draco.gz']\n },\n {\n test: /^nodes\\/\\d+\\/attributes\\/f_\\d+\\/\\d+$/,\n extensions: ['.bin.gz']\n },\n {\n test: /^statistics\\/f_\\d+\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/shared$/,\n extensions: ['/sharedResource.json.gz']\n }\n];\n\n/**\n * Class for handling information about slpk file\n */\nexport class SLPKArchive {\n private slpkArchive: FileProvider;\n private hashArray: HashElement[];\n constructor(slpkArchive: FileProvider, hashFile: HashElement[]) {\n this.slpkArchive = slpkArchive;\n this.hashArray = hashFile;\n }\n\n /**\n * Binary search in the hash info\n * @param hashToSearch hash that we need to find\n * @returns required hash element or undefined if not found\n */\n private findBin = (hashToSearch: Buffer): HashElement | undefined => {\n let lowerBorder = 0;\n let upperBorder = this.hashArray.length;\n\n while (upperBorder - lowerBorder > 1) {\n const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);\n const value = compareHashes(this.hashArray[middle].hash, hashToSearch);\n if (value === 0) {\n return this.hashArray[middle];\n } else if (value < 0) {\n lowerBorder = middle;\n } else {\n upperBorder = middle;\n }\n }\n return undefined;\n };\n\n /**\n * Returns file with the given path from slpk archive\n * @param path - path inside the slpk\n * @param mode - currently only raw mode supported\n * @returns buffer with ready to use file\n */\n async getFile(path: string, mode: 'http' | 'raw' = 'raw'): Promise<Buffer> {\n if (mode === 'http') {\n const extensions = PATH_DESCRIPTIONS.find((val) => val.test.test(path))?.extensions;\n if (extensions) {\n let data: ArrayBuffer | undefined;\n for (const ext of extensions) {\n data = await this.getDataByPath(`${path}${ext}`);\n if (data) {\n break;\n }\n }\n if (data) {\n return Buffer.from(data);\n }\n }\n }\n if (mode === 'raw') {\n const decompressedFile = await this.getDataByPath(`${path}.gz`);\n if (decompressedFile) {\n return Buffer.from(decompressedFile);\n }\n const fileWithoutCompression = await this.getFileBytes(path);\n if (fileWithoutCompression) {\n return Buffer.from(fileWithoutCompression);\n }\n }\n\n throw new Error('No such file in the archieve');\n }\n\n /**\n * returning uncompressed data for paths that ends with .gz and raw data for all other paths\n * @param path - path inside the archive\n * @returns buffer with the file data\n */\n private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {\n // sometimes paths are not in lower case when hash file is created,\n // so first we're looking for lower case file name and then for original one\n let data = await this.getFileBytes(path.toLocaleLowerCase());\n if (!data) {\n data = await this.getFileBytes(path);\n }\n if (!data) {\n return undefined;\n }\n if (/\\.gz$/.test(path)) {\n const compression = new GZipCompression();\n\n const decompressedData = await compression.decompress(data);\n return decompressedData;\n }\n return Buffer.from(data);\n }\n\n /**\n * Trying to get raw file data by adress\n * @param path - path inside the archive\n * @returns buffer with the raw file data\n */\n private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {\n const nameHash = Buffer.from(md5(path), 'hex');\n const fileInfo = this.findBin(nameHash); // implement binary search\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AAAwD,SAAAG,2BAAAC,CAAA,EAAAC,cAAA,QAAAC,EAAA,UAAAC,MAAA,oBAAAH,CAAA,CAAAG,MAAA,CAAAC,QAAA,KAAAJ,CAAA,qBAAAE,EAAA,QAAAG,KAAA,CAAAC,OAAA,CAAAN,CAAA,MAAAE,EAAA,GAAAK,2BAAA,CAAAP,CAAA,MAAAC,cAAA,IAAAD,CAAA,WAAAA,CAAA,CAAAQ,MAAA,qBAAAN,EAAA,EAAAF,CAAA,GAAAE,EAAA,MAAAO,CAAA,UAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,QAAAH,CAAA,IAAAT,CAAA,CAAAQ,MAAA,WAAAK,IAAA,mBAAAA,IAAA,SAAAC,KAAA,EAAAd,CAAA,CAAAS,CAAA,UAAAM,CAAA,WAAAA,EAAAC,EAAA,UAAAA,EAAA,KAAAC,CAAA,EAAAP,CAAA,gBAAAQ,SAAA,iJAAAC,gBAAA,SAAAC,MAAA,UAAAC,GAAA,WAAAV,CAAA,WAAAA,EAAA,IAAAT,EAAA,GAAAA,EAAA,CAAAoB,IAAA,CAAAtB,CAAA,MAAAY,CAAA,WAAAA,EAAA,QAAAW,IAAA,GAAArB,EAAA,CAAAsB,IAAA,IAAAL,gBAAA,GAAAI,IAAA,CAAAV,IAAA,SAAAU,IAAA,KAAAR,CAAA,WAAAA,EAAAU,GAAA,IAAAL,MAAA,SAAAC,GAAA,GAAAI,GAAA,KAAAR,CAAA,WAAAA,EAAA,eAAAE,gBAAA,IAAAjB,EAAA,CAAAwB,MAAA,UAAAxB,EAAA,CAAAwB,MAAA,oBAAAN,MAAA,QAAAC,GAAA;AAAA,SAAAd,4BAAAP,CAAA,EAAA2B,MAAA,SAAA3B,CAAA,qBAAAA,CAAA,sBAAA4B,iBAAA,CAAA5B,CAAA,EAAA2B,MAAA,OAAAf,CAAA,GAAAiB,MAAA,CAAAC,SAAA,CAAAC,QAAA,CAAAT,IAAA,CAAAtB,CAAA,EAAAgC,KAAA,aAAApB,CAAA,iBAAAZ,CAAA,CAAAiC,WAAA,EAAArB,CAAA,GAAAZ,CAAA,CAAAiC,WAAA,CAAAC,IAAA,MAAAtB,CAAA,cAAAA,CAAA,mBAAAP,KAAA,CAAA8B,IAAA,CAAAnC,CAAA,OAAAY,CAAA,+DAAAwB,IAAA,CAAAxB,CAAA,UAAAgB,iBAAA,CAAA5B,CAAA,EAAA2B,MAAA;AAAA,SAAAC,kBAAAS,GAAA,EAAAC,GAAA,QAAAA,GAAA,YAAAA,GAAA,GAAAD,GAAA,CAAA7B,MAAA,EAAA8B,GAAA,GAAAD,GAAA,CAAA7B,MAAA,WAAAC,CAAA,MAAA8B,IAAA,OAAAlC,KAAA,CAAAiC,GAAA,GAAA7B,CAAA,GAAA6B,GAAA,EAAA7B,CAAA,IAAA8B,IAAA,CAAA9B,CAAA,IAAA4B,GAAA,CAAA5B,CAAA,UAAA8B,IAAA;AAiBjD,IAAMC,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAa,EAAEC,KAAa,EAAa;EACrE,IAAMC,EAAE,GAAG,IAAIC,cAAc,CAACH,KAAK,CAACI,MAAM,EAAEJ,KAAK,CAACK,UAAU,EAAE,CAAC,CAAC;EAChE,IAAMC,EAAE,GAAG,IAAIH,cAAc,CAACF,KAAK,CAACG,MAAM,EAAEH,KAAK,CAACI,UAAU,EAAE,CAAC,CAAC;EAEhE,IAAME,IAAI,GAAGL,EAAE,CAAC,CAAC,CAAC,KAAKI,EAAE,CAAC,CAAC,CAAC,GAAGJ,EAAE,CAAC,CAAC,CAAC,GAAGI,EAAE,CAAC,CAAC,CAAC,GAAGJ,EAAE,CAAC,CAAC,CAAC,GAAGI,EAAE,CAAC,CAAC,CAAC;EAE5D,IAAIC,IAAI,GAAG,EAAE,EAAE;IACb,OAAO,CAAC,CAAC;EACX,CAAC,MAAM,IAAIA,IAAI,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC;EACV;EACA,OAAO,CAAC;AACV,CAAC;AAACC,OAAA,CAAAT,aAAA,GAAAA,aAAA;AAGF,IAAMU,iBAAyD,GAAG,CAChE;EACEd,IAAI,EAAE,IAAI;EACVe,UAAU,EAAE,CAAC,sBAAsB;AACrC,CAAC,EACD;EACEf,IAAI,EAAE,kBAAkB;EACxBe,UAAU,EAAE,CAAC,UAAU;AACzB,CAAC,EACD;EACEf,IAAI,EAAE,qBAAqB;EAC3Be,UAAU,EAAE,CAAC,8BAA8B;AAC7C,CAAC,EACD;EACEf,IAAI,EAAE,4BAA4B;EAClCe,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;AACpD,CAAC,EACD;EACEf,IAAI,EAAE,+BAA+B;EACrCe,UAAU,EAAE,CAAC,SAAS,EAAE,WAAW;AACrC,CAAC,EACD;EACEf,IAAI,EAAE,sCAAsC;EAC5Ce,UAAU,EAAE,CAAC,SAAS;AACxB,CAAC,EACD;EACEf,IAAI,EAAE,0BAA0B;EAChCe,UAAU,EAAE,CAAC,UAAU;AACzB,CAAC,EACD;EACEf,IAAI,EAAE,sBAAsB;EAC5Be,UAAU,EAAE,CAAC,yBAAyB;AACxC,CAAC,CACF;AAAC,IAKWC,WAAW;EAGtB,SAAAA,YAAYC,WAAyB,EAAEC,QAAuB,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,CAAAC,OAAA,QAAAL,WAAA;IAAA,IAAAM,gBAAA,CAAAD,OAAA;IAAA,IAAAC,gBAAA,CAAAD,OAAA;IAAA,IAAAC,gBAAA,CAAAD,OAAA,mBAU9C,UAACE,YAAoB,EAA8B;MACnE,IAAIC,WAAW,GAAG,CAAC;MACnB,IAAIC,WAAW,GAAGN,KAAI,CAACO,SAAS,CAACtD,MAAM;MAEvC,OAAOqD,WAAW,GAAGD,WAAW,GAAG,CAAC,EAAE;QACpC,IAAMG,MAAM,GAAGH,WAAW,GAAGI,IAAI,CAACC,KAAK,CAAC,CAACJ,WAAW,GAAGD,WAAW,IAAI,CAAC,CAAC;QACxE,IAAM9C,KAAK,GAAG0B,aAAa,CAACe,KAAI,CAACO,SAAS,CAACC,MAAM,CAAC,CAACG,IAAI,EAAEP,YAAY,CAAC;QACtE,IAAI7C,KAAK,KAAK,CAAC,EAAE;UACf,OAAOyC,KAAI,CAACO,SAAS,CAACC,MAAM,CAAC;QAC/B,CAAC,MAAM,IAAIjD,KAAK,GAAG,CAAC,EAAE;UACpB8C,WAAW,GAAGG,MAAM;QACtB,CAAC,MAAM;UACLF,WAAW,GAAGE,MAAM;QACtB;MACF;MACA,OAAOI,SAAS;IAClB,CAAC;IAzBC,IAAI,CAACd,WAAW,GAAGA,WAAW;IAC9B,IAAI,CAACS,SAAS,GAAGR,QAAQ;EAC3B;EAAC,IAAAc,aAAA,CAAAX,OAAA,EAAAL,WAAA;IAAAiB,GAAA;IAAAvD,KAAA;MAAA,IAAAwD,QAAA,OAAAC,kBAAA,CAAAd,OAAA,EAAAe,YAAA,CAAAf,OAAA,CAAAgB,IAAA,CA+BD,SAAAC,QAAcC,IAAY;QAAA,IAAAC,IAAA;UAAAC,qBAAA;UAAA1B,UAAA;UAAA2B,IAAA;UAAAC,SAAA;UAAAC,KAAA;UAAAC,GAAA;UAAAC,gBAAA;UAAAC,sBAAA;UAAAC,KAAA,GAAAC,SAAA;QAAA,OAAAb,YAAA,CAAAf,OAAA,CAAA6B,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAhE,IAAA;YAAA;cAAEoD,IAAoB,GAAAQ,KAAA,CAAA5E,MAAA,QAAA4E,KAAA,QAAAjB,SAAA,GAAAiB,KAAA,MAAG,KAAK;cAAA,MAClDR,IAAI,KAAK,MAAM;gBAAAY,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cACX2B,UAAU,IAAA0B,qBAAA,GAAG3B,iBAAiB,CAACwC,IAAI,CAAC,UAACC,GAAG;gBAAA,OAAKA,GAAG,CAACvD,IAAI,CAACA,IAAI,CAACuC,IAAI,CAAC;cAAA,EAAC,cAAAE,qBAAA,uBAApDA,qBAAA,CAAsD1B,UAAU;cAAA,KAC/EA,UAAU;gBAAAqC,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAAuD,SAAA,GAAAhF,0BAAA,CAEMoD,UAAU;cAAAqC,QAAA,CAAAC,IAAA;cAAAV,SAAA,CAAApE,CAAA;YAAA;cAAA,KAAAqE,KAAA,GAAAD,SAAA,CAAAnE,CAAA,IAAAC,IAAA;gBAAA2E,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAjByD,GAAG,GAAAD,KAAA,CAAAlE,KAAA;cAAA0E,QAAA,CAAAhE,IAAA;cAAA,OACC,IAAI,CAACoE,aAAa,IAAAC,MAAA,CAAIlB,IAAI,EAAAkB,MAAA,CAAGZ,GAAG,CAAE,CAAC;YAAA;cAAhDH,IAAI,GAAAU,QAAA,CAAAM,IAAA;cAAA,KACAhB,IAAI;gBAAAU,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAA,OAAAgE,QAAA,CAAAO,MAAA;YAAA;cAAAP,QAAA,CAAAhE,IAAA;cAAA;YAAA;cAAAgE,QAAA,CAAAhE,IAAA;cAAA;YAAA;cAAAgE,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAQ,EAAA,GAAAR,QAAA;cAAAT,SAAA,CAAAhE,CAAA,CAAAyE,QAAA,CAAAQ,EAAA;YAAA;cAAAR,QAAA,CAAAC,IAAA;cAAAV,SAAA,CAAA9D,CAAA;cAAA,OAAAuE,QAAA,CAAAS,MAAA;YAAA;cAAA,KAINnB,IAAI;gBAAAU,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAA,OAAAgE,QAAA,CAAAO,MAAA,WACCG,MAAM,CAAC/D,IAAI,CAAC2C,IAAI,CAAC;YAAA;cAAA,MAI1BF,IAAI,KAAK,KAAK;gBAAAY,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAAgE,QAAA,CAAAhE,IAAA;cAAA,OACe,IAAI,CAACoE,aAAa,IAAAC,MAAA,CAAIlB,IAAI,QAAK,CAAC;YAAA;cAAzDO,gBAAgB,GAAAM,QAAA,CAAAM,IAAA;cAAA,KAClBZ,gBAAgB;gBAAAM,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAA,OAAAgE,QAAA,CAAAO,MAAA,WACXG,MAAM,CAAC/D,IAAI,CAAC+C,gBAAgB,CAAC;YAAA;cAAAM,QAAA,CAAAhE,IAAA;cAAA,OAED,IAAI,CAAC2E,YAAY,CAACxB,IAAI,CAAC;YAAA;cAAtDQ,sBAAsB,GAAAK,QAAA,CAAAM,IAAA;cAAA,KACxBX,sBAAsB;gBAAAK,QAAA,CAAAhE,IAAA;gBAAA;cAAA;cAAA,OAAAgE,QAAA,CAAAO,MAAA,WACjBG,MAAM,CAAC/D,IAAI,CAACgD,sBAAsB,CAAC;YAAA;cAAA,MAIxC,IAAIiB,KAAK,CAAC,8BAA8B,CAAC;YAAA;YAAA;cAAA,OAAAZ,QAAA,CAAAa,IAAA;UAAA;QAAA,GAAA3B,OAAA;MAAA,CAChD;MAAA,SAAA4B,QAAAC,EAAA;QAAA,OAAAjC,QAAA,CAAAkC,KAAA,OAAAnB,SAAA;MAAA;MAAA,OAAAiB,OAAA;IAAA;EAAA;IAAAjC,GAAA;IAAAvD,KAAA;MAAA,IAAA2F,cAAA,OAAAlC,kBAAA,CAAAd,OAAA,EAAAe,YAAA,CAAAf,OAAA,CAAAgB,IAAA,CAOD,SAAAiC,SAA4B/B,IAAY;QAAA,IAAAG,IAAA,EAAA6B,WAAA,EAAAC,gBAAA;QAAA,OAAApC,YAAA,CAAAf,OAAA,CAAA6B,IAAA,UAAAuB,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAArB,IAAA,GAAAqB,SAAA,CAAAtF,IAAA;YAAA;cAAAsF,SAAA,CAAAtF,IAAA;cAAA,OAGrB,IAAI,CAAC2E,YAAY,CAACxB,IAAI,CAACoC,iBAAiB,CAAC,CAAC,CAAC;YAAA;cAAxDjC,IAAI,GAAAgC,SAAA,CAAAhB,IAAA;cAAA,IACHhB,IAAI;gBAAAgC,SAAA,CAAAtF,IAAA;gBAAA;cAAA;cAAAsF,SAAA,CAAAtF,IAAA;cAAA,OACM,IAAI,CAAC2E,YAAY,CAACxB,IAAI,CAAC;YAAA;cAApCG,IAAI,GAAAgC,SAAA,CAAAhB,IAAA;YAAA;cAAA,IAEDhB,IAAI;gBAAAgC,SAAA,CAAAtF,IAAA;gBAAA;cAAA;cAAA,OAAAsF,SAAA,CAAAf,MAAA,WACA5B,SAAS;YAAA;cAAA,KAEd,OAAO,CAAC/B,IAAI,CAACuC,IAAI,CAAC;gBAAAmC,SAAA,CAAAtF,IAAA;gBAAA;cAAA;cACdmF,WAAW,GAAG,IAAIK,4BAAe,CAAC,CAAC;cAAAF,SAAA,CAAAtF,IAAA;cAAA,OAEVmF,WAAW,CAACM,UAAU,CAACnC,IAAI,CAAC;YAAA;cAArD8B,gBAAgB,GAAAE,SAAA,CAAAhB,IAAA;cAAA,OAAAgB,SAAA,CAAAf,MAAA,WACfa,gBAAgB;YAAA;cAAA,OAAAE,SAAA,CAAAf,MAAA,WAElBG,MAAM,CAAC/D,IAAI,CAAC2C,IAAI,CAAC;YAAA;YAAA;cAAA,OAAAgC,SAAA,CAAAT,IAAA;UAAA;QAAA,GAAAK,QAAA;MAAA,CACzB;MAAA,SAAAd,cAAAsB,GAAA;QAAA,OAAAT,cAAA,CAAAD,KAAA,OAAAnB,SAAA;MAAA;MAAA,OAAAO,aAAA;IAAA;EAAA;IAAAvB,GAAA;IAAAvD,KAAA;MAAA,IAAAqG,aAAA,OAAA5C,kBAAA,CAAAd,OAAA,EAAAe,YAAA,CAAAf,OAAA,CAAAgB,IAAA,CAOD,SAAA2C,SAA2BzC,IAAY;QAAA,IAAA0C,QAAA,EAAAC,QAAA,EAAAC,eAAA,EAAAC,cAAA;QAAA,OAAAhD,YAAA,CAAAf,OAAA,CAAA6B,IAAA,UAAAmC,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAjC,IAAA,GAAAiC,SAAA,CAAAlG,IAAA;YAAA;cAC/B6F,QAAQ,GAAGnB,MAAM,CAAC/D,IAAI,CAAC,IAAAwF,WAAG,EAAChD,IAAI,CAAC,EAAE,KAAK,CAAC;cACxC2C,QAAQ,GAAG,IAAI,CAACM,OAAO,CAACP,QAAQ,CAAC;cAAA,IAClCC,QAAQ;gBAAAI,SAAA,CAAAlG,IAAA;gBAAA;cAAA;cAAA,OAAAkG,SAAA,CAAA3B,MAAA,WACJ5B,SAAS;YAAA;cAAAuD,SAAA,CAAAlG,IAAA;cAAA,OAGY,IAAAqG,wCAAuB,EAACP,QAAQ,CAACQ,MAAM,EAAE,IAAI,CAACzE,WAAW,CAAC;YAAA;cAAlFkE,eAAe,GAAAG,SAAA,CAAA5B,IAAA;cAAA,IAChByB,eAAe;gBAAAG,SAAA,CAAAlG,IAAA;gBAAA;cAAA;cAAA,OAAAkG,SAAA,CAAA3B,MAAA,WACX5B,SAAS;YAAA;cAGZqD,cAAc,GAAG,IAAI,CAACnE,WAAW,CAACrB,KAAK,CAC3CuF,eAAe,CAACQ,cAAc,EAC9BR,eAAe,CAACQ,cAAc,GAAGR,eAAe,CAACS,cACnD,CAAC;cAAA,OAAAN,SAAA,CAAA3B,MAAA,WAEMyB,cAAc;YAAA;YAAA;cAAA,OAAAE,SAAA,CAAArB,IAAA;UAAA;QAAA,GAAAe,QAAA;MAAA,CACtB;MAAA,SAAAjB,aAAA8B,GAAA;QAAA,OAAAd,aAAA,CAAAX,KAAA,OAAAnB,SAAA;MAAA;MAAA,OAAAc,YAAA;IAAA;EAAA;EAAA,OAAA/C,WAAA;AAAA;AAAAH,OAAA,CAAAG,WAAA,GAAAA,WAAA"}
|