@gmod/cram 4.0.3 → 4.0.5

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 (132) hide show
  1. package/README.md +53 -51
  2. package/dist/cram-bundle.js +1 -1
  3. package/dist/cramFile/codecs/_base.d.ts +1 -1
  4. package/dist/cramFile/codecs/byteArrayLength.js +3 -2
  5. package/dist/cramFile/codecs/byteArrayLength.js.map +1 -1
  6. package/dist/cramFile/codecs/external.d.ts +1 -1
  7. package/dist/cramFile/codecs/external.js +1 -4
  8. package/dist/cramFile/codecs/external.js.map +1 -1
  9. package/dist/cramFile/container/index.d.ts +16 -34
  10. package/dist/cramFile/container/index.js +5 -20
  11. package/dist/cramFile/container/index.js.map +1 -1
  12. package/dist/cramFile/file.d.ts +8 -6
  13. package/dist/cramFile/file.js +80 -82
  14. package/dist/cramFile/file.js.map +1 -1
  15. package/dist/cramFile/record.js.map +1 -1
  16. package/dist/cramFile/sectionParsers.js +3 -2
  17. package/dist/cramFile/sectionParsers.js.map +1 -1
  18. package/dist/cramFile/slice/decodeRecord.d.ts +2 -2
  19. package/dist/cramFile/slice/decodeRecord.js +10 -7
  20. package/dist/cramFile/slice/decodeRecord.js.map +1 -1
  21. package/dist/cramFile/slice/index.js +14 -16
  22. package/dist/cramFile/slice/index.js.map +1 -1
  23. package/dist/cramFile/util.d.ts +5 -2
  24. package/dist/cramFile/util.js +75 -79
  25. package/dist/cramFile/util.js.map +1 -1
  26. package/dist/htscodecs/arith_gen.d.ts +5 -7
  27. package/dist/htscodecs/arith_gen.js +122 -105
  28. package/dist/htscodecs/arith_gen.js.map +1 -1
  29. package/dist/htscodecs/arith_sh.d.ts +1 -8
  30. package/dist/htscodecs/arith_sh.js +16 -10
  31. package/dist/htscodecs/arith_sh.js.map +1 -1
  32. package/dist/htscodecs/byte_model.d.ts +1 -6
  33. package/dist/htscodecs/byte_model.js +25 -17
  34. package/dist/htscodecs/byte_model.js.map +1 -1
  35. package/dist/htscodecs/fqzcomp.d.ts +1 -1
  36. package/dist/htscodecs/fqzcomp.js +98 -77
  37. package/dist/htscodecs/fqzcomp.js.map +1 -1
  38. package/dist/htscodecs/index.d.ts +5 -5
  39. package/dist/htscodecs/index.js +53 -16
  40. package/dist/htscodecs/index.js.map +1 -1
  41. package/dist/htscodecs/iostream.d.ts +9 -20
  42. package/dist/htscodecs/iostream.js +21 -116
  43. package/dist/htscodecs/iostream.js.map +1 -1
  44. package/dist/htscodecs/rans.d.ts +1 -1
  45. package/dist/htscodecs/rans.js +65 -54
  46. package/dist/htscodecs/rans.js.map +1 -1
  47. package/dist/htscodecs/rans4x16.d.ts +1 -1
  48. package/dist/htscodecs/rans4x16.js +151 -111
  49. package/dist/htscodecs/rans4x16.js.map +1 -1
  50. package/dist/htscodecs/tok3.d.ts +1 -2
  51. package/dist/htscodecs/tok3.js +82 -239
  52. package/dist/htscodecs/tok3.js.map +1 -1
  53. package/dist/util.d.ts +1 -0
  54. package/dist/util.js +20 -0
  55. package/dist/util.js.map +1 -0
  56. package/esm/cramFile/codecs/_base.d.ts +1 -1
  57. package/esm/cramFile/codecs/byteArrayLength.js +3 -2
  58. package/esm/cramFile/codecs/byteArrayLength.js.map +1 -1
  59. package/esm/cramFile/codecs/external.d.ts +1 -1
  60. package/esm/cramFile/codecs/external.js +2 -5
  61. package/esm/cramFile/codecs/external.js.map +1 -1
  62. package/esm/cramFile/container/index.d.ts +16 -34
  63. package/esm/cramFile/container/index.js +5 -20
  64. package/esm/cramFile/container/index.js.map +1 -1
  65. package/esm/cramFile/file.d.ts +8 -6
  66. package/esm/cramFile/file.js +40 -75
  67. package/esm/cramFile/file.js.map +1 -1
  68. package/esm/cramFile/record.js.map +1 -1
  69. package/esm/cramFile/sectionParsers.js +3 -2
  70. package/esm/cramFile/sectionParsers.js.map +1 -1
  71. package/esm/cramFile/slice/decodeRecord.d.ts +2 -2
  72. package/esm/cramFile/slice/decodeRecord.js +10 -7
  73. package/esm/cramFile/slice/decodeRecord.js.map +1 -1
  74. package/esm/cramFile/slice/index.js +14 -16
  75. package/esm/cramFile/slice/index.js.map +1 -1
  76. package/esm/cramFile/util.d.ts +5 -2
  77. package/esm/cramFile/util.js +74 -77
  78. package/esm/cramFile/util.js.map +1 -1
  79. package/esm/htscodecs/arith_gen.d.ts +5 -7
  80. package/esm/htscodecs/arith_gen.js +108 -97
  81. package/esm/htscodecs/arith_gen.js.map +1 -1
  82. package/esm/htscodecs/arith_sh.d.ts +1 -8
  83. package/esm/htscodecs/arith_sh.js +14 -11
  84. package/esm/htscodecs/arith_sh.js.map +1 -1
  85. package/esm/htscodecs/byte_model.d.ts +1 -6
  86. package/esm/htscodecs/byte_model.js +23 -18
  87. package/esm/htscodecs/byte_model.js.map +1 -1
  88. package/esm/htscodecs/fqzcomp.d.ts +1 -1
  89. package/esm/htscodecs/fqzcomp.js +91 -76
  90. package/esm/htscodecs/fqzcomp.js.map +1 -1
  91. package/esm/htscodecs/index.d.ts +5 -5
  92. package/esm/htscodecs/index.js +14 -20
  93. package/esm/htscodecs/index.js.map +1 -1
  94. package/esm/htscodecs/iostream.d.ts +9 -20
  95. package/esm/htscodecs/iostream.js +19 -117
  96. package/esm/htscodecs/iostream.js.map +1 -1
  97. package/esm/htscodecs/rans.d.ts +1 -1
  98. package/esm/htscodecs/rans.js +61 -56
  99. package/esm/htscodecs/rans.js.map +1 -1
  100. package/esm/htscodecs/rans4x16.d.ts +1 -1
  101. package/esm/htscodecs/rans4x16.js +143 -109
  102. package/esm/htscodecs/rans4x16.js.map +1 -1
  103. package/esm/htscodecs/tok3.d.ts +1 -2
  104. package/esm/htscodecs/tok3.js +41 -237
  105. package/esm/htscodecs/tok3.js.map +1 -1
  106. package/esm/util.d.ts +1 -0
  107. package/esm/util.js +17 -0
  108. package/esm/util.js.map +1 -0
  109. package/package.json +3 -6
  110. package/src/cramFile/codecs/_base.ts +1 -1
  111. package/src/cramFile/codecs/byteArrayLength.ts +4 -12
  112. package/src/cramFile/codecs/external.ts +3 -7
  113. package/src/cramFile/container/index.ts +5 -24
  114. package/src/cramFile/file.ts +44 -79
  115. package/src/cramFile/record.ts +1 -1
  116. package/src/cramFile/sectionParsers.ts +5 -2
  117. package/src/cramFile/slice/decodeRecord.ts +29 -28
  118. package/src/cramFile/slice/index.ts +25 -31
  119. package/src/cramFile/util.ts +107 -106
  120. package/src/htscodecs/{arith_gen.js → arith_gen.ts} +133 -95
  121. package/src/htscodecs/{arith_sh.js → arith_sh.ts} +17 -9
  122. package/src/htscodecs/{byte_model.js → byte_model.ts} +26 -16
  123. package/src/htscodecs/{fqzcomp.js → fqzcomp.ts} +108 -74
  124. package/src/htscodecs/{index.js → index.ts} +14 -20
  125. package/src/htscodecs/iostream.ts +159 -0
  126. package/src/htscodecs/{rans.js → rans.ts} +73 -56
  127. package/src/htscodecs/{rans4x16.js → rans4x16.ts} +180 -111
  128. package/src/htscodecs/tok3.ts +197 -0
  129. package/src/util.ts +16 -0
  130. package/errors.js +0 -27
  131. package/src/htscodecs/iostream.js +0 -257
  132. package/src/htscodecs/tok3.js +0 -413
