pst-extractor 1.8.0 → 1.10.0

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.
Files changed (64) hide show
  1. package/dist/ColumnDescriptor.class.d.ts +26 -26
  2. package/dist/ColumnDescriptor.class.js +51 -48
  3. package/dist/DescriptorIndexNode.class.d.ts +25 -26
  4. package/dist/DescriptorIndexNode.class.js +53 -53
  5. package/dist/LZFu.class.d.ts +11 -12
  6. package/dist/LZFu.class.js +95 -95
  7. package/dist/NodeInfo.class.d.ts +33 -33
  8. package/dist/NodeInfo.class.js +52 -52
  9. package/dist/NodeMap.class.d.ts +35 -35
  10. package/dist/NodeMap.class.js +86 -83
  11. package/dist/OffsetIndexItem.class.d.ts +23 -24
  12. package/dist/OffsetIndexItem.class.js +45 -45
  13. package/dist/OutlookProperties.d.ts +275 -275
  14. package/dist/OutlookProperties.js +281 -281
  15. package/dist/PSTActivity.class.d.ts +103 -103
  16. package/dist/PSTActivity.class.js +144 -144
  17. package/dist/PSTAppointment.class.d.ts +270 -271
  18. package/dist/PSTAppointment.class.js +376 -376
  19. package/dist/PSTAttachment.class.d.ts +172 -172
  20. package/dist/PSTAttachment.class.js +317 -314
  21. package/dist/PSTContact.class.d.ts +884 -884
  22. package/dist/PSTContact.class.js +1227 -1227
  23. package/dist/PSTDescriptorItem.class.d.ts +45 -46
  24. package/dist/PSTDescriptorItem.class.js +99 -96
  25. package/dist/PSTFile.class.d.ts +215 -216
  26. package/dist/PSTFile.class.js +818 -792
  27. package/dist/PSTFolder.class.d.ts +129 -129
  28. package/dist/PSTFolder.class.js +318 -307
  29. package/dist/PSTMessage.class.d.ts +788 -789
  30. package/dist/PSTMessage.class.js +1321 -1318
  31. package/dist/PSTMessageStore.class.d.ts +13 -13
  32. package/dist/PSTMessageStore.class.js +17 -17
  33. package/dist/PSTNodeInputStream.class.d.ts +122 -123
  34. package/dist/PSTNodeInputStream.class.js +514 -488
  35. package/dist/PSTObject.class.d.ts +133 -134
  36. package/dist/PSTObject.class.js +326 -323
  37. package/dist/PSTRecipient.class.d.ts +65 -65
  38. package/dist/PSTRecipient.class.js +103 -103
  39. package/dist/PSTTable.class.d.ts +52 -52
  40. package/dist/PSTTable.class.js +175 -172
  41. package/dist/PSTTable7C.class.d.ts +45 -45
  42. package/dist/PSTTable7C.class.js +281 -278
  43. package/dist/PSTTableBC.class.d.ts +31 -31
  44. package/dist/PSTTableBC.class.js +111 -108
  45. package/dist/PSTTableItem.class.d.ts +47 -48
  46. package/dist/PSTTableItem.class.js +124 -121
  47. package/dist/PSTTask.class.d.ts +146 -146
  48. package/dist/PSTTask.class.js +205 -205
  49. package/dist/PSTUtil.class.d.ts +134 -135
  50. package/dist/PSTUtil.class.js +795 -790
  51. package/dist/RecurrencePattern.class.d.ts +49 -50
  52. package/dist/RecurrencePattern.class.js +120 -120
  53. package/dist/index.d.ts +6 -6
  54. package/dist/index.js +15 -15
  55. package/example/package.json +7 -7
  56. package/example/test-min.ts +31 -12
  57. package/example/{test-mem.ts → test.ts} +38 -30
  58. package/example/testdata/output.txt +278 -0
  59. package/example/testdata/outputBody.txt +3404 -0
  60. package/example/yarn.lock +112 -50
  61. package/junit.xml +36 -36
  62. package/package.json +28 -27
  63. package/readme.md +1 -3
  64. package/example/test-max.ts +0 -251