@@ -0,0 +1,159 @@
1
+ // @ts-nocheck
2
+
3
+ /*
4
+ * Copyright (c) 2019 Genome Research Ltd.
5
+ * Author(s): James Bonfield
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ *
10
+ * 1. Redistributions of source code must retain the above copyright notice,
11
+ * this list of conditions and the following disclaimer.
12
+ *
13
+ * 2. Redistributions in binary form must reproduce the above
14
+ * copyright notice, this list of conditions and the following
15
+ * disclaimer in the documentation and/or other materials provided
16
+ * with the distribution.
17
+ *
18
+ * 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
19
+ * Institute nor the names of its contributors may be used to endorse
20
+ * or promote products derived from this software without specific
21
+ * prior written permission.
22
+ *
23
+ * THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS
24
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH
27
+ * LTD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+ // Turn a buffer into a fake stream with get / put commands.
37
+ // This enables up to closely match the published pseudocode.
38
+ export default class IOStream {
39
+ buf: Uint8Array
40
+ length: number
41
+ pos: number
42
+ dataView: DataView
43
+
44
+ constructor(buf: Uint8Array, start_pos = 0, size = 0) {
45
+ if (size !== 0) {
46
+ this.buf = new Uint8Array(size)
47
+ this.length = size
48
+ } else {
49
+ this.buf = buf
50
+ this.length = buf.length
51
+ }
52
+ this.dataView = new DataView(this.buf.buffer)
53
+ this.pos = start_pos
54
+ }
55
+
56
+ // ----------
57
+ // Reading
58
+ EOF() {
59
+ return this.pos >= this.length
60
+ }
61
+
62
+ ReadData(len: number) {
63
+ const A = this.buf.slice(this.pos, this.pos + len)
64
+ this.pos += len
65
+ return A
66
+ }
67
+
68
+ ReadByte() {
69
+ const b = this.buf[this.pos]!
70
+ this.pos++
71
+ return b
72
+ }
73
+
74
+ ReadChar() {
75
+ const b = this.buf[this.pos]!
76
+ this.pos++
77
+ return String.fromCharCode(b)
78
+ }
79
+
80
+ ReadUint16() {
81
+ let i = this.ReadByte()
82
+ i |= this.ReadByte() << 8
83
+ return i
84
+ }
85
+
86
+ ReadUint32() {
87
+ const i = this.dataView.getInt32(this.pos, true)
88
+ this.pos += 4
89
+ return i
90
+ }
91
+
92
+ // nul terminated string
93
+ ReadString() {
94
+ let s = ''
95
+ let b: number
96
+ do {
97
+ b = this.buf[this.pos++]!
98
+ if (b) {
99
+ s += String.fromCharCode(b)
100
+ }
101
+ } while (b)
102
+ return s
103
+ }
104
+
105
+ ReadUint7() {
106
+ // Variable sized unsigned integers
107
+ let i = 0
108
+ let c: number
109
+ do {
110
+ c = this.ReadByte()
111
+ i = (i << 7) | (c & 0x7f)
112
+ } while (c & 0x80)
113
+
114
+ return i
115
+ }
116
+
117
+ ReadITF8() {
118
+ let i = this.buf[this.pos]!
119
+ this.pos++
120
+
121
+ // process.stderr.write("i="+i+"\n");
122
+
123
+ if (i >= 0xf0) {
124
+ // 1111xxxx => +4 bytes
125
+ i = (i & 0x0f) << 28
126
+ i +=
127
+ (this.buf[this.pos + 0]! << 20) +
128
+ (this.buf[this.pos + 1]! << 12) +
129
+ (this.buf[this.pos + 2]! << 4) +
130
+ (this.buf[this.pos + 3]! >> 4)
131
+ this.pos += 4
132
+ // process.stderr.write(" 4i="+i+"\n");
133
+ } else if (i >= 0xe0) {
134
+ // 1110xxxx => +3 bytes
135
+ i = (i & 0x0f) << 24
136
+ i +=
137
+ (this.buf[this.pos + 0]! << 16) +
138
+ (this.buf[this.pos + 1]! << 8) +
139
+ (this.buf[this.pos + 2]! << 0)
140
+ this.pos += 3
141
+ // process.stderr.write(" 3i="+i+"\n");
142
+ } else if (i >= 0xc0) {
143
+ // 110xxxxx => +2 bytes
144
+ i = (i & 0x1f) << 16
145
+ i += (this.buf[this.pos + 0]! << 8) + (this.buf[this.pos + 1]! << 0)
146
+ this.pos += 2
147
+ // process.stderr.write(" 2i="+i+"\n");
148
+ } else if (i >= 0x80) {
149
+ // 10xxxxxx => +1 bytes
150
+ i = (i & 0x3f) << 8
151
+ i += this.buf[this.pos]!
152
+ this.pos++
153
+ } else {
154
+ // 0xxxxxxx => +0 bytes
155
+ }
156
+
157
+ return i
158
+ }
159
+ }
@@ -1,3 +1,6 @@
1
+ /* eslint-disable no-var */
2
+ // @ts-nocheck
3
+
1
4
  /*
2
5
  * Copyright (c) 2019-2020 Genome Research Ltd.
3
6
  * Author(s): James Bonfield
@@ -31,9 +34,9 @@
31
34
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
35
  */
33
36
 
34
- const IOStream = require('./iostream')
37
+ import IOStream from './iostream'
35
38
 
36
- //----------------------------------------------------------------------
39
+ // ----------------------------------------------------------------------
37
40
  // rANS primitives itself
38
41
  //
39
42
  // RansGet* is decoder side
@@ -46,17 +49,21 @@ function RansGetSymbolFromFreq(C, f) {
46
49
  // NOTE: Inefficient.
47
50
  // In practice we would implement this via a precomputed
48
51
  // lookup table C2S[f]; see RansBuildC2S below.
49
- var s = 0
50
- while (f >= C[s + 1]) s++
52
+ let s = 0
53
+ while (f >= C[s + 1]) {
54
+ s++
55
+ }
51
56
 
52
57
  return s
53
58
  }
54
59
 
55
60
  function RansBuildC2S(C) {
56
- var C2S = new Array(0x1000)
57
- var s = 0
58
- for (var f = 0; f < 0x1000; f++) {
59
- while (f >= C[s + 1]) s++
61
+ const C2S = new Array(0x1000)
62
+ let s = 0
63
+ for (let f = 0; f < 0x1000; f++) {
64
+ while (f >= C[s + 1]) {
65
+ s++
66
+ }
60
67
  C2S[f] = s
61
68
  }
62
69
  return C2S
@@ -67,77 +74,83 @@ function RansAdvanceStep(R, c, f) {
67
74
  }
68
75
 
69
76
  function RansRenorm(src, R) {
70
- while (R < 1 << 23) R = (R << 8) + src.ReadByte()
77
+ while (R < 1 << 23) {
78
+ R = (R << 8) + src.ReadByte()
79
+ }
71
80
 
72
81
  return R
73
82
  }
74
- //----------------------------------------------------------------------
83
+ // ----------------------------------------------------------------------
75
84
  // Main rANS entry function: decodes a compressed src and
76
85
  // returns the uncompressed buffer.
77
- function decode(src) {
78
- var stream = new IOStream(src)
79
- var order = stream.ReadByte()
80
- var n_in = stream.ReadUint32()
81
- var n_out = stream.ReadUint32()
82
-
83
- if (order == 0) {
84
- return RansDecode0(stream, n_out)
85
- } else {
86
- return RansDecode1(stream, n_out)
87
- }
86
+ export function decode(src) {
87
+ const stream = new IOStream(src)
88
+ const order = stream.ReadByte()
89
+ const n_in = stream.ReadUint32()
90
+ const n_out = stream.ReadUint32()
91
+
92
+ return order == 0 ? RansDecode0(stream, n_out) : RansDecode1(stream, n_out)
88
93
  }
89
94
 
90
- //----------------------------------------------------------------------
95
+ // ----------------------------------------------------------------------
91
96
  // Order-0 decoder
92
97
 
93
98
  // Decode a single table of order-0 frequences,
94
99
  // filling out the F and C arrays.
95
100
  function ReadFrequencies0(src, F, C) {
96
101
  // Initialise; not in the specification - implicit?
97
- for (var i = 0; i < 256; i++) F[i] = 0
102
+ for (var i = 0; i < 256; i++) {
103
+ F[i] = 0
104
+ }
98
105
 
99
- var sym = src.ReadByte()
100
- var last_sym = sym
101
- var rle = 0
106
+ let sym = src.ReadByte()
107
+ let last_sym = sym
108
+ let rle = 0
102
109
 
103
110
  // Read F[]
104
111
  do {
105
- var f = src.ReadITF8()
112
+ const f = src.ReadITF8()
106
113
  F[sym] = f
107
114
  if (rle > 0) {
108
115
  rle--
109
116
  sym++
110
117
  } else {
111
118
  sym = src.ReadByte()
112
- if (sym == last_sym + 1) rle = src.ReadByte()
119
+ if (sym == last_sym + 1) {
120
+ rle = src.ReadByte()
121
+ }
113
122
  }
114
123
  last_sym = sym
115
124
  } while (sym != 0)
116
125
 
117
126
  // Compute C[] from F[]
118
127
  C[0] = 0
119
- for (var i = 0; i <= 255; i++) C[i + 1] = C[i] + F[i]
128
+ for (var i = 0; i <= 255; i++) {
129
+ C[i + 1] = C[i] + F[i]
130
+ }
120
131
  }
121
132
 
122
133
  function RansDecode0(src, nbytes) {
123
134
  // Decode frequencies
124
- var F = new Array(256)
125
- var C = new Array(256)
135
+ const F = new Array(256)
136
+ const C = new Array(256)
126
137
  ReadFrequencies0(src, F, C)
127
138
 
128
139
  // Fast lookup to avoid slow RansGetSymbolFromFreq
129
- var C2S = RansBuildC2S(C)
140
+ const C2S = RansBuildC2S(C)
130
141
 
131
142
  // Initialise rANS state
132
- var R = new Array(4)
133
- for (var i = 0; i < 4; i++) R[i] = src.ReadUint32()
143
+ const R = new Array(4)
144
+ for (var i = 0; i < 4; i++) {
145
+ R[i] = src.ReadUint32()
146
+ }
134
147
 
135
148
  // Main decode loop
136
- var output = new Uint8Array(nbytes)
149
+ const output = new Uint8Array(nbytes)
137
150
  for (var i = 0; i < nbytes; i++) {
138
- var i4 = i % 4
139
- var f = RansGetCumulativeFreq(R[i4])
140
- var s = C2S[f] // Equiv to RansGetSymbolFromFreq(C, f);
151
+ const i4 = i % 4
152
+ const f = RansGetCumulativeFreq(R[i4])
153
+ const s = C2S[f] // Equiv to RansGetSymbolFromFreq(C, f);
141
154
 
142
155
  output[i] = s
143
156
  R[i4] = RansAdvanceStep(R[i4], C[s], F[s])
@@ -147,22 +160,24 @@ function RansDecode0(src, nbytes) {
147
160
  return output
148
161
  }
149
162
 
150
- //----------------------------------------------------------------------
163
+ // ----------------------------------------------------------------------
151
164
  // Order-1 decoder
152
165
 
153
166
  // Decode a table of order-1 frequences,
154
167
  // filling out the F and C arrays.
155
168
  function ReadFrequencies1(src, F, C) {
156
169
  // Initialise; not in the specification - implicit?
157
- for (var i = 0; i < 256; i++) {
170
+ for (let i = 0; i < 256; i++) {
158
171
  F[i] = new Array(256)
159
172
  C[i] = new Array(256)
160
- for (var j = 0; j < 256; j++) F[i][j] = 0
173
+ for (let j = 0; j < 256; j++) {
174
+ F[i][j] = 0
175
+ }
161
176
  }
162
177
 
163
- var sym = src.ReadByte()
164
- var last_sym = sym
165
- var rle = 0
178
+ let sym = src.ReadByte()
179
+ let last_sym = sym
180
+ let rle = 0
166
181
 
167
182
  // Read F[]
168
183
  do {
@@ -173,7 +188,9 @@ function ReadFrequencies1(src, F, C) {
173
188
  sym++
174
189
  } else {
175
190
  sym = src.ReadByte()
176
- if (sym == last_sym + 1) rle = src.ReadByte()
191
+ if (sym == last_sym + 1) {
192
+ rle = src.ReadByte()
193
+ }
177
194
  }
178
195
  last_sym = sym
179
196
  } while (sym != 0)
@@ -181,30 +198,32 @@ function ReadFrequencies1(src, F, C) {
181
198
 
182
199
  function RansDecode1(src, nbytes) {
183
200
  // Decode frequencies
184
- var F = new Array(256)
185
- var C = new Array(256)
201
+ const F = new Array(256)
202
+ const C = new Array(256)
186
203
  ReadFrequencies1(src, F, C)
187
204
 
188
205
  // Fast lookup to avoid slow RansGetSymbolFromFreq
189
- var C2S = new Array(256)
190
- for (var i = 0; i < 256; i++) C2S[i] = RansBuildC2S(C[i])
206
+ const C2S = new Array(256)
207
+ for (var i = 0; i < 256; i++) {
208
+ C2S[i] = RansBuildC2S(C[i])
209
+ }
191
210
 
192
211
  // Initialise rANS state
193
- var R = new Array(4)
194
- var L = new Array(4)
212
+ const R = new Array(4)
213
+ const L = new Array(4)
195
214
  for (var j = 0; j < 4; j++) {
196
215
  R[j] = src.ReadUint32()
197
216
  L[j] = 0
198
217
  }
199
218
 
200
219
  // Main decode loop
201
- var output = new Uint8Array(nbytes)
202
- var nbytes4 = Math.floor(nbytes / 4)
220
+ const output = new Uint8Array(nbytes)
221
+ const nbytes4 = Math.floor(nbytes / 4)
203
222
  for (var i = 0; i < nbytes4; i++) {
204
223
  for (var j = 0; j < 4; j++) {
205
224
  var f = RansGetCumulativeFreq(R[j])
206
225
 
207
- //var s = RansGetSymbolFromFreq(C[L[j]], f);
226
+ // var s = RansGetSymbolFromFreq(C[L[j]], f);
208
227
  var s = C2S[L[j]][f] // Precomputed version of above
209
228
 
210
229
  output[i + j * nbytes4] = s
@@ -229,5 +248,3 @@ function RansDecode1(src, nbytes) {
229
248
 
230
249
  return output
231
250
  }
232
-
233
- module.exports = { decode }