@@ -1,172 +1,175 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PSTTable = void 0;
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
5
- const long = require("long");
6
- const NodeInfo_class_1 = require("./NodeInfo.class");
7
- const PSTNodeInputStream_class_1 = require("./PSTNodeInputStream.class");
8
- // The PST Table is the workhorse of the whole system.
9
- // It allows for an item to be read and broken down into the individual properties that it consists of.
10
- // For most PST Objects, it appears that only 7c and bc table types are used.
11
- class PSTTable {
12
- /**
13
- * Creates an instance of PSTTable. The PST Table is the workhorse of the whole system.
14
- * It allows for an item to be read and broken down into the individual properties that it consists of.
15
- * For most PST Objects, it appears that only 7C and BC table types are used.
16
- * @param {PSTNodeInputStream} pstNodeInputStream
17
- * @param {Map<number, PSTDescriptorItem>} subNodeDescriptorItems
18
- * @memberof PSTTable
19
- */
20
- constructor(pstNodeInputStream, subNodeDescriptorItems) {
21
- this.numberOfKeys = 0;
22
- this.numberOfIndexLevels = 0;
23
- this.subNodeDescriptorItems = new Map();
24
- if (subNodeDescriptorItems) {
25
- this.subNodeDescriptorItems = subNodeDescriptorItems;
26
- }
27
- this.pstNodeInputStream = pstNodeInputStream;
28
- this.arrayBlocks = pstNodeInputStream.getBlockOffsets();
29
- // the next two bytes should be the table type (bSig)
30
- // 0xEC is HN (Heap-on-Node)
31
- pstNodeInputStream.seek(long.ZERO);
32
- const headdata = Buffer.alloc(4);
33
- pstNodeInputStream.readCompletely(headdata);
34
- this.tableTypeByte = headdata[3];
35
- switch (this.tableTypeByte // bClientSig
36
- ) {
37
- case 0x7c: // Table Context (TC/HN)
38
- this.tableType = '7c';
39
- break;
40
- case 188:
41
- this.tableType = 'bc'; // Property Context (PC/BTH)
42
- break;
43
- default:
44
- throw new Error('PSTTable::constructor Unable to parse table, bad table type. Unknown identifier: 0x' +
45
- headdata[3].toString(16));
46
- }
47
- this.hidUserRoot = pstNodeInputStream
48
- .seekAndReadLong(long.fromValue(4), 4)
49
- .toNumber(); // hidUserRoot
50
- // all tables should have a BTHHEADER at hnid == 0x20
51
- const headerNodeInfo = this.getNodeInfo(0x20);
52
- if (!headerNodeInfo) {
53
- throw new Error('PSTTable::constructor headerNodeInfo is null');
54
- }
55
- headerNodeInfo.pstNodeInputStream.seek(long.fromValue(headerNodeInfo.startOffset));
56
- let headerByte = headerNodeInfo.pstNodeInputStream.read() & 0xff;
57
- if (headerByte != 0xb5) {
58
- headerNodeInfo.pstNodeInputStream.seek(long.fromValue(headerNodeInfo.startOffset));
59
- headerByte = headerNodeInfo.pstNodeInputStream.read() & 0xff;
60
- headerNodeInfo.pstNodeInputStream.seek(long.fromValue(headerNodeInfo.startOffset));
61
- const tmp = Buffer.alloc(1024);
62
- headerNodeInfo.pstNodeInputStream.readCompletely(tmp);
63
- throw new Error("PSTTable::constructor Unable to parse table, can't find BTHHEADER header information: " +
64
- headerByte);
65
- }
66
- this.sizeOfItemKey = headerNodeInfo.pstNodeInputStream.read() & 0xff; // Size of key in key table
67
- this.sizeOfItemValue = headerNodeInfo.pstNodeInputStream.read() & 0xff; // Size of value in key table
68
- this.numberOfIndexLevels = headerNodeInfo.pstNodeInputStream.read() & 0xff;
69
- this.hidRoot = headerNodeInfo
70
- .seekAndReadLong(long.fromValue(4), 4)
71
- .toNumber();
72
- }
73
- /**
74
- * Release data.
75
- * @protected
76
- * @memberof PSTTable
77
- */
78
- releaseRawData() {
79
- this.subNodeDescriptorItems.clear();
80
- }
81
- /**
82
- * Number of items in table.
83
- * @readonly
84
- * @type {number}
85
- * @memberof PSTTable
86
- */
87
- get rowCount() {
88
- return this.numberOfKeys;
89
- }
90
- /**
91
- * Get information for the node in the b-tree.
92
- * @param {number} hnid
93
- * @returns {NodeInfo}
94
- * @memberof PSTTable
95
- */
96
- getNodeInfo(hnid) {
97
- // Zero-length node?
98
- if (hnid == 0) {
99
- return new NodeInfo_class_1.NodeInfo(0, 0, this.pstNodeInputStream);
100
- }
101
- // Is it a subnode ID?
102
- if (this.subNodeDescriptorItems && this.subNodeDescriptorItems.has(hnid)) {
103
- const item = this.subNodeDescriptorItems.get(hnid);
104
- let subNodeInfo = null;
105
- try {
106
- const subNodeIn = new PSTNodeInputStream_class_1.PSTNodeInputStream(this.pstNodeInputStream.pstFile, item);
107
- subNodeInfo = new NodeInfo_class_1.NodeInfo(0, subNodeIn.length.toNumber(), subNodeIn);
108
- }
109
- catch (err) {
110
- throw new Error('PSTTable::getNodeInfo: IOException reading subNode:\n' + err);
111
- }
112
- // return new NodeInfo(0, data.length, data);
113
- return subNodeInfo;
114
- }
115
- if ((hnid & 0x1f) != 0) {
116
- // Some kind of external node
117
- return null;
118
- }
119
- const whichBlock = hnid >>> 16;
120
- if (whichBlock > this.arrayBlocks.length) {
121
- throw new Error("PSTTable::getNodeInfo: block doesn't exist: " +
122
- hnid +
123
- ', ' +
124
- whichBlock +
125
- ', ' +
126
- this.arrayBlocks.length);
127
- }
128
- // A normal node in a local heap
129
- const index = (hnid & 0xffff) >> 5;
130
- let blockOffset = 0;
131
- if (whichBlock > 0) {
132
- blockOffset = this.arrayBlocks[whichBlock - 1].toNumber();
133
- }
134
- // Get offset of HN page map
135
- let iHeapNodePageMap = this.pstNodeInputStream
136
- .seekAndReadLong(long.fromValue(blockOffset), 2)
137
- .toNumber() + blockOffset;
138
- const cAlloc = this.pstNodeInputStream
139
- .seekAndReadLong(long.fromValue(iHeapNodePageMap), 2)
140
- .toNumber();
141
- if (index >= cAlloc + 1) {
142
- throw new Error("PSTTable::getNodeInfo: node index doesn't exist! nid = " + hnid);
143
- }
144
- iHeapNodePageMap += 2 * index + 2;
145
- const start = this.pstNodeInputStream
146
- .seekAndReadLong(long.fromValue(iHeapNodePageMap), 2)
147
- .toNumber() + blockOffset;
148
- const end = this.pstNodeInputStream
149
- .seekAndReadLong(long.fromValue(iHeapNodePageMap + 2), 2)
150
- .toNumber() + blockOffset;
151
- return new NodeInfo_class_1.NodeInfo(start, end, this.pstNodeInputStream);
152
- }
153
- /**
154
- * JSON stringify the object properties.
155
- * @returns {string}
156
- * @memberof PSTTable
157
- */
158
- toJSON() {
159
- const clone = Object.assign({
160
- tableType: this.tableType,
161
- tableTypeByte: this.tableTypeByte,
162
- hidUserRoot: this.hidUserRoot,
163
- sizeOfItemKey: this.sizeOfItemKey,
164
- sizeOfItemValue: this.sizeOfItemValue,
165
- hidRoot: this.hidRoot,
166
- numberOfKeys: this.numberOfKeys,
167
- numberOfIndexLevels: this.numberOfIndexLevels,
168
- }, this);
169
- return clone;
170
- }
171
- }
172
- exports.PSTTable = PSTTable;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PSTTable = void 0;
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+ const long_1 = __importDefault(require("long"));
9
+ const NodeInfo_class_1 = require("./NodeInfo.class");
10
+ const PSTNodeInputStream_class_1 = require("./PSTNodeInputStream.class");
11
+ // The PST Table is the workhorse of the whole system.
12
+ // It allows for an item to be read and broken down into the individual properties that it consists of.
13
+ // For most PST Objects, it appears that only 7c and bc table types are used.
14
+ class PSTTable {
15
+ /**
16
+ * Creates an instance of PSTTable. The PST Table is the workhorse of the whole system.
17
+ * It allows for an item to be read and broken down into the individual properties that it consists of.
18
+ * For most PST Objects, it appears that only 7C and BC table types are used.
19
+ * @param {PSTNodeInputStream} pstNodeInputStream
20
+ * @param {Map<number, PSTDescriptorItem>} subNodeDescriptorItems
21
+ * @memberof PSTTable
22
+ */
23
+ constructor(pstNodeInputStream, subNodeDescriptorItems) {
24
+ this.numberOfKeys = 0;
25
+ this.numberOfIndexLevels = 0;
26
+ this.subNodeDescriptorItems = new Map();
27
+ if (subNodeDescriptorItems) {
28
+ this.subNodeDescriptorItems = subNodeDescriptorItems;
29
+ }
30
+ this.pstNodeInputStream = pstNodeInputStream;
31
+ this.arrayBlocks = pstNodeInputStream.getBlockOffsets();
32
+ // the next two bytes should be the table type (bSig)
33
+ // 0xEC is HN (Heap-on-Node)
34
+ pstNodeInputStream.seek(long_1.default.ZERO);
35
+ const headdata = Buffer.alloc(4);
36
+ pstNodeInputStream.readCompletely(headdata);
37
+ this.tableTypeByte = headdata[3];
38
+ switch (this.tableTypeByte // bClientSig
39
+ ) {
40
+ case 0x7c: // Table Context (TC/HN)
41
+ this.tableType = '7c';
42
+ break;
43
+ case 188:
44
+ this.tableType = 'bc'; // Property Context (PC/BTH)
45
+ break;
46
+ default:
47
+ throw new Error('PSTTable::constructor Unable to parse table, bad table type. Unknown identifier: 0x' +
48
+ headdata[3].toString(16));
49
+ }
50
+ this.hidUserRoot = pstNodeInputStream
51
+ .seekAndReadLong(long_1.default.fromValue(4), 4)
52
+ .toNumber(); // hidUserRoot
53
+ // all tables should have a BTHHEADER at hnid == 0x20
54
+ const headerNodeInfo = this.getNodeInfo(0x20);
55
+ if (!headerNodeInfo) {
56
+ throw new Error('PSTTable::constructor headerNodeInfo is null');
57
+ }
58
+ headerNodeInfo.pstNodeInputStream.seek(long_1.default.fromValue(headerNodeInfo.startOffset));
59
+ let headerByte = headerNodeInfo.pstNodeInputStream.read() & 0xff;
60
+ if (headerByte != 0xb5) {
61
+ headerNodeInfo.pstNodeInputStream.seek(long_1.default.fromValue(headerNodeInfo.startOffset));
62
+ headerByte = headerNodeInfo.pstNodeInputStream.read() & 0xff;
63
+ headerNodeInfo.pstNodeInputStream.seek(long_1.default.fromValue(headerNodeInfo.startOffset));
64
+ const tmp = Buffer.alloc(1024);
65
+ headerNodeInfo.pstNodeInputStream.readCompletely(tmp);
66
+ throw new Error("PSTTable::constructor Unable to parse table, can't find BTHHEADER header information: " +
67
+ headerByte);
68
+ }
69
+ this.sizeOfItemKey = headerNodeInfo.pstNodeInputStream.read() & 0xff; // Size of key in key table
70
+ this.sizeOfItemValue = headerNodeInfo.pstNodeInputStream.read() & 0xff; // Size of value in key table
71
+ this.numberOfIndexLevels = headerNodeInfo.pstNodeInputStream.read() & 0xff;
72
+ this.hidRoot = headerNodeInfo
73
+ .seekAndReadLong(long_1.default.fromValue(4), 4)
74
+ .toNumber();
75
+ }
76
+ /**
77
+ * Release data.
78
+ * @protected
79
+ * @memberof PSTTable
80
+ */
81
+ releaseRawData() {
82
+ this.subNodeDescriptorItems.clear();
83
+ }
84
+ /**
85
+ * Number of items in table.
86
+ * @readonly
87
+ * @type {number}
88
+ * @memberof PSTTable
89
+ */
90
+ get rowCount() {
91
+ return this.numberOfKeys;
92
+ }
93
+ /**
94
+ * Get information for the node in the b-tree.
95
+ * @param {number} hnid
96
+ * @returns {NodeInfo}
97
+ * @memberof PSTTable
98
+ */
99
+ getNodeInfo(hnid) {
100
+ // Zero-length node?
101
+ if (hnid == 0) {
102
+ return new NodeInfo_class_1.NodeInfo(0, 0, this.pstNodeInputStream);
103
+ }
104
+ // Is it a subnode ID?
105
+ if (this.subNodeDescriptorItems && this.subNodeDescriptorItems.has(hnid)) {
106
+ const item = this.subNodeDescriptorItems.get(hnid);
107
+ let subNodeInfo = null;
108
+ try {
109
+ const subNodeIn = new PSTNodeInputStream_class_1.PSTNodeInputStream(this.pstNodeInputStream.pstFile, item);
110
+ subNodeInfo = new NodeInfo_class_1.NodeInfo(0, subNodeIn.length.toNumber(), subNodeIn);
111
+ }
112
+ catch (err) {
113
+ throw new Error('PSTTable::getNodeInfo: IOException reading subNode:\n' + err);
114
+ }
115
+ // return new NodeInfo(0, data.length, data);
116
+ return subNodeInfo;
117
+ }
118
+ if ((hnid & 0x1f) != 0) {
119
+ // Some kind of external node
120
+ return null;
121
+ }
122
+ const whichBlock = hnid >>> 16;
123
+ if (whichBlock > this.arrayBlocks.length) {
124
+ throw new Error("PSTTable::getNodeInfo: block doesn't exist: " +
125
+ hnid +
126
+ ', ' +
127
+ whichBlock +
128
+ ', ' +
129
+ this.arrayBlocks.length);
130
+ }
131
+ // A normal node in a local heap
132
+ const index = (hnid & 0xffff) >> 5;
133
+ let blockOffset = 0;
134
+ if (whichBlock > 0) {
135
+ blockOffset = this.arrayBlocks[whichBlock - 1].toNumber();
136
+ }
137
+ // Get offset of HN page map
138
+ let iHeapNodePageMap = this.pstNodeInputStream
139
+ .seekAndReadLong(long_1.default.fromValue(blockOffset), 2)
140
+ .toNumber() + blockOffset;
141
+ const cAlloc = this.pstNodeInputStream
142
+ .seekAndReadLong(long_1.default.fromValue(iHeapNodePageMap), 2)
143
+ .toNumber();
144
+ if (index >= cAlloc + 1) {
145
+ throw new Error("PSTTable::getNodeInfo: node index doesn't exist! nid = " + hnid);
146
+ }
147
+ iHeapNodePageMap += 2 * index + 2;
148
+ const start = this.pstNodeInputStream
149
+ .seekAndReadLong(long_1.default.fromValue(iHeapNodePageMap), 2)
150
+ .toNumber() + blockOffset;
151
+ const end = this.pstNodeInputStream
152
+ .seekAndReadLong(long_1.default.fromValue(iHeapNodePageMap + 2), 2)
153
+ .toNumber() + blockOffset;
154
+ return new NodeInfo_class_1.NodeInfo(start, end, this.pstNodeInputStream);
155
+ }
156
+ /**
157
+ * JSON stringify the object properties.
158
+ * @returns {string}
159
+ * @memberof PSTTable
160
+ */
161
+ toJSON() {
162
+ const clone = Object.assign({
163
+ tableType: this.tableType,
164
+ tableTypeByte: this.tableTypeByte,
165
+ hidUserRoot: this.hidUserRoot,
166
+ sizeOfItemKey: this.sizeOfItemKey,
167
+ sizeOfItemValue: this.sizeOfItemValue,
168
+ hidRoot: this.hidRoot,
169
+ numberOfKeys: this.numberOfKeys,
170
+ numberOfIndexLevels: this.numberOfIndexLevels,
171
+ }, this);
172
+ return clone;
173
+ }
174
+ }
175
+ exports.PSTTable = PSTTable;
@@ -1,45 +1,45 @@
1
- import { PSTDescriptorItem } from './PSTDescriptorItem.class';
2
- import { PSTNodeInputStream } from './PSTNodeInputStream.class';
3
- import { PSTTable } from './PSTTable.class';
4
- import { PSTTableItem } from './PSTTableItem.class';
5
- export declare class PSTTable7C extends PSTTable {
6
- private items;
7
- private numberOfDataSets;
8
- private BLOCK_SIZE;
9
- private numColumns;
10
- private TCI_bm;
11
- private TCI_1b;
12
- private columnDescriptors;
13
- private overrideCol;
14
- private rowNodeInfo;
15
- private keyMap;
16
- /**
17
- * Creates an instance of PSTTable7C ("Table Context").
18
- * @param {PSTNodeInputStream} pstNodeInputStream
19
- * @param {Map<number, PSTDescriptorItem>} subNodeDescriptorItems
20
- * @param {number} [entityToExtract]
21
- * @memberof PSTTable7C
22
- */
23
- constructor(pstNodeInputStream: PSTNodeInputStream, subNodeDescriptorItems?: Map<number, PSTDescriptorItem>, entityToExtract?: number);
24
- /**
25
- * Get items from the table.
26
- * @param {number} [startAtRecord]
27
- * @param {number} [numberOfRecordsToReturn]
28
- * @returns {Map<number, PSTTableItem>[]}
29
- * @memberof PSTTable7C
30
- */
31
- getItems(startAtRecord?: number, numberOfRecordsToReturn?: number): Map<number, PSTTableItem>[];
32
- /**
33
- * Get the number of rows.
34
- * @readonly
35
- * @type {number}
36
- * @memberof PSTTable7C
37
- */
38
- get rowCount(): number;
39
- /**
40
- * JSON stringify the object properties.
41
- * @returns {string}
42
- * @memberof PSTTable7C
43
- */
44
- toJSON(): any;
45
- }
1
+ import { PSTDescriptorItem } from './PSTDescriptorItem.class';
2
+ import { PSTNodeInputStream } from './PSTNodeInputStream.class';
3
+ import { PSTTable } from './PSTTable.class';
4
+ import { PSTTableItem } from './PSTTableItem.class';
5
+ export declare class PSTTable7C extends PSTTable {
6
+ private items;
7
+ private numberOfDataSets;
8
+ private BLOCK_SIZE;
9
+ private numColumns;
10
+ private TCI_bm;
11
+ private TCI_1b;
12
+ private columnDescriptors;
13
+ private overrideCol;
14
+ private rowNodeInfo;
15
+ private keyMap;
16
+ /**
17
+ * Creates an instance of PSTTable7C ("Table Context").
18
+ * @param {PSTNodeInputStream} pstNodeInputStream
19
+ * @param {Map<number, PSTDescriptorItem>} subNodeDescriptorItems
20
+ * @param {number} [entityToExtract]
21
+ * @memberof PSTTable7C
22
+ */
23
+ constructor(pstNodeInputStream: PSTNodeInputStream, subNodeDescriptorItems?: Map<number, PSTDescriptorItem>, entityToExtract?: number);
24
+ /**
25
+ * Get items from the table.
26
+ * @param {number} [startAtRecord]
27
+ * @param {number} [numberOfRecordsToReturn]
28
+ * @returns {Map<number, PSTTableItem>[]}
29
+ * @memberof PSTTable7C
30
+ */
31
+ getItems(startAtRecord?: number, numberOfRecordsToReturn?: number): Map<number, PSTTableItem>[];
32
+ /**
33
+ * Get the number of rows.
34
+ * @readonly
35
+ * @type {number}
36
+ * @memberof PSTTable7C
37
+ */
38
+ get rowCount(): number;
39
+ /**
40
+ * JSON stringify the object properties.
41
+ * @returns {string}
42
+ * @memberof PSTTable7C
43
+ */
44
+ toJSON(): any;
45
+ }