cafe-utility 33.8.0 → 33.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.
- package/index.d.ts +6 -0
- package/index.js +470 -455
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -10,10 +10,10 @@ async function raceFulfilled(n) {
|
|
|
10
10
|
async function runInParallelBatches(n, e = 1) {
|
|
11
11
|
const t = splitByCount(n, e),
|
|
12
12
|
r = [],
|
|
13
|
-
|
|
14
|
-
for (const u of
|
|
13
|
+
i = t.map(async o => {
|
|
14
|
+
for (const u of o) r.push(await u())
|
|
15
15
|
})
|
|
16
|
-
return await Promise.all(
|
|
16
|
+
return await Promise.all(i), r
|
|
17
17
|
}
|
|
18
18
|
async function sleepMillis(n) {
|
|
19
19
|
return new Promise(e =>
|
|
@@ -25,8 +25,8 @@ async function sleepMillis(n) {
|
|
|
25
25
|
function shuffle(n, e = Math.random) {
|
|
26
26
|
for (let t = n.length - 1; t > 0; t--) {
|
|
27
27
|
const r = Math.floor(e() * (t + 1)),
|
|
28
|
-
|
|
29
|
-
;(n[t] = n[r]), (n[r] =
|
|
28
|
+
i = n[t]
|
|
29
|
+
;(n[t] = n[r]), (n[r] = i)
|
|
30
30
|
}
|
|
31
31
|
return n
|
|
32
32
|
}
|
|
@@ -59,15 +59,15 @@ function rotate2DArray(n) {
|
|
|
59
59
|
}
|
|
60
60
|
function initialize2DArray(n, e, t) {
|
|
61
61
|
const r = []
|
|
62
|
-
for (let
|
|
62
|
+
for (let i = 0; i < n; i++) {
|
|
63
63
|
r.push([])
|
|
64
|
-
for (let
|
|
64
|
+
for (let o = 0; o < e; o++) r[i].push(t)
|
|
65
65
|
}
|
|
66
66
|
return r
|
|
67
67
|
}
|
|
68
68
|
function containsShape(n, e, t, r) {
|
|
69
69
|
if (t < 0 || r < 0 || r + e[0].length > n[0].length || t + e.length > n.length) return !1
|
|
70
|
-
for (let
|
|
70
|
+
for (let i = 0; i < e.length; i++) for (let o = 0; o < e[i].length; o++) if (e[i][o] !== void 0 && n[t + i][r + o] !== e[i][o]) return !1
|
|
71
71
|
return !0
|
|
72
72
|
}
|
|
73
73
|
function pickRandomIndices(n, e, t = Math.random) {
|
|
@@ -97,10 +97,10 @@ function containsPoint(n, e, t) {
|
|
|
97
97
|
return e >= n.x && e < n.x + n.width && t >= n.y && t < n.y + n.height
|
|
98
98
|
}
|
|
99
99
|
function randomPoint(n, e, t, r = Math.random) {
|
|
100
|
-
let
|
|
101
|
-
do (
|
|
102
|
-
while (t && containsPoint(t,
|
|
103
|
-
return [
|
|
100
|
+
let i, o
|
|
101
|
+
do (i = intBetween(0, n - 1, r)), (o = intBetween(0, e - 1, r))
|
|
102
|
+
while (t && containsPoint(t, i, o))
|
|
103
|
+
return [i, o]
|
|
104
104
|
}
|
|
105
105
|
function procs(n, e = Math.random) {
|
|
106
106
|
const t = Math.floor(n),
|
|
@@ -115,68 +115,68 @@ function pick(n, e = Math.random) {
|
|
|
115
115
|
}
|
|
116
116
|
function pickMany(n, e, t = Math.random) {
|
|
117
117
|
if (e > n.length) throw new Error(`Count (${e}) is greater than array length (${n.length})`)
|
|
118
|
-
return pickRandomIndices(n, e, t).map(
|
|
118
|
+
return pickRandomIndices(n, e, t).map(i => n[i])
|
|
119
119
|
}
|
|
120
120
|
function pickManyUnique(n, e, t, r = Math.random) {
|
|
121
121
|
if (e > n.length) throw new Error(`Count (${e}) is greater than array length (${n.length})`)
|
|
122
|
-
const
|
|
123
|
-
for (;
|
|
124
|
-
const
|
|
125
|
-
|
|
122
|
+
const i = []
|
|
123
|
+
for (; i.length < e; ) {
|
|
124
|
+
const o = pick(n, r)
|
|
125
|
+
i.some(u => t(u, o)) || i.push(o)
|
|
126
126
|
}
|
|
127
|
-
return
|
|
127
|
+
return i
|
|
128
128
|
}
|
|
129
|
-
function pickGuaranteed(n, e, t, r,
|
|
129
|
+
function pickGuaranteed(n, e, t, r, i, o = Math.random) {
|
|
130
130
|
const u = n.filter(c => c !== e && c !== t),
|
|
131
131
|
s = []
|
|
132
132
|
for (e !== null && s.push(e); u.length && s.length < r; ) {
|
|
133
|
-
const c = exports.Random.intBetween(0, u.length - 1,
|
|
134
|
-
|
|
133
|
+
const c = exports.Random.intBetween(0, u.length - 1, o)
|
|
134
|
+
i(u[c], s) && s.push(u[c]), u.splice(c, 1)
|
|
135
135
|
}
|
|
136
|
-
return shuffle(s,
|
|
136
|
+
return shuffle(s, o), { values: s, indexOfGuaranteed: e !== null ? s.indexOf(e) : -1 }
|
|
137
137
|
}
|
|
138
138
|
function last(n) {
|
|
139
139
|
if (!n.length) throw Error('Received empty array')
|
|
140
140
|
return n[n.length - 1]
|
|
141
141
|
}
|
|
142
142
|
function pipe(n, e, t) {
|
|
143
|
-
return t(e.reduce((r,
|
|
143
|
+
return t(e.reduce((r, i) => i(r), n))
|
|
144
144
|
}
|
|
145
145
|
function makePipe(n, e) {
|
|
146
146
|
return t => pipe(t, n, e)
|
|
147
147
|
}
|
|
148
148
|
function pickWeighted(n, e, t) {
|
|
149
149
|
if ((t === void 0 && (t = Math.random()), n.length !== e.length)) throw new Error('Array length mismatch')
|
|
150
|
-
let r = e.reduce((
|
|
151
|
-
const
|
|
152
|
-
for (let
|
|
150
|
+
let r = e.reduce((o, u) => o + u, 0)
|
|
151
|
+
const i = t * r
|
|
152
|
+
for (let o = 0; o < n.length - 1; o++) if (((r -= e[o]), i >= r)) return n[o]
|
|
153
153
|
return last(n)
|
|
154
154
|
}
|
|
155
155
|
function sortWeighted(n, e, t = Math.random) {
|
|
156
|
-
const r = e.map(
|
|
157
|
-
|
|
158
|
-
for (let
|
|
159
|
-
return
|
|
156
|
+
const r = e.map(o => t() * o),
|
|
157
|
+
i = []
|
|
158
|
+
for (let o = 0; o < n.length; o++) i.push([n[o], r[o]])
|
|
159
|
+
return i.sort((o, u) => u[1] - o[1]).map(o => o[0])
|
|
160
160
|
}
|
|
161
161
|
function getDeep(n, e) {
|
|
162
162
|
if (n == null) return null
|
|
163
163
|
const t = e.split('.')
|
|
164
164
|
let r = n
|
|
165
|
-
for (const
|
|
166
|
-
if (r[
|
|
167
|
-
r = r[
|
|
165
|
+
for (const i of t) {
|
|
166
|
+
if (r[i] === null || r[i] === void 0) return null
|
|
167
|
+
r = r[i]
|
|
168
168
|
}
|
|
169
169
|
return r
|
|
170
170
|
}
|
|
171
171
|
function setDeep(n, e, t) {
|
|
172
172
|
const r = e.split(/\.|\[/)
|
|
173
|
-
let
|
|
174
|
-
for (let
|
|
175
|
-
const u = r[
|
|
176
|
-
s =
|
|
173
|
+
let i = n
|
|
174
|
+
for (let o = 0; o < r.length; o++) {
|
|
175
|
+
const u = r[o],
|
|
176
|
+
s = o < r.length - 1 && r[o + 1].includes(']'),
|
|
177
177
|
f = u.includes(']') ? u.replace(/\[|\]/g, '') : u
|
|
178
|
-
if (
|
|
179
|
-
isObject(
|
|
178
|
+
if (o === r.length - 1) return (i[f] = t), t
|
|
179
|
+
isObject(i[f]) || (s ? (i[f] = []) : (i[f] = {})), (i = i[f])
|
|
180
180
|
}
|
|
181
181
|
return t
|
|
182
182
|
}
|
|
@@ -191,8 +191,8 @@ function deleteDeep(n, e) {
|
|
|
191
191
|
const t = beforeLast(e, '.'),
|
|
192
192
|
r = afterLast(e, '.')
|
|
193
193
|
if (!t || !r) return
|
|
194
|
-
const
|
|
195
|
-
|
|
194
|
+
const i = getDeep(n, t)
|
|
195
|
+
i && delete i[r]
|
|
196
196
|
}
|
|
197
197
|
function replaceDeep(n, e, t) {
|
|
198
198
|
const r = getDeep(n, e)
|
|
@@ -201,8 +201,8 @@ function replaceDeep(n, e, t) {
|
|
|
201
201
|
}
|
|
202
202
|
function getFirstDeep(n, e, t) {
|
|
203
203
|
for (const r of e) {
|
|
204
|
-
const
|
|
205
|
-
if (
|
|
204
|
+
const i = getDeep(n, r)
|
|
205
|
+
if (i) return i
|
|
206
206
|
}
|
|
207
207
|
if (t) {
|
|
208
208
|
const r = Object.values(n)
|
|
@@ -231,7 +231,7 @@ function whereAmI() {
|
|
|
231
231
|
const n = globalThis.process
|
|
232
232
|
return n ? (n.browser === !0 ? 'browser' : 'node') : 'browser'
|
|
233
233
|
}
|
|
234
|
-
async function withRetries(n, e, t, r,
|
|
234
|
+
async function withRetries(n, e, t, r, i, o) {
|
|
235
235
|
let u = null
|
|
236
236
|
for (let s = 0; s <= e; s++)
|
|
237
237
|
try {
|
|
@@ -239,7 +239,7 @@ async function withRetries(n, e, t, r, o, i) {
|
|
|
239
239
|
} catch (c) {
|
|
240
240
|
if (((u = c), s === e)) break
|
|
241
241
|
const f = t + (r - t) * (s / (e - 1))
|
|
242
|
-
|
|
242
|
+
i && i('Error in withRetries, retrying', { attempt: s + 1, allowedFailures: e, delayMillis: f, error: c }), o && o(), await sleepMillis(f)
|
|
243
243
|
}
|
|
244
244
|
throw u
|
|
245
245
|
}
|
|
@@ -258,11 +258,11 @@ function rgbToHex(n) {
|
|
|
258
258
|
return '#' + n.map(e => e.toString(16).padStart(2, '0')).join('')
|
|
259
259
|
}
|
|
260
260
|
function haversineDistanceToMeters(n, e, t, r) {
|
|
261
|
-
const
|
|
261
|
+
const o = (n * Math.PI) / 180,
|
|
262
262
|
u = (t * Math.PI) / 180,
|
|
263
263
|
s = ((t - n) * Math.PI) / 180,
|
|
264
264
|
c = ((r - e) * Math.PI) / 180,
|
|
265
|
-
f = Math.sin(s / 2) * Math.sin(s / 2) + Math.cos(
|
|
265
|
+
f = Math.sin(s / 2) * Math.sin(s / 2) + Math.cos(o) * Math.cos(u) * Math.sin(c / 2) * Math.sin(c / 2)
|
|
266
266
|
return 6371e3 * (2 * Math.atan2(Math.sqrt(f), Math.sqrt(1 - f)))
|
|
267
267
|
}
|
|
268
268
|
function roundToNearest(n, e) {
|
|
@@ -281,20 +281,20 @@ function searchFloat(n) {
|
|
|
281
281
|
}
|
|
282
282
|
function binomialSample(n, e, t = Math.random) {
|
|
283
283
|
const r = n * e,
|
|
284
|
-
|
|
284
|
+
i = Math.sqrt(n * e * (1 - e)),
|
|
285
285
|
u = (t() + t() + t() + t() + t() + t() - 3) * Math.SQRT2,
|
|
286
|
-
s = Math.round(r +
|
|
286
|
+
s = Math.round(r + i * u)
|
|
287
287
|
return Math.max(0, Math.min(n, s))
|
|
288
288
|
}
|
|
289
289
|
function toSignificantDigits(n, e) {
|
|
290
290
|
if (!n.includes('.')) return n
|
|
291
291
|
if (parseFloat(n) === 0) return '0'
|
|
292
292
|
const [t, r] = n.split('.'),
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
if (
|
|
296
|
-
if (!(
|
|
297
|
-
const f = e -
|
|
293
|
+
i = t.replace('-', ''),
|
|
294
|
+
o = i.length
|
|
295
|
+
if (o >= e) return t
|
|
296
|
+
if (!(i === '0')) {
|
|
297
|
+
const f = e - o,
|
|
298
298
|
l = r.slice(0, f)
|
|
299
299
|
return /[1-9]/.test(l) ? `${t}.${l.replace(/0+$/, '')}` : t
|
|
300
300
|
}
|
|
@@ -380,7 +380,7 @@ function searchHex(n, e) {
|
|
|
380
380
|
}
|
|
381
381
|
function searchSubstring(n, e, t = symbolsArray) {
|
|
382
382
|
const r = splitAll(n, t)
|
|
383
|
-
for (const
|
|
383
|
+
for (const i of r) if (e(i)) return i
|
|
384
384
|
return null
|
|
385
385
|
}
|
|
386
386
|
function randomHexString(n, e = Math.random) {
|
|
@@ -460,9 +460,9 @@ function asTime(n, e) {
|
|
|
460
460
|
const t = n.split(':')
|
|
461
461
|
if (t.length !== 2) throw new TypeError(`Expected time${e?.name ? ` for ${e.name}` : ''}, got: ` + n)
|
|
462
462
|
const r = parseInt(t[0], 10),
|
|
463
|
-
|
|
464
|
-
if (!isNumber(r) || !isNumber(
|
|
465
|
-
return `${String(r).padStart(2, '0')}:${String(
|
|
463
|
+
i = parseInt(t[1], 10)
|
|
464
|
+
if (!isNumber(r) || !isNumber(i) || r < 0 || r > 23 || i < 0 || i > 59) throw new TypeError(`Expected time, got${e?.name ? ` for ${e.name}` : ''}: ` + n)
|
|
465
|
+
return `${String(r).padStart(2, '0')}:${String(i).padStart(2, '0')}`
|
|
466
466
|
}
|
|
467
467
|
function asArray(n, e) {
|
|
468
468
|
if (!Array.isArray(n)) throw new TypeError(`Expected array${e?.name ? ` for ${e.name}` : ''}, got: ` + n)
|
|
@@ -483,8 +483,8 @@ function asStringMap(n, e) {
|
|
|
483
483
|
function asNumericDictionary(n, e) {
|
|
484
484
|
const t = asObject(n),
|
|
485
485
|
r = Object.keys(t),
|
|
486
|
-
|
|
487
|
-
if (!r.every(isString) || !
|
|
486
|
+
i = Object.values(t)
|
|
487
|
+
if (!r.every(isString) || !i.every(isNumber)) throw new TypeError(`Expected numeric dictionary${e?.name ? ` for ${e.name}` : ''}, got: ` + n)
|
|
488
488
|
return t
|
|
489
489
|
}
|
|
490
490
|
function isUrl(n) {
|
|
@@ -531,16 +531,16 @@ function represent(n, e = 'json', t = 0) {
|
|
|
531
531
|
if (t > 1) return '[object Object]'
|
|
532
532
|
if (e === 'json') {
|
|
533
533
|
if (Array.isArray(n)) {
|
|
534
|
-
const
|
|
535
|
-
return t === 0 ? JSON.stringify(
|
|
534
|
+
const i = n.map(o => represent(o, 'json', t + 1))
|
|
535
|
+
return t === 0 ? JSON.stringify(i) : i
|
|
536
536
|
}
|
|
537
537
|
const r = {}
|
|
538
538
|
n.message && (r.message = represent(n.message, 'json', t + 1))
|
|
539
|
-
for (const [
|
|
539
|
+
for (const [i, o] of Object.entries(n)) r[i] = represent(o, 'json', t + 1)
|
|
540
540
|
return t === 0 ? JSON.stringify(r) : r
|
|
541
541
|
} else if (e === 'key-value') {
|
|
542
542
|
const r = Object.keys(n)
|
|
543
|
-
return n.message && !r.includes('message') && r.unshift('message'), r.map(
|
|
543
|
+
return n.message && !r.includes('message') && r.unshift('message'), r.map(i => `${i}=${JSON.stringify(represent(n[i], 'json', t + 1))}`).join(' ')
|
|
544
544
|
}
|
|
545
545
|
}
|
|
546
546
|
return isUndefined(n) && (n = 'undefined'), t === 0 ? JSON.stringify(n) : n
|
|
@@ -549,7 +549,7 @@ function expandError(n, e) {
|
|
|
549
549
|
if (isString(n)) return n
|
|
550
550
|
const t = Object.keys(n)
|
|
551
551
|
n.message && !t.includes('message') && t.push('message')
|
|
552
|
-
const r = t.map(
|
|
552
|
+
const r = t.map(i => `${i}: ${n[i]}`).join('; ')
|
|
553
553
|
return e && n.stack
|
|
554
554
|
? r +
|
|
555
555
|
`
|
|
@@ -571,7 +571,7 @@ function deepMerge3(n, e, t) {
|
|
|
571
571
|
}
|
|
572
572
|
function zip(n, e) {
|
|
573
573
|
const t = {}
|
|
574
|
-
for (const r of n) for (const
|
|
574
|
+
for (const r of n) for (const i of Object.keys(r)) t[i] ? (t[i] = e(t[i], r[i])) : (t[i] = r[i])
|
|
575
575
|
return t
|
|
576
576
|
}
|
|
577
577
|
function zipSum(n) {
|
|
@@ -630,9 +630,9 @@ function asEither(n, e) {
|
|
|
630
630
|
function scheduleMany(n, e) {
|
|
631
631
|
for (let t = 0; t < n.length; t++) {
|
|
632
632
|
const r = n[t],
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
setTimeout(r,
|
|
633
|
+
i = e[t],
|
|
634
|
+
o = Math.max(0, i.getTime() - Date.now())
|
|
635
|
+
setTimeout(r, o)
|
|
636
636
|
}
|
|
637
637
|
}
|
|
638
638
|
function interpolate(n, e, t) {
|
|
@@ -645,7 +645,7 @@ function average(n) {
|
|
|
645
645
|
return n.reduce((e, t) => e + t, 0) / n.length
|
|
646
646
|
}
|
|
647
647
|
function median(n) {
|
|
648
|
-
const e = [...n].sort((r,
|
|
648
|
+
const e = [...n].sort((r, i) => r - i),
|
|
649
649
|
t = Math.floor(e.length / 2)
|
|
650
650
|
return e.length % 2 === 0 ? (e[t] + e[t - 1]) / 2 : e[t]
|
|
651
651
|
}
|
|
@@ -743,7 +743,7 @@ function splitOnce(n, e, t = !1) {
|
|
|
743
743
|
}
|
|
744
744
|
function splitAll(n, e) {
|
|
745
745
|
let t = [n]
|
|
746
|
-
for (const r of e) t = t.flatMap(
|
|
746
|
+
for (const r of e) t = t.flatMap(i => i.split(r))
|
|
747
747
|
return t.filter(r => r)
|
|
748
748
|
}
|
|
749
749
|
function getExtension(n) {
|
|
@@ -781,11 +781,11 @@ function expand(n) {
|
|
|
781
781
|
t = n.match(e)
|
|
782
782
|
if (!t || !t.index) return [n]
|
|
783
783
|
const r = t[1].split(','),
|
|
784
|
-
|
|
785
|
-
|
|
784
|
+
i = n.slice(0, t.index),
|
|
785
|
+
o = n.slice(t.index + t[0].length)
|
|
786
786
|
let u = []
|
|
787
787
|
for (const s of r) {
|
|
788
|
-
const c = expand(
|
|
788
|
+
const c = expand(i + s + o)
|
|
789
789
|
u = u.concat(c)
|
|
790
790
|
}
|
|
791
791
|
return u
|
|
@@ -827,34 +827,34 @@ function isWordBreakCharacter(n) {
|
|
|
827
827
|
function isValidObjectPathCharacter(n) {
|
|
828
828
|
return isLetterOrDigit(n) || n === '.' || n === '[' || n === ']' || n === '_'
|
|
829
829
|
}
|
|
830
|
-
function insertString(n, e, t, r,
|
|
831
|
-
return n.slice(0, e) + r + n.slice(e, e + t) +
|
|
830
|
+
function insertString(n, e, t, r, i) {
|
|
831
|
+
return n.slice(0, e) + r + n.slice(e, e + t) + i + n.slice(e + t)
|
|
832
832
|
}
|
|
833
833
|
function indexOfRegex(n, e, t = 0) {
|
|
834
834
|
const r = e.exec(n.slice(t))
|
|
835
835
|
return r ? { index: r.index, match: r[0] } : null
|
|
836
836
|
}
|
|
837
837
|
function lineMatches(n, e, t = !0) {
|
|
838
|
-
if (!t) return e.every(
|
|
838
|
+
if (!t) return e.every(i => (i instanceof RegExp ? i.test(n) : n.indexOf(i, 0) !== -1))
|
|
839
839
|
let r = 0
|
|
840
|
-
for (const
|
|
841
|
-
if (
|
|
842
|
-
const
|
|
843
|
-
if (!
|
|
844
|
-
r =
|
|
840
|
+
for (const i of e)
|
|
841
|
+
if (i instanceof RegExp) {
|
|
842
|
+
const o = indexOfRegex(n, i, r)
|
|
843
|
+
if (!o) return !1
|
|
844
|
+
r = o.index + o.match.length
|
|
845
845
|
} else {
|
|
846
|
-
const
|
|
847
|
-
if (
|
|
848
|
-
r =
|
|
846
|
+
const o = n.indexOf(i, r)
|
|
847
|
+
if (o === -1) return !1
|
|
848
|
+
r = o + i.length
|
|
849
849
|
}
|
|
850
850
|
return !0
|
|
851
851
|
}
|
|
852
852
|
function linesMatchInOrder(n, e, t = !0) {
|
|
853
853
|
let r = 0
|
|
854
|
-
for (const
|
|
855
|
-
let
|
|
856
|
-
for (; !
|
|
857
|
-
if (!
|
|
854
|
+
for (const i of e) {
|
|
855
|
+
let o = !1
|
|
856
|
+
for (; !o && r < n.length; ) lineMatches(n[r], i, t) && (o = !0), r++
|
|
857
|
+
if (!o) return !1
|
|
858
858
|
}
|
|
859
859
|
return !0
|
|
860
860
|
}
|
|
@@ -863,15 +863,15 @@ function csvEscape(n) {
|
|
|
863
863
|
}
|
|
864
864
|
function allIndexOf(n, e, t = 0) {
|
|
865
865
|
const r = []
|
|
866
|
-
let
|
|
867
|
-
for (;
|
|
866
|
+
let i = n.indexOf(e, t)
|
|
867
|
+
for (; i !== -1; ) r.push(i), (i = n.indexOf(e, i + e.length))
|
|
868
868
|
return r
|
|
869
869
|
}
|
|
870
870
|
function indexOfEarliest(n, e, t = 0) {
|
|
871
871
|
let r = -1
|
|
872
|
-
for (const
|
|
873
|
-
const
|
|
874
|
-
|
|
872
|
+
for (const i of e) {
|
|
873
|
+
const o = n.indexOf(i, t)
|
|
874
|
+
o !== -1 && (r === -1 || o < r) && (r = o)
|
|
875
875
|
}
|
|
876
876
|
return r
|
|
877
877
|
}
|
|
@@ -887,11 +887,11 @@ function lastIndexOfBefore(n, e, t = 0) {
|
|
|
887
887
|
return n.slice(0, t).lastIndexOf(e)
|
|
888
888
|
}
|
|
889
889
|
function findWeightedPair(n, e = 0, t = '{', r = '}') {
|
|
890
|
-
let
|
|
891
|
-
for (let
|
|
892
|
-
if (n.slice(
|
|
893
|
-
if (--
|
|
894
|
-
} else n.slice(
|
|
890
|
+
let i = 1
|
|
891
|
+
for (let o = e; o < n.length; o++)
|
|
892
|
+
if (n.slice(o, o + r.length) === r) {
|
|
893
|
+
if (--i === 0) return o
|
|
894
|
+
} else n.slice(o, o + t.length) === t && i++
|
|
895
895
|
return -1
|
|
896
896
|
}
|
|
897
897
|
function extractBlock(n, e) {
|
|
@@ -925,9 +925,9 @@ function extractAllBlocks(n, e) {
|
|
|
925
925
|
: n.indexOf(e.opening, e.start || 0)
|
|
926
926
|
for (;;) {
|
|
927
927
|
if (r === -1) return t
|
|
928
|
-
const
|
|
929
|
-
if (!
|
|
930
|
-
t.push(
|
|
928
|
+
const i = extractBlock(n, { ...e, start: r })
|
|
929
|
+
if (!i) return t
|
|
930
|
+
t.push(i),
|
|
931
931
|
(r = e.wordBoundary
|
|
932
932
|
? indexOfEarliest(
|
|
933
933
|
n,
|
|
@@ -936,35 +936,35 @@ function extractAllBlocks(n, e) {
|
|
|
936
936
|
`${e.opening}
|
|
937
937
|
`
|
|
938
938
|
],
|
|
939
|
-
r +
|
|
939
|
+
r + i.length
|
|
940
940
|
)
|
|
941
|
-
: n.indexOf(e.opening, r +
|
|
941
|
+
: n.indexOf(e.opening, r + i.length))
|
|
942
942
|
}
|
|
943
943
|
}
|
|
944
944
|
function replaceBlocks(n, e, t) {
|
|
945
945
|
let r = 0
|
|
946
946
|
for (;;) {
|
|
947
|
-
const
|
|
948
|
-
if (!
|
|
949
|
-
const
|
|
950
|
-
;(r = n.indexOf(
|
|
947
|
+
const i = exports.Strings.extractBlock(n, { ...t, start: r })
|
|
948
|
+
if (!i) return n
|
|
949
|
+
const o = e(i)
|
|
950
|
+
;(r = n.indexOf(i, r) + o.length), (n = n.replace(i, o))
|
|
951
951
|
}
|
|
952
952
|
}
|
|
953
953
|
function splitFormatting(n, e) {
|
|
954
954
|
const t = []
|
|
955
955
|
let r = 0
|
|
956
956
|
for (; r < n.length; ) {
|
|
957
|
-
const
|
|
958
|
-
if (
|
|
957
|
+
const i = n.indexOf(e, r)
|
|
958
|
+
if (i === -1) {
|
|
959
959
|
t.push({ string: n.slice(r), symbol: null })
|
|
960
960
|
break
|
|
961
961
|
}
|
|
962
|
-
const
|
|
963
|
-
if ((
|
|
962
|
+
const o = n.indexOf(e, i + e.length)
|
|
963
|
+
if ((i > r && o !== -1 && t.push({ string: n.slice(r, i), symbol: null }), o === -1)) {
|
|
964
964
|
t.push({ string: n.slice(r), symbol: null })
|
|
965
965
|
break
|
|
966
966
|
}
|
|
967
|
-
t.push({ string: n.slice(
|
|
967
|
+
t.push({ string: n.slice(i + e.length, o), symbol: e }), (r = o + e.length)
|
|
968
968
|
}
|
|
969
969
|
return t
|
|
970
970
|
}
|
|
@@ -977,12 +977,12 @@ function splitHashtags(n) {
|
|
|
977
977
|
e.push({ string: n.slice(t), symbol: null })
|
|
978
978
|
break
|
|
979
979
|
}
|
|
980
|
-
const
|
|
981
|
-
if (
|
|
980
|
+
const i = indexOfWordBreak(n, r + 1)
|
|
981
|
+
if (i === -1) {
|
|
982
982
|
e.push({ string: n.slice(t, r), symbol: null }), e.push({ string: n.slice(r + 1), symbol: '#' })
|
|
983
983
|
break
|
|
984
984
|
}
|
|
985
|
-
r > t && e.push({ string: n.slice(t, r), symbol: null }), e.push({ string: n.slice(r + 1,
|
|
985
|
+
r > t && e.push({ string: n.slice(t, r), symbol: null }), e.push({ string: n.slice(r + 1, i), symbol: '#' }), (t = i)
|
|
986
986
|
}
|
|
987
987
|
return e
|
|
988
988
|
}
|
|
@@ -995,7 +995,7 @@ function splitUrls(n) {
|
|
|
995
995
|
e.push({ string: n.slice(t), symbol: null })
|
|
996
996
|
break
|
|
997
997
|
}
|
|
998
|
-
const
|
|
998
|
+
const i = indexOfEarliest(
|
|
999
999
|
n,
|
|
1000
1000
|
[
|
|
1001
1001
|
' ',
|
|
@@ -1004,11 +1004,11 @@ function splitUrls(n) {
|
|
|
1004
1004
|
],
|
|
1005
1005
|
r
|
|
1006
1006
|
)
|
|
1007
|
-
if (
|
|
1007
|
+
if (i === -1) {
|
|
1008
1008
|
r > t && e.push({ string: n.slice(t, r), symbol: null }), e.push({ string: n.slice(r), symbol: 'http' })
|
|
1009
1009
|
break
|
|
1010
1010
|
}
|
|
1011
|
-
r > t && e.push({ string: n.slice(t, r), symbol: null }), e.push({ string: n.slice(r,
|
|
1011
|
+
r > t && e.push({ string: n.slice(t, r), symbol: null }), e.push({ string: n.slice(r, i), symbol: 'http' }), (t = i)
|
|
1012
1012
|
}
|
|
1013
1013
|
return e
|
|
1014
1014
|
}
|
|
@@ -1029,33 +1029,33 @@ function uint8ArrayToBase32(n) {
|
|
|
1029
1029
|
function baseToUint8Array(n, e) {
|
|
1030
1030
|
const t = '=',
|
|
1031
1031
|
r = e.length
|
|
1032
|
-
let
|
|
1033
|
-
|
|
1032
|
+
let i = 0,
|
|
1033
|
+
o = 0
|
|
1034
1034
|
const u = []
|
|
1035
1035
|
for (let s = 0; s < n.length; s++) {
|
|
1036
1036
|
const c = n[s]
|
|
1037
1037
|
if (c === t) break
|
|
1038
1038
|
const f = e.indexOf(c)
|
|
1039
1039
|
if (f === -1) throw new Error(`Invalid character: ${c}`)
|
|
1040
|
-
;(
|
|
1040
|
+
;(o = (o << Math.log2(r)) | f), (i += Math.log2(r)), i >= 8 && ((i -= 8), u.push((o >> i) & 255))
|
|
1041
1041
|
}
|
|
1042
1042
|
return new Uint8Array(u)
|
|
1043
1043
|
}
|
|
1044
1044
|
function uint8ArrayToBase(n, e) {
|
|
1045
1045
|
const t = e.length
|
|
1046
1046
|
let r = 0,
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
for (let u = 0; u < n.length; u++) for (
|
|
1050
|
-
return r > 0 && (
|
|
1047
|
+
i = 0,
|
|
1048
|
+
o = ''
|
|
1049
|
+
for (let u = 0; u < n.length; u++) for (i = (i << 8) | n[u], r += 8; r >= Math.log2(t); ) (r -= Math.log2(t)), (o += e[(i >> r) & (t - 1)])
|
|
1050
|
+
return r > 0 && (o += e[(i << (Math.log2(t) - r)) & (t - 1)]), o.length % 4 !== 0 && (o += '='.repeat(4 - (o.length % 4))), o
|
|
1051
1051
|
}
|
|
1052
1052
|
function hexToUint8Array(n) {
|
|
1053
1053
|
;(n.startsWith('0x') || n.startsWith('0X')) && (n = n.slice(2))
|
|
1054
1054
|
const e = n.length / 2,
|
|
1055
1055
|
t = new Uint8Array(e)
|
|
1056
1056
|
for (let r = 0; r < e; r++) {
|
|
1057
|
-
const
|
|
1058
|
-
t[r] =
|
|
1057
|
+
const i = parseInt(n.slice(r * 2, r * 2 + 2), 16)
|
|
1058
|
+
t[r] = i
|
|
1059
1059
|
}
|
|
1060
1060
|
return t
|
|
1061
1061
|
}
|
|
@@ -1073,30 +1073,30 @@ function binaryToUint8Array(n) {
|
|
|
1073
1073
|
const e = Math.ceil(n.length / 8),
|
|
1074
1074
|
t = new Uint8Array(e)
|
|
1075
1075
|
for (let r = 0; r < e; r++) {
|
|
1076
|
-
const
|
|
1077
|
-
t[r] =
|
|
1076
|
+
const i = parseInt(n.slice(r * 8, r * 8 + 8), 2)
|
|
1077
|
+
t[r] = i
|
|
1078
1078
|
}
|
|
1079
1079
|
return t
|
|
1080
1080
|
}
|
|
1081
1081
|
function route(n, e) {
|
|
1082
|
-
const t = n.split('/').filter(
|
|
1083
|
-
r = e.split('/').filter(
|
|
1082
|
+
const t = n.split('/').filter(o => o),
|
|
1083
|
+
r = e.split('/').filter(o => o)
|
|
1084
1084
|
if (t.length !== r.length) return null
|
|
1085
|
-
const
|
|
1086
|
-
for (let
|
|
1087
|
-
const u = t[
|
|
1088
|
-
if (u.startsWith(':'))
|
|
1089
|
-
else if (u !== r[
|
|
1085
|
+
const i = {}
|
|
1086
|
+
for (let o = 0; o < t.length; o++) {
|
|
1087
|
+
const u = t[o]
|
|
1088
|
+
if (u.startsWith(':')) i[u.slice(1)] = r[o]
|
|
1089
|
+
else if (u !== r[o]) return null
|
|
1090
1090
|
}
|
|
1091
|
-
return
|
|
1091
|
+
return i
|
|
1092
1092
|
}
|
|
1093
1093
|
function explodeReplace(n, e, t) {
|
|
1094
1094
|
const r = []
|
|
1095
|
-
for (const
|
|
1095
|
+
for (const i of t) i !== e && r.push(n.replace(e, i))
|
|
1096
1096
|
return r
|
|
1097
1097
|
}
|
|
1098
1098
|
function generateVariants(n, e, t, r = Math.random) {
|
|
1099
|
-
const
|
|
1099
|
+
const i = exports.Arrays.shuffle(
|
|
1100
1100
|
e.map(u => ({
|
|
1101
1101
|
variants: exports.Arrays.shuffle(
|
|
1102
1102
|
u.variants.map(s => s),
|
|
@@ -1106,22 +1106,22 @@ function generateVariants(n, e, t, r = Math.random) {
|
|
|
1106
1106
|
})),
|
|
1107
1107
|
r
|
|
1108
1108
|
),
|
|
1109
|
-
|
|
1110
|
-
for (const u of
|
|
1109
|
+
o = []
|
|
1110
|
+
for (const u of i) {
|
|
1111
1111
|
const s = u.variants.filter(f => f !== u.avoid),
|
|
1112
1112
|
c = s.find(f => n.includes(f))
|
|
1113
|
-
if (c && (pushAll(
|
|
1113
|
+
if (c && (pushAll(o, explodeReplace(n, c, s)), o.length >= t)) break
|
|
1114
1114
|
}
|
|
1115
|
-
if (
|
|
1116
|
-
for (const u of
|
|
1115
|
+
if (o.length < t)
|
|
1116
|
+
for (const u of i) {
|
|
1117
1117
|
const s = u.variants.find(c => n.includes(c))
|
|
1118
|
-
if (s && (pushAll(
|
|
1118
|
+
if (s && (pushAll(o, explodeReplace(n, s, u.variants)), o.length >= t)) break
|
|
1119
1119
|
}
|
|
1120
|
-
return
|
|
1120
|
+
return o.slice(0, t)
|
|
1121
1121
|
}
|
|
1122
1122
|
function replaceWord(n, e, t, r = !1) {
|
|
1123
|
-
const
|
|
1124
|
-
return n.replace(
|
|
1123
|
+
const i = new RegExp(r ? `(?<=\\s|^)${e}(?=\\s|$)` : `\\b${e}\\b`, 'g')
|
|
1124
|
+
return n.replace(i, t)
|
|
1125
1125
|
}
|
|
1126
1126
|
function replacePascalCaseWords(n, e) {
|
|
1127
1127
|
const t = /\b[A-Z][a-zA-Z0-9]*\b/g
|
|
@@ -1142,40 +1142,40 @@ function measureTextWidth(n, e = {}) {
|
|
|
1142
1142
|
}
|
|
1143
1143
|
function toLines(n, e, t = {}) {
|
|
1144
1144
|
const r = []
|
|
1145
|
-
let
|
|
1146
|
-
|
|
1145
|
+
let i = '',
|
|
1146
|
+
o = 0
|
|
1147
1147
|
for (let u = 0; u < n.length; u++) {
|
|
1148
1148
|
const s = n[u],
|
|
1149
1149
|
c = t[s] || 1
|
|
1150
|
-
if (((
|
|
1151
|
-
const { line: f, rest: l } = breakLine(
|
|
1150
|
+
if (((i += s), (o += c), o > e)) {
|
|
1151
|
+
const { line: f, rest: l } = breakLine(i)
|
|
1152
1152
|
r.push(f),
|
|
1153
|
-
(
|
|
1154
|
-
(
|
|
1153
|
+
(i = l),
|
|
1154
|
+
(o = l
|
|
1155
1155
|
.split('')
|
|
1156
1156
|
.map(a => t[a] || 1)
|
|
1157
1157
|
.reduce((a, h) => a + h, 0))
|
|
1158
1158
|
}
|
|
1159
1159
|
}
|
|
1160
|
-
return
|
|
1160
|
+
return i && r.push(i), r
|
|
1161
1161
|
}
|
|
1162
1162
|
function levenshteinDistance(n, e) {
|
|
1163
1163
|
const t = []
|
|
1164
1164
|
for (let r = 0; r <= n.length; r++) t[r] = [r]
|
|
1165
1165
|
for (let r = 0; r <= e.length; r++) t[0][r] = r
|
|
1166
1166
|
for (let r = 1; r <= n.length; r++)
|
|
1167
|
-
for (let
|
|
1168
|
-
const
|
|
1169
|
-
t[r][
|
|
1167
|
+
for (let i = 1; i <= e.length; i++) {
|
|
1168
|
+
const o = n[r - 1] === e[i - 1] ? 0 : 1
|
|
1169
|
+
t[r][i] = Math.min(t[r - 1][i] + 1, t[r][i - 1] + 1, t[r - 1][i - 1] + o)
|
|
1170
1170
|
}
|
|
1171
1171
|
return t[n.length][e.length]
|
|
1172
1172
|
}
|
|
1173
1173
|
function findCommonPrefix(n) {
|
|
1174
|
-
const e = n.reduce((r,
|
|
1174
|
+
const e = n.reduce((r, i) => (r.length < i.length ? r : i))
|
|
1175
1175
|
let t = ''
|
|
1176
1176
|
for (let r = 0; r < e.length; r++) {
|
|
1177
|
-
const
|
|
1178
|
-
if (n.every(
|
|
1177
|
+
const i = e[r]
|
|
1178
|
+
if (n.every(o => o[r] === i)) t += i
|
|
1179
1179
|
else break
|
|
1180
1180
|
}
|
|
1181
1181
|
return t
|
|
@@ -1196,8 +1196,8 @@ function parseHtmlAttributes(n) {
|
|
|
1196
1196
|
t = n.match(/([a-z\-]+)="([^"]+)"/g)
|
|
1197
1197
|
if (t)
|
|
1198
1198
|
for (const r of t) {
|
|
1199
|
-
const [
|
|
1200
|
-
e[
|
|
1199
|
+
const [i, o] = splitOnce(r, '=')
|
|
1200
|
+
e[i] = o.slice(1, o.length - 1)
|
|
1201
1201
|
}
|
|
1202
1202
|
return e
|
|
1203
1203
|
}
|
|
@@ -1208,38 +1208,38 @@ function readNextWord(n, e, t = []) {
|
|
|
1208
1208
|
}
|
|
1209
1209
|
function readWordsAfterAll(n, e, t = []) {
|
|
1210
1210
|
const r = allIndexOf(n, e),
|
|
1211
|
-
|
|
1212
|
-
for (const
|
|
1213
|
-
return
|
|
1211
|
+
i = []
|
|
1212
|
+
for (const o of r) i.push(readNextWord(n, o + e.length, t))
|
|
1213
|
+
return i
|
|
1214
1214
|
}
|
|
1215
1215
|
function resolveVariables(n, e, t = '$', r = ':') {
|
|
1216
|
-
for (const
|
|
1216
|
+
for (const i in e) n = resolveVariableWithDefaultSyntax(n, i, e[i], t, r)
|
|
1217
1217
|
return (n = resolveRemainingVariablesWithDefaults(n)), n
|
|
1218
1218
|
}
|
|
1219
|
-
function resolveVariableWithDefaultSyntax(n, e, t, r = '$',
|
|
1219
|
+
function resolveVariableWithDefaultSyntax(n, e, t, r = '$', i = ':') {
|
|
1220
1220
|
if (t === '') return n
|
|
1221
|
-
let
|
|
1222
|
-
for (;
|
|
1223
|
-
if (n[
|
|
1224
|
-
if (n[
|
|
1221
|
+
let o = n.indexOf(`${r}${e}`)
|
|
1222
|
+
for (; o !== -1; ) {
|
|
1223
|
+
if (n[o + e.length + 1] === i)
|
|
1224
|
+
if (n[o + e.length + 2] === i) n = n.replace(`${r}${e}${i}${i}`, t)
|
|
1225
1225
|
else {
|
|
1226
|
-
const s = readNextWord(n,
|
|
1227
|
-
n = n.replace(`${r}${e}${
|
|
1226
|
+
const s = readNextWord(n, o + e.length + 2, ['_'])
|
|
1227
|
+
n = n.replace(`${r}${e}${i}${s}`, t)
|
|
1228
1228
|
}
|
|
1229
1229
|
else n = n.replace(`${r}${e}`, t)
|
|
1230
|
-
|
|
1230
|
+
o = n.indexOf(`${r}${e}`, o + t.length)
|
|
1231
1231
|
}
|
|
1232
1232
|
return n
|
|
1233
1233
|
}
|
|
1234
1234
|
function resolveRemainingVariablesWithDefaults(n, e = '$', t = ':') {
|
|
1235
1235
|
let r = n.indexOf(e)
|
|
1236
1236
|
for (; r !== -1; ) {
|
|
1237
|
-
const
|
|
1238
|
-
if (n[r +
|
|
1239
|
-
if (n[r +
|
|
1237
|
+
const i = readNextWord(n, r + 1)
|
|
1238
|
+
if (n[r + i.length + 1] === t)
|
|
1239
|
+
if (n[r + i.length + 2] === t) n = n.replace(`${e}${i}${t}${t}`, '')
|
|
1240
1240
|
else {
|
|
1241
|
-
const u = readNextWord(n, r +
|
|
1242
|
-
n = n.replace(`${e}${
|
|
1241
|
+
const u = readNextWord(n, r + i.length + 2)
|
|
1242
|
+
n = n.replace(`${e}${i}${t}${u}`, u)
|
|
1243
1243
|
}
|
|
1244
1244
|
r = n.indexOf(e, r + 1)
|
|
1245
1245
|
}
|
|
@@ -1249,11 +1249,11 @@ function resolveMarkdownLinks(n, e) {
|
|
|
1249
1249
|
let t = n.indexOf('](')
|
|
1250
1250
|
for (; t !== -1; ) {
|
|
1251
1251
|
const r = lastIndexOfBefore(n, '[', t),
|
|
1252
|
-
|
|
1253
|
-
if (r !== -1 &&
|
|
1254
|
-
const [
|
|
1255
|
-
s = e(
|
|
1256
|
-
n = n.slice(0, r) + s + n.slice(
|
|
1252
|
+
i = n.indexOf(')', t)
|
|
1253
|
+
if (r !== -1 && i !== -1) {
|
|
1254
|
+
const [o, u] = n.slice(r + 1, i).split(']('),
|
|
1255
|
+
s = e(o, u)
|
|
1256
|
+
n = n.slice(0, r) + s + n.slice(i + 1)
|
|
1257
1257
|
}
|
|
1258
1258
|
t = n.indexOf('](', t + 1)
|
|
1259
1259
|
}
|
|
@@ -1261,8 +1261,8 @@ function resolveMarkdownLinks(n, e) {
|
|
|
1261
1261
|
}
|
|
1262
1262
|
function toQueryString(n, e = !0) {
|
|
1263
1263
|
const t = Object.entries(n)
|
|
1264
|
-
.filter(([r,
|
|
1265
|
-
.map(([r,
|
|
1264
|
+
.filter(([r, i]) => i != null)
|
|
1265
|
+
.map(([r, i]) => `${r}=${encodeURIComponent(i)}`)
|
|
1266
1266
|
.join('&')
|
|
1267
1267
|
return t ? (e ? '?' : '') + t : ''
|
|
1268
1268
|
}
|
|
@@ -1270,8 +1270,8 @@ function parseQueryString(n) {
|
|
|
1270
1270
|
const e = {},
|
|
1271
1271
|
t = n.split('&')
|
|
1272
1272
|
for (const r of t) {
|
|
1273
|
-
const [
|
|
1274
|
-
|
|
1273
|
+
const [i, o] = r.split('=')
|
|
1274
|
+
i && o && (e[i] = decodeURIComponent(o))
|
|
1275
1275
|
}
|
|
1276
1276
|
return e
|
|
1277
1277
|
}
|
|
@@ -1281,16 +1281,16 @@ function hasKey(n, e) {
|
|
|
1281
1281
|
function selectMax(n, e) {
|
|
1282
1282
|
let t = null,
|
|
1283
1283
|
r = -1 / 0
|
|
1284
|
-
for (const [
|
|
1285
|
-
const u = e(
|
|
1286
|
-
u > r && ((r = u), (t =
|
|
1284
|
+
for (const [i, o] of Object.entries(n)) {
|
|
1285
|
+
const u = e(o)
|
|
1286
|
+
u > r && ((r = u), (t = i))
|
|
1287
1287
|
}
|
|
1288
1288
|
return t ? [t, n[t]] : null
|
|
1289
1289
|
}
|
|
1290
1290
|
function reposition(n, e, t, r) {
|
|
1291
|
-
const
|
|
1292
|
-
|
|
1293
|
-
|
|
1291
|
+
const i = n.find(u => u[e] === t),
|
|
1292
|
+
o = n.find(u => u[e] === t + r)
|
|
1293
|
+
i && o ? ((i[e] = t + r), (o[e] = t)) : i && (i[e] = t + r), n.sort((u, s) => asNumber(u[e]) - asNumber(s[e])), n.forEach((u, s) => (u[e] = s + 1))
|
|
1294
1294
|
}
|
|
1295
1295
|
function unwrapSingleKey(n) {
|
|
1296
1296
|
const e = Object.keys(n)
|
|
@@ -1315,11 +1315,11 @@ function buildUrl(n, e, t) {
|
|
|
1315
1315
|
}
|
|
1316
1316
|
function parseCsv(n, e = ',', t = '"') {
|
|
1317
1317
|
const r = []
|
|
1318
|
-
let
|
|
1319
|
-
|
|
1318
|
+
let i = '',
|
|
1319
|
+
o = !1
|
|
1320
1320
|
const u = n.split('')
|
|
1321
|
-
for (const s of u) s === e && !
|
|
1322
|
-
return r.push(
|
|
1321
|
+
for (const s of u) s === e && !o ? (r.push(i), (i = '')) : s === t && ((!i && !o) || o) ? (o = !o) : (i += s)
|
|
1322
|
+
return r.push(i), r
|
|
1323
1323
|
}
|
|
1324
1324
|
function humanizeProgress(n) {
|
|
1325
1325
|
return `[${Math.floor(n.progress * 100)}%] ${humanizeTime(n.deltaMs)} out of ${humanizeTime(n.totalTimeMs)} (${humanizeTime(n.remainingTimeMs)} left) [${Math.round(n.baseTimeMs)} ms each]`
|
|
@@ -1327,7 +1327,7 @@ function humanizeProgress(n) {
|
|
|
1327
1327
|
async function waitFor(n, e) {
|
|
1328
1328
|
let t = e.requiredConsecutivePasses || 1,
|
|
1329
1329
|
r = 0
|
|
1330
|
-
for (let
|
|
1330
|
+
for (let i = 0; i < e.attempts; i++) {
|
|
1331
1331
|
try {
|
|
1332
1332
|
if (await n()) {
|
|
1333
1333
|
if ((r++, r >= t)) return
|
|
@@ -1335,7 +1335,7 @@ async function waitFor(n, e) {
|
|
|
1335
1335
|
} catch {
|
|
1336
1336
|
r = 0
|
|
1337
1337
|
}
|
|
1338
|
-
|
|
1338
|
+
i < e.attempts - 1 && (await sleepMillis(e.waitMillis))
|
|
1339
1339
|
}
|
|
1340
1340
|
throw Error('Timed out waiting for predicate')
|
|
1341
1341
|
}
|
|
@@ -1370,8 +1370,8 @@ function normalizeTime(n) {
|
|
|
1370
1370
|
let [e, t] = n.split(':')
|
|
1371
1371
|
isNumber(parseInt(e, 10)) || (e = '0'), isNumber(parseInt(t, 10)) || (t = '0')
|
|
1372
1372
|
let r = clamp(asInteger(e), 0, 23),
|
|
1373
|
-
|
|
1374
|
-
return `${createTimeDigits(r)}:${createTimeDigits(
|
|
1373
|
+
i = clamp(asInteger(t), 0, 59)
|
|
1374
|
+
return `${createTimeDigits(r)}:${createTimeDigits(i)}`
|
|
1375
1375
|
}
|
|
1376
1376
|
function humanizeTime(n) {
|
|
1377
1377
|
const e = Math.floor(n / 36e5)
|
|
@@ -1388,28 +1388,28 @@ const DefaultTimestampLabels = { today: (n, e) => createTimeDigits(n) + ':' + cr
|
|
|
1388
1388
|
function getTimestamp(n, e) {
|
|
1389
1389
|
const t = new Date(e?.now || Date.now()),
|
|
1390
1390
|
r = e?.labels || DefaultTimestampLabels,
|
|
1391
|
-
|
|
1392
|
-
if (absoluteDays(t) === absoluteDays(
|
|
1393
|
-
if (absoluteDays(t) - absoluteDays(
|
|
1394
|
-
const
|
|
1395
|
-
return absoluteDays(t) - absoluteDays(
|
|
1391
|
+
i = isDate(n) ? n : new Date(n)
|
|
1392
|
+
if (absoluteDays(t) === absoluteDays(i)) return r.today(i.getUTCHours(), i.getUTCMinutes(), i.getUTCHours() > 12)
|
|
1393
|
+
if (absoluteDays(t) - absoluteDays(i) === 1) return r.yesterday()
|
|
1394
|
+
const o = getDayInfoFromDate(i)
|
|
1395
|
+
return absoluteDays(t) - absoluteDays(i) < 7 ? r[o.day]() : r.weeks(Math.round((t.getTime() - i.getTime()) / 6048e5))
|
|
1396
1396
|
}
|
|
1397
1397
|
const DefaultTimeDeltaLabels = { now: () => 'A few seconds', seconds: n => `${n} seconds`, minutes: n => `${n} minutes`, hours: n => `${n} hours`, days: n => `${n} days`, weeks: n => `${n} weeks` }
|
|
1398
1398
|
function getTimeDelta(n, e) {
|
|
1399
1399
|
const t = e?.now ?? Date.now(),
|
|
1400
1400
|
r = e?.labels || DefaultTimeDeltaLabels,
|
|
1401
|
-
|
|
1402
|
-
let
|
|
1403
|
-
return
|
|
1401
|
+
i = exports.Types.isDate(n) ? n.getTime() : n
|
|
1402
|
+
let o = (t - i) / 1e3
|
|
1403
|
+
return o < 10 ? r.now() : o < 120 ? r.seconds(Math.floor(o)) : ((o /= 60), o < 120 ? r.minutes(Math.floor(o)) : ((o /= 60), o < 48 ? r.hours(Math.floor(o)) : ((o /= 24), o < 14 ? r.days(Math.floor(o)) : ((o /= 7), r.weeks(Math.floor(o))))))
|
|
1404
1404
|
}
|
|
1405
1405
|
function secondsToHumanTime(n, e = DefaultTimeDeltaLabels) {
|
|
1406
1406
|
return getTimeDelta(0, { now: n * 1e3, labels: e })
|
|
1407
1407
|
}
|
|
1408
1408
|
function countCycles(n, e, t) {
|
|
1409
|
-
const
|
|
1410
|
-
|
|
1411
|
-
u = e / (t?.precision ?? 1) - Math.ceil((
|
|
1412
|
-
return { cycles:
|
|
1409
|
+
const i = (t?.now ?? Date.now()) - n,
|
|
1410
|
+
o = Math.floor(i / e),
|
|
1411
|
+
u = e / (t?.precision ?? 1) - Math.ceil((i % e) / (t?.precision ?? 1))
|
|
1412
|
+
return { cycles: o, remaining: u }
|
|
1413
1413
|
}
|
|
1414
1414
|
const throttleTimers = {}
|
|
1415
1415
|
function throttle(n, e) {
|
|
@@ -1421,12 +1421,12 @@ function timeSince(n, e, t) {
|
|
|
1421
1421
|
}
|
|
1422
1422
|
function getProgress(n, e, t, r) {
|
|
1423
1423
|
r || (r = Date.now())
|
|
1424
|
-
const
|
|
1425
|
-
|
|
1426
|
-
u =
|
|
1424
|
+
const i = e / t,
|
|
1425
|
+
o = r - n,
|
|
1426
|
+
u = o / e,
|
|
1427
1427
|
s = u * t,
|
|
1428
|
-
c = s -
|
|
1429
|
-
return { deltaMs:
|
|
1428
|
+
c = s - o
|
|
1429
|
+
return { deltaMs: o, progress: i, baseTimeMs: u, totalTimeMs: s, remainingTimeMs: c }
|
|
1430
1430
|
}
|
|
1431
1431
|
const dayNumberIndex = { 0: 'sunday', 1: 'monday', 2: 'tuesday', 3: 'wednesday', 4: 'thursday', 5: 'friday', 6: 'saturday' }
|
|
1432
1432
|
function mapDayNumber(n) {
|
|
@@ -1470,9 +1470,9 @@ function makeStorage(n, e = 1024) {
|
|
|
1470
1470
|
.replace(/^-?[0-9.]+/, '')
|
|
1471
1471
|
.trim()
|
|
1472
1472
|
.toLowerCase(),
|
|
1473
|
-
|
|
1474
|
-
if (
|
|
1475
|
-
return Math.ceil(t * e **
|
|
1473
|
+
i = r === '' ? 0 : storageUnitExponents[r]
|
|
1474
|
+
if (i == null) throw Error(`Unknown unit: "${r}"`)
|
|
1475
|
+
return Math.ceil(t * e ** i)
|
|
1476
1476
|
}
|
|
1477
1477
|
function getPreLine(n) {
|
|
1478
1478
|
return n.replace(/ +/g, ' ').replace(/^ /gm, '')
|
|
@@ -1480,15 +1480,18 @@ function getPreLine(n) {
|
|
|
1480
1480
|
const tinyCache = new Map()
|
|
1481
1481
|
async function getCached(n, e, t) {
|
|
1482
1482
|
const r = Date.now(),
|
|
1483
|
-
|
|
1484
|
-
if (
|
|
1485
|
-
const
|
|
1483
|
+
i = tinyCache.get(n)
|
|
1484
|
+
if (i && i.validUntil > r) return i.value
|
|
1485
|
+
const o = await t(),
|
|
1486
1486
|
u = r + e
|
|
1487
|
-
return tinyCache.set(n, { value:
|
|
1487
|
+
return tinyCache.set(n, { value: o, validUntil: u }), o
|
|
1488
1488
|
}
|
|
1489
1489
|
function deleteFromCache(n) {
|
|
1490
1490
|
tinyCache.delete(n)
|
|
1491
1491
|
}
|
|
1492
|
+
function clearCache() {
|
|
1493
|
+
tinyCache.clear()
|
|
1494
|
+
}
|
|
1492
1495
|
function deleteExpiredFromCache() {
|
|
1493
1496
|
const n = Date.now()
|
|
1494
1497
|
for (const [e, t] of tinyCache.entries()) t.validUntil <= n && tinyCache.delete(e)
|
|
@@ -1497,32 +1500,32 @@ function cacheSize() {
|
|
|
1497
1500
|
return tinyCache.size
|
|
1498
1501
|
}
|
|
1499
1502
|
function joinUrl(n, e = !1) {
|
|
1500
|
-
;(n = n.filter(
|
|
1503
|
+
;(n = n.filter(o => o)), e && isString(n[1]) && (n[1] = '../' + n[1])
|
|
1501
1504
|
let t = ''
|
|
1502
1505
|
isString(n[0]) && n[0].includes('://') && ((t = before(n[0], '://') ?? ''), (n[0] = after(n[0], '://') ?? ''))
|
|
1503
|
-
const r = n.map(
|
|
1504
|
-
|
|
1505
|
-
for (let
|
|
1506
|
-
return (t ? t + '://' : '') +
|
|
1506
|
+
const r = n.map(o => String(o)).flatMap(o => o.split('/')),
|
|
1507
|
+
i = []
|
|
1508
|
+
for (let o = 0; o < r.length; o++) r[o] !== '.' && (r[o] === '..' ? (!t || i.length > 1) && i.pop() : i.push(r[o]))
|
|
1509
|
+
return (t ? t + '://' : '') + i.join('/').replaceAll(/\/{2,}/g, '/')
|
|
1507
1510
|
}
|
|
1508
|
-
function replaceBetweenStrings(n, e, t, r,
|
|
1509
|
-
const
|
|
1510
|
-
u = n.indexOf(t,
|
|
1511
|
-
if (
|
|
1512
|
-
return
|
|
1511
|
+
function replaceBetweenStrings(n, e, t, r, i = !0) {
|
|
1512
|
+
const o = n.indexOf(e),
|
|
1513
|
+
u = n.indexOf(t, o + e.length)
|
|
1514
|
+
if (o === -1 || u === -1) throw Error('Start or end not found')
|
|
1515
|
+
return i ? n.substring(0, o + e.length) + r + n.substring(u) : n.substring(0, o) + r + n.substring(u + t.length)
|
|
1513
1516
|
}
|
|
1514
1517
|
function describeMarkdown(n) {
|
|
1515
1518
|
let e = 'p'
|
|
1516
1519
|
n.startsWith('#') ? ((e = 'h1'), (n = n.slice(1).trim())) : n.startsWith('-') && ((e = 'li'), (n = n.slice(1).trim()))
|
|
1517
1520
|
const t = n[0] === n[0].toUpperCase(),
|
|
1518
1521
|
r = /[.?!]$/.test(n),
|
|
1519
|
-
|
|
1520
|
-
return { type: e, isCapitalized: t, hasPunctuation: r, endsWithColon:
|
|
1522
|
+
i = /:$/.test(n)
|
|
1523
|
+
return { type: e, isCapitalized: t, hasPunctuation: r, endsWithColon: i }
|
|
1521
1524
|
}
|
|
1522
1525
|
function isBalanced(n, e = '(', t = ')') {
|
|
1523
1526
|
let r = 0,
|
|
1524
|
-
|
|
1525
|
-
for (;
|
|
1527
|
+
i = 0
|
|
1528
|
+
for (; i < n.length; ) if ((n.startsWith(e, i) ? (r++, (i += e.length)) : n.startsWith(t, i) ? (r--, (i += t.length)) : i++, r < 0)) return !1
|
|
1526
1529
|
return e === t ? r % 2 === 0 : r === 0
|
|
1527
1530
|
}
|
|
1528
1531
|
function textToFormat(n) {
|
|
@@ -1532,9 +1535,9 @@ function textToFormat(n) {
|
|
|
1532
1535
|
return (n = n.replaceAll(/[A-Z][a-zA-Z0-9]*/g, 'A')), (n = n.replaceAll(/[a-z][a-zA-Z0-9]*/g, 'a')), (n = n.replaceAll(/[\u4E00-\u9FA5]+/g, 'Z')), n
|
|
1533
1536
|
}
|
|
1534
1537
|
function sortObject(n) {
|
|
1535
|
-
const t = Object.keys(n).sort((
|
|
1538
|
+
const t = Object.keys(n).sort((i, o) => i.localeCompare(o)),
|
|
1536
1539
|
r = {}
|
|
1537
|
-
for (const
|
|
1540
|
+
for (const i of t) r[i] = sortAny(n[i])
|
|
1538
1541
|
return r
|
|
1539
1542
|
}
|
|
1540
1543
|
function sortArray(n) {
|
|
@@ -1573,21 +1576,21 @@ function createStatefulToggle(n) {
|
|
|
1573
1576
|
return (e = t), r
|
|
1574
1577
|
}
|
|
1575
1578
|
}
|
|
1576
|
-
function organiseWithLimits(n, e, t, r,
|
|
1577
|
-
const
|
|
1578
|
-
for (const u of Object.keys(e))
|
|
1579
|
-
;(
|
|
1579
|
+
function organiseWithLimits(n, e, t, r, i) {
|
|
1580
|
+
const o = {}
|
|
1581
|
+
for (const u of Object.keys(e)) o[u] = []
|
|
1582
|
+
;(o[r] = []), i && (n = n.sort(i))
|
|
1580
1583
|
for (const u of n) {
|
|
1581
1584
|
const s = u[t],
|
|
1582
1585
|
c = e[s] ? s : r
|
|
1583
|
-
|
|
1586
|
+
o[c].length >= e[c] ? o[r].push(u) : o[c].push(u)
|
|
1584
1587
|
}
|
|
1585
|
-
return
|
|
1588
|
+
return o
|
|
1586
1589
|
}
|
|
1587
1590
|
function diffKeys(n, e) {
|
|
1588
1591
|
const t = Object.keys(n),
|
|
1589
1592
|
r = Object.keys(e)
|
|
1590
|
-
return { uniqueToA: t.filter(
|
|
1593
|
+
return { uniqueToA: t.filter(i => !r.includes(i)), uniqueToB: r.filter(i => !t.includes(i)) }
|
|
1591
1594
|
}
|
|
1592
1595
|
function pickRandomKey(n) {
|
|
1593
1596
|
const e = Object.keys(n)
|
|
@@ -1611,7 +1614,7 @@ function fromObjectString(n) {
|
|
|
1611
1614
|
(n = n.replace(/(,\s+)([a-zA-Z]\w+),/g, "$1$2: '$2',")),
|
|
1612
1615
|
(n = n.replace(/:(.+)\?(.+):/g, (e, t, r) => `: (${t.trim()} && ${r.trim()}) ||`)),
|
|
1613
1616
|
(n = n.replace(/([a-zA-Z0-9]+)( ?: ?{)/g, '"$1"$2')),
|
|
1614
|
-
(n = n.replace(/([a-zA-Z0-9]+) ?: ?(.+?)(,|\n|})/g, (e, t, r,
|
|
1617
|
+
(n = n.replace(/([a-zA-Z0-9]+) ?: ?(.+?)(,|\n|})/g, (e, t, r, i) => `"${t}":"${r.trim()}"${i}`)),
|
|
1615
1618
|
(n = n.replace(/("'|'")/g, '"')),
|
|
1616
1619
|
(n = n.replaceAll(',', ',')),
|
|
1617
1620
|
JSON.parse(n)
|
|
@@ -1623,24 +1626,24 @@ const thresholds = [1e3, 1e6, 1e9, 1e12, 1e15, 1e18, 1e21, 1e24, 1e27, 1e30, 1e9
|
|
|
1623
1626
|
function fromDecimals(n, e, t) {
|
|
1624
1627
|
let r = n.length - e
|
|
1625
1628
|
if (r <= 0) return '0.' + '0'.repeat(-r) + n + (t ? ' ' + t : '')
|
|
1626
|
-
let
|
|
1627
|
-
|
|
1628
|
-
return
|
|
1629
|
+
let i = n.substring(0, r),
|
|
1630
|
+
o = n.substring(r)
|
|
1631
|
+
return i === '' && (i = '0'), i + '.' + o + (t ? ' ' + t : '')
|
|
1629
1632
|
}
|
|
1630
1633
|
function formatNumber(n, e) {
|
|
1631
1634
|
const t = e?.longForm ?? !1,
|
|
1632
1635
|
r = e?.unit ? ` ${e.unit}` : '',
|
|
1633
|
-
|
|
1634
|
-
|
|
1636
|
+
i = t ? longNumberUnits : shortNumberUnits,
|
|
1637
|
+
o = e?.precision ?? 1
|
|
1635
1638
|
if (n < thresholds[0]) return `${n}${r}`
|
|
1636
|
-
for (let u = 0; u < thresholds.length - 1; u++) if (n < thresholds[u + 1]) return `${(n / thresholds[u]).toFixed(
|
|
1637
|
-
return `${(n / thresholds[thresholds.length - 1]).toFixed(
|
|
1639
|
+
for (let u = 0; u < thresholds.length - 1; u++) if (n < thresholds[u + 1]) return `${(n / thresholds[u]).toFixed(o)}${t ? ' ' : ''}${i[u]}${r}`
|
|
1640
|
+
return `${(n / thresholds[thresholds.length - 1]).toFixed(o)}${t ? ' ' : ''}${i[thresholds.length - 1]}${r}`
|
|
1638
1641
|
}
|
|
1639
1642
|
function makeNumber(n) {
|
|
1640
1643
|
const e = parseFloat(n)
|
|
1641
1644
|
if (isNaN(e)) throw Error('makeNumber got NaN for input')
|
|
1642
1645
|
const t = n.replace(/^-?[0-9.]+/, '').trim(),
|
|
1643
|
-
r = shortNumberUnits.findIndex(
|
|
1646
|
+
r = shortNumberUnits.findIndex(i => i.toLowerCase() === t.toLowerCase())
|
|
1644
1647
|
return r === -1 ? e : e * thresholds[r]
|
|
1645
1648
|
}
|
|
1646
1649
|
function clamp(n, e, t) {
|
|
@@ -1677,12 +1680,12 @@ function removeEmptyValues(n) {
|
|
|
1677
1680
|
}
|
|
1678
1681
|
function filterObjectKeys(n, e) {
|
|
1679
1682
|
const t = {}
|
|
1680
|
-
for (const [r,
|
|
1683
|
+
for (const [r, i] of Object.entries(n)) e(r) && (t[r] = i)
|
|
1681
1684
|
return t
|
|
1682
1685
|
}
|
|
1683
1686
|
function filterObjectValues(n, e) {
|
|
1684
1687
|
const t = {}
|
|
1685
|
-
for (const [r,
|
|
1688
|
+
for (const [r, i] of Object.entries(n)) e(i) && (t[r] = i)
|
|
1686
1689
|
return t
|
|
1687
1690
|
}
|
|
1688
1691
|
function mapObject(n, e) {
|
|
@@ -1693,7 +1696,7 @@ function mapObject(n, e) {
|
|
|
1693
1696
|
function mapIterable(n, e) {
|
|
1694
1697
|
const t = []
|
|
1695
1698
|
let r = 0
|
|
1696
|
-
for (const
|
|
1699
|
+
for (const i of n) t.push(e(i, r++))
|
|
1697
1700
|
return t
|
|
1698
1701
|
}
|
|
1699
1702
|
async function rethrow(n, e) {
|
|
@@ -1707,8 +1710,8 @@ function setSomeOnObject(n, e, t) {
|
|
|
1707
1710
|
t != null && (n[e] = t)
|
|
1708
1711
|
}
|
|
1709
1712
|
function setSomeDeep(n, e, t, r) {
|
|
1710
|
-
const
|
|
1711
|
-
|
|
1713
|
+
const i = getDeep(t, r)
|
|
1714
|
+
i != null && setDeep(n, e, i)
|
|
1712
1715
|
}
|
|
1713
1716
|
function flip(n) {
|
|
1714
1717
|
const e = {}
|
|
@@ -1719,15 +1722,15 @@ function getAllPermutations(n) {
|
|
|
1719
1722
|
const e = Object.keys(n),
|
|
1720
1723
|
t = e.map(s => n[s].length),
|
|
1721
1724
|
r = t.reduce((s, c) => (s *= c))
|
|
1722
|
-
let
|
|
1723
|
-
const
|
|
1724
|
-
for (let s = 0; s < t.length - 1; s++) (
|
|
1725
|
+
let i = 1
|
|
1726
|
+
const o = [1]
|
|
1727
|
+
for (let s = 0; s < t.length - 1; s++) (i *= t[s]), o.push(i)
|
|
1725
1728
|
const u = []
|
|
1726
1729
|
for (let s = 0; s < r; s++) {
|
|
1727
1730
|
const c = {}
|
|
1728
1731
|
for (let f = 0; f < e.length; f++) {
|
|
1729
1732
|
const l = n[e[f]],
|
|
1730
|
-
a = Math.floor(s /
|
|
1733
|
+
a = Math.floor(s / o[f]) % l.length
|
|
1731
1734
|
c[e[f]] = l[a]
|
|
1732
1735
|
}
|
|
1733
1736
|
u.push(c)
|
|
@@ -1740,11 +1743,11 @@ function countTruthyValues(n) {
|
|
|
1740
1743
|
function getFlatNotation(n, e, t) {
|
|
1741
1744
|
return n + (t ? '[' + e + ']' : (n.length ? '.' : '') + e)
|
|
1742
1745
|
}
|
|
1743
|
-
function flattenInner(n, e, t, r,
|
|
1746
|
+
function flattenInner(n, e, t, r, i) {
|
|
1744
1747
|
if (!isObject(e)) return e
|
|
1745
|
-
for (const [
|
|
1746
|
-
const s = getFlatNotation(t,
|
|
1747
|
-
Array.isArray(u) ? (
|
|
1748
|
+
for (const [o, u] of Object.entries(e)) {
|
|
1749
|
+
const s = getFlatNotation(t, o, r)
|
|
1750
|
+
Array.isArray(u) ? (i ? flattenInner(n, u, s, !0, i) : (n[s] = u.map(c => flattenInner(Array.isArray(c) ? [] : {}, c, '', !1, i)))) : isObject(u) ? flattenInner(n, u, s, !1, i) : (n[s] = u)
|
|
1748
1751
|
}
|
|
1749
1752
|
return n
|
|
1750
1753
|
}
|
|
@@ -1759,7 +1762,7 @@ function unflatten(n) {
|
|
|
1759
1762
|
? setDeep(
|
|
1760
1763
|
e,
|
|
1761
1764
|
t,
|
|
1762
|
-
r.map(
|
|
1765
|
+
r.map(i => unflatten(i))
|
|
1763
1766
|
)
|
|
1764
1767
|
: setDeep(e, t, r)
|
|
1765
1768
|
return e
|
|
@@ -1770,16 +1773,16 @@ function match(n, e, t) {
|
|
|
1770
1773
|
function indexArray(n, e) {
|
|
1771
1774
|
const t = {}
|
|
1772
1775
|
for (const r of n) {
|
|
1773
|
-
const
|
|
1774
|
-
t[
|
|
1776
|
+
const i = e(r)
|
|
1777
|
+
t[i] = r
|
|
1775
1778
|
}
|
|
1776
1779
|
return t
|
|
1777
1780
|
}
|
|
1778
1781
|
function indexArrayToCollection(n, e) {
|
|
1779
1782
|
const t = {}
|
|
1780
1783
|
for (const r of n) {
|
|
1781
|
-
const
|
|
1782
|
-
t[
|
|
1784
|
+
const i = e(r)
|
|
1785
|
+
t[i] || (t[i] = []), t[i].push(r)
|
|
1783
1786
|
}
|
|
1784
1787
|
return t
|
|
1785
1788
|
}
|
|
@@ -1791,13 +1794,13 @@ function splitBySize(n, e) {
|
|
|
1791
1794
|
function splitByCount(n, e) {
|
|
1792
1795
|
const t = Math.ceil(n.length / e),
|
|
1793
1796
|
r = []
|
|
1794
|
-
for (let
|
|
1797
|
+
for (let i = 0; i < n.length; i += t) r.push(n.slice(i, i + t))
|
|
1795
1798
|
return r
|
|
1796
1799
|
}
|
|
1797
1800
|
function tokenizeByLength(n, e) {
|
|
1798
1801
|
const t = [],
|
|
1799
1802
|
r = Math.ceil(n.length / e)
|
|
1800
|
-
for (let
|
|
1803
|
+
for (let i = 0; i < r; i++) t.push(n.slice(i * e, i * e + e))
|
|
1801
1804
|
return t
|
|
1802
1805
|
}
|
|
1803
1806
|
function tokenizeByCount(n, e) {
|
|
@@ -1807,11 +1810,11 @@ function tokenizeByCount(n, e) {
|
|
|
1807
1810
|
function makeUnique(n, e) {
|
|
1808
1811
|
return Object.values(indexArray(n, e))
|
|
1809
1812
|
}
|
|
1810
|
-
function countUnique(n, e, t, r,
|
|
1811
|
-
const
|
|
1813
|
+
function countUnique(n, e, t, r, i) {
|
|
1814
|
+
const o = e ? n.map(e) : n,
|
|
1812
1815
|
u = {}
|
|
1813
|
-
for (const c of
|
|
1814
|
-
const s = r ? sortObjectValues(u,
|
|
1816
|
+
for (const c of o) u[c] = (u[c] || 0) + 1
|
|
1817
|
+
const s = r ? sortObjectValues(u, i ? (c, f) => c[1] - f[1] : (c, f) => f[1] - c[1]) : u
|
|
1815
1818
|
return t ? Object.keys(s) : s
|
|
1816
1819
|
}
|
|
1817
1820
|
function sortObjectValues(n, e) {
|
|
@@ -1821,10 +1824,10 @@ function transformToArray(n) {
|
|
|
1821
1824
|
const e = [],
|
|
1822
1825
|
t = Object.keys(n),
|
|
1823
1826
|
r = n[t[0]].length
|
|
1824
|
-
for (let
|
|
1825
|
-
const
|
|
1826
|
-
for (const u of t)
|
|
1827
|
-
e.push(
|
|
1827
|
+
for (let i = 0; i < r; i++) {
|
|
1828
|
+
const o = {}
|
|
1829
|
+
for (const u of t) o[u] = n[u][i]
|
|
1830
|
+
e.push(o)
|
|
1828
1831
|
}
|
|
1829
1832
|
return e
|
|
1830
1833
|
}
|
|
@@ -1838,8 +1841,8 @@ function group(n, e) {
|
|
|
1838
1841
|
const t = []
|
|
1839
1842
|
let r = []
|
|
1840
1843
|
return (
|
|
1841
|
-
n.forEach((
|
|
1842
|
-
;(
|
|
1844
|
+
n.forEach((i, o) => {
|
|
1845
|
+
;(o === 0 || !e(i, n[o - 1])) && ((r = []), t.push(r)), r.push(i)
|
|
1843
1846
|
}),
|
|
1844
1847
|
t
|
|
1845
1848
|
)
|
|
@@ -1852,26 +1855,26 @@ function createTemporalBidirectionalMap() {
|
|
|
1852
1855
|
}
|
|
1853
1856
|
function pushToBidirectionalMap(n, e, t, r = 100) {
|
|
1854
1857
|
if (n.map.has(e)) {
|
|
1855
|
-
const
|
|
1856
|
-
n.keys.splice(
|
|
1858
|
+
const i = n.keys.indexOf(e)
|
|
1859
|
+
n.keys.splice(i, 1)
|
|
1857
1860
|
}
|
|
1858
1861
|
if ((n.map.set(e, t), n.keys.push(e), n.keys.length > r)) {
|
|
1859
|
-
const
|
|
1860
|
-
|
|
1862
|
+
const i = n.keys.shift()
|
|
1863
|
+
i && n.map.delete(i)
|
|
1861
1864
|
}
|
|
1862
1865
|
}
|
|
1863
1866
|
function unshiftToBidirectionalMap(n, e, t, r = 100) {
|
|
1864
1867
|
if (n.map.has(e)) {
|
|
1865
|
-
const
|
|
1866
|
-
n.keys.splice(
|
|
1868
|
+
const i = n.keys.indexOf(e)
|
|
1869
|
+
n.keys.splice(i, 1)
|
|
1867
1870
|
}
|
|
1868
1871
|
if ((n.map.set(e, t), n.keys.unshift(e), n.keys.length > r)) {
|
|
1869
|
-
const
|
|
1870
|
-
|
|
1872
|
+
const i = n.keys.shift()
|
|
1873
|
+
i && n.map.delete(i)
|
|
1871
1874
|
}
|
|
1872
1875
|
}
|
|
1873
|
-
function addToTemporalBidirectionalMap(n, e, t, r,
|
|
1874
|
-
pushToBidirectionalMap(n, e, { validUntil: Date.now() + r, data: t },
|
|
1876
|
+
function addToTemporalBidirectionalMap(n, e, t, r, i = 100) {
|
|
1877
|
+
pushToBidirectionalMap(n, e, { validUntil: Date.now() + r, data: t }, i)
|
|
1875
1878
|
}
|
|
1876
1879
|
function getFromTemporalBidirectionalMap(n, e) {
|
|
1877
1880
|
const t = n.map.get(e)
|
|
@@ -1941,6 +1944,18 @@ function multicall(n) {
|
|
|
1941
1944
|
function maxBy(n, e) {
|
|
1942
1945
|
return n.reduce((t, r) => (e(t) > e(r) ? t : r))
|
|
1943
1946
|
}
|
|
1947
|
+
function minBy(n, e) {
|
|
1948
|
+
return n.reduce((t, r) => (e(t) < e(r) ? t : r))
|
|
1949
|
+
}
|
|
1950
|
+
function allArrayIndexOf(n, e) {
|
|
1951
|
+
const t = []
|
|
1952
|
+
return (
|
|
1953
|
+
n.forEach((r, i) => {
|
|
1954
|
+
e(r) && t.push(i)
|
|
1955
|
+
}),
|
|
1956
|
+
t
|
|
1957
|
+
)
|
|
1958
|
+
}
|
|
1944
1959
|
function findInstance(n, e) {
|
|
1945
1960
|
const t = n.find(r => r instanceof e)
|
|
1946
1961
|
return Optional.of(t)
|
|
@@ -1951,7 +1966,7 @@ function filterInstances(n, e) {
|
|
|
1951
1966
|
function interleave(n, e) {
|
|
1952
1967
|
const t = [],
|
|
1953
1968
|
r = Math.max(n.length, e.length)
|
|
1954
|
-
for (let
|
|
1969
|
+
for (let i = 0; i < r; i++) n[i] && t.push(n[i]), e[i] && t.push(e[i])
|
|
1955
1970
|
return t
|
|
1956
1971
|
}
|
|
1957
1972
|
function toggle(n, e) {
|
|
@@ -1962,19 +1977,19 @@ class Node {
|
|
|
1962
1977
|
;(this.value = e), (this.children = [])
|
|
1963
1978
|
}
|
|
1964
1979
|
}
|
|
1965
|
-
function createHierarchy(n, e, t, r,
|
|
1966
|
-
const
|
|
1980
|
+
function createHierarchy(n, e, t, r, i = !1) {
|
|
1981
|
+
const o = new Map(),
|
|
1967
1982
|
u = []
|
|
1968
1983
|
n.forEach(c => {
|
|
1969
1984
|
const f = new Node(c)
|
|
1970
|
-
|
|
1985
|
+
o.set(c[e], f)
|
|
1971
1986
|
}),
|
|
1972
1987
|
n.forEach(c => {
|
|
1973
|
-
const f =
|
|
1988
|
+
const f = o.get(c[e])
|
|
1974
1989
|
if (!f) return
|
|
1975
1990
|
const l = c[t]
|
|
1976
1991
|
if (l) {
|
|
1977
|
-
const a =
|
|
1992
|
+
const a = o.get(l)
|
|
1978
1993
|
a && a.children.push(f)
|
|
1979
1994
|
} else u.push(f)
|
|
1980
1995
|
})
|
|
@@ -1982,7 +1997,7 @@ function createHierarchy(n, e, t, r, o = !1) {
|
|
|
1982
1997
|
c.children.sort((f, l) => {
|
|
1983
1998
|
const a = f.value[r],
|
|
1984
1999
|
h = l.value[r]
|
|
1985
|
-
return
|
|
2000
|
+
return i ? h - a : a - h
|
|
1986
2001
|
}),
|
|
1987
2002
|
c.children.forEach(s)
|
|
1988
2003
|
}
|
|
@@ -1993,21 +2008,21 @@ function log2Reduce(n, e) {
|
|
|
1993
2008
|
let t = [...n]
|
|
1994
2009
|
for (; t.length > 1; ) {
|
|
1995
2010
|
const r = []
|
|
1996
|
-
for (let
|
|
1997
|
-
const
|
|
1998
|
-
r.push(e(t[
|
|
2011
|
+
for (let i = 0; i < t.length; i += 2) {
|
|
2012
|
+
const o = t[i + 1]
|
|
2013
|
+
r.push(e(t[i], o))
|
|
1999
2014
|
}
|
|
2000
2015
|
t = r
|
|
2001
2016
|
}
|
|
2002
2017
|
return t[0]
|
|
2003
2018
|
}
|
|
2004
2019
|
function concatBytes(...n) {
|
|
2005
|
-
const e = n.reduce((
|
|
2020
|
+
const e = n.reduce((i, o) => i + o.length, 0),
|
|
2006
2021
|
t = new Uint8Array(e)
|
|
2007
2022
|
let r = 0
|
|
2008
2023
|
return (
|
|
2009
|
-
n.forEach(
|
|
2010
|
-
t.set(
|
|
2024
|
+
n.forEach(i => {
|
|
2025
|
+
t.set(i, r), (r += i.length)
|
|
2011
2026
|
}),
|
|
2012
2027
|
t
|
|
2013
2028
|
)
|
|
@@ -2053,27 +2068,27 @@ function uint64ToNumber(n, e) {
|
|
|
2053
2068
|
}
|
|
2054
2069
|
function numberToUint256(n, e) {
|
|
2055
2070
|
const r = new Uint8Array(32)
|
|
2056
|
-
let
|
|
2071
|
+
let i = n
|
|
2057
2072
|
if (e === 'LE') {
|
|
2058
|
-
for (let
|
|
2073
|
+
for (let o = 0; o < 32; o++) (r[o] = Number(i & 0xffn)), (i >>= 8n)
|
|
2059
2074
|
return r
|
|
2060
2075
|
}
|
|
2061
|
-
for (let
|
|
2076
|
+
for (let o = 31; o >= 0; o--) (r[o] = Number(i & 0xffn)), (i >>= 8n)
|
|
2062
2077
|
return r
|
|
2063
2078
|
}
|
|
2064
2079
|
function uint256ToNumber(n, e) {
|
|
2065
2080
|
let r = 0n
|
|
2066
2081
|
if (e === 'LE') {
|
|
2067
|
-
for (let
|
|
2082
|
+
for (let i = 31; i >= 0; i--) r = (r << 8n) | BigInt(n[i])
|
|
2068
2083
|
return r
|
|
2069
2084
|
}
|
|
2070
|
-
for (let
|
|
2085
|
+
for (let i = 0; i < 32; i++) r = (r << 8n) | BigInt(n[i])
|
|
2071
2086
|
return r
|
|
2072
2087
|
}
|
|
2073
2088
|
function sliceBytes(n, e) {
|
|
2074
2089
|
const t = []
|
|
2075
2090
|
let r = 0
|
|
2076
|
-
for (const
|
|
2091
|
+
for (const i of e) t.push(n.subarray(r, r + i)), (r += i)
|
|
2077
2092
|
return t
|
|
2078
2093
|
}
|
|
2079
2094
|
function partition(n, e) {
|
|
@@ -2086,16 +2101,16 @@ function keccakPermutate(n) {
|
|
|
2086
2101
|
for (let e = 0; e < 24; e++) {
|
|
2087
2102
|
const t = n[0] ^ n[10] ^ n[20] ^ n[30] ^ n[40],
|
|
2088
2103
|
r = n[1] ^ n[11] ^ n[21] ^ n[31] ^ n[41],
|
|
2089
|
-
|
|
2090
|
-
|
|
2104
|
+
i = n[2] ^ n[12] ^ n[22] ^ n[32] ^ n[42],
|
|
2105
|
+
o = n[3] ^ n[13] ^ n[23] ^ n[33] ^ n[43],
|
|
2091
2106
|
u = n[4] ^ n[14] ^ n[24] ^ n[34] ^ n[44],
|
|
2092
2107
|
s = n[5] ^ n[15] ^ n[25] ^ n[35] ^ n[45],
|
|
2093
2108
|
c = n[6] ^ n[16] ^ n[26] ^ n[36] ^ n[46],
|
|
2094
2109
|
f = n[7] ^ n[17] ^ n[27] ^ n[37] ^ n[47],
|
|
2095
2110
|
l = n[8] ^ n[18] ^ n[28] ^ n[38] ^ n[48],
|
|
2096
2111
|
a = n[9] ^ n[19] ^ n[29] ^ n[39] ^ n[49],
|
|
2097
|
-
h = (
|
|
2098
|
-
bn = (
|
|
2112
|
+
h = (i << 1) | (o >>> 31),
|
|
2113
|
+
bn = (o << 1) | (i >>> 31),
|
|
2099
2114
|
d = l ^ h,
|
|
2100
2115
|
p = a ^ bn,
|
|
2101
2116
|
$n = (u << 1) | (s >>> 31),
|
|
@@ -2104,8 +2119,8 @@ function keccakPermutate(n) {
|
|
|
2104
2119
|
g = r ^ En,
|
|
2105
2120
|
An = (c << 1) | (f >>> 31),
|
|
2106
2121
|
Mn = (f << 1) | (c >>> 31),
|
|
2107
|
-
w =
|
|
2108
|
-
x =
|
|
2122
|
+
w = i ^ An,
|
|
2123
|
+
x = o ^ Mn,
|
|
2109
2124
|
kn = (l << 1) | (a >>> 31),
|
|
2110
2125
|
Sn = (a << 1) | (l >>> 31),
|
|
2111
2126
|
y = u ^ kn,
|
|
@@ -2125,8 +2140,8 @@ function keccakPermutate(n) {
|
|
|
2125
2140
|
R = (n[7] << 28) | (n[6] >>> 4),
|
|
2126
2141
|
I = (n[8] << 27) | (n[9] >>> 5),
|
|
2127
2142
|
D = (n[9] << 27) | (n[8] >>> 5),
|
|
2128
|
-
|
|
2129
|
-
|
|
2143
|
+
B = (n[11] << 4) | (n[10] >>> 28),
|
|
2144
|
+
P = (n[10] << 4) | (n[11] >>> 28),
|
|
2130
2145
|
v = (n[13] << 12) | (n[12] >>> 20),
|
|
2131
2146
|
L = (n[12] << 12) | (n[13] >>> 20),
|
|
2132
2147
|
U = (n[14] << 6) | (n[15] >>> 26),
|
|
@@ -2165,7 +2180,7 @@ function keccakPermutate(n) {
|
|
|
2165
2180
|
wn = (n[46] << 24) | (n[47] >>> 8),
|
|
2166
2181
|
xn = (n[48] << 14) | (n[49] >>> 18),
|
|
2167
2182
|
yn = (n[49] << 14) | (n[48] >>> 18)
|
|
2168
|
-
;(n[0] = A ^ (~v & K)), (n[1] = M ^ (~L & Z)), (n[2] = v ^ (~K & un)), (n[3] = L ^ (~Z & cn)), (n[4] = K ^ (~un & xn)), (n[5] = Z ^ (~cn & yn)), (n[6] = un ^ (~xn & A)), (n[7] = cn ^ (~yn & M)), (n[8] = xn ^ (~A & v)), (n[9] = yn ^ (~M & L)), (n[10] = C ^ (~z & W)), (n[11] = R ^ (~q & H)), (n[12] = z ^ (~W & en)), (n[13] = q ^ (~H & tn)), (n[14] = W ^ (~en & pn)), (n[15] = H ^ (~tn & mn)), (n[16] = en ^ (~pn & C)), (n[17] = tn ^ (~mn & R)), (n[18] = pn ^ (~C & z)), (n[19] = mn ^ (~R & q)), (n[20] = k ^ (~U & Q)), (n[21] = S ^ (~N & G)), (n[22] = U ^ (~Q & sn)), (n[23] = N ^ (~G & fn)), (n[24] = Q ^ (~sn & ln)), (n[25] = G ^ (~fn & an)), (n[26] = sn ^ (~ln & k)), (n[27] = fn ^ (~an & S)), (n[28] = ln ^ (~k & U)), (n[29] = an ^ (~S & N)), (n[30] = I ^ (~
|
|
2183
|
+
;(n[0] = A ^ (~v & K)), (n[1] = M ^ (~L & Z)), (n[2] = v ^ (~K & un)), (n[3] = L ^ (~Z & cn)), (n[4] = K ^ (~un & xn)), (n[5] = Z ^ (~cn & yn)), (n[6] = un ^ (~xn & A)), (n[7] = cn ^ (~yn & M)), (n[8] = xn ^ (~A & v)), (n[9] = yn ^ (~M & L)), (n[10] = C ^ (~z & W)), (n[11] = R ^ (~q & H)), (n[12] = z ^ (~W & en)), (n[13] = q ^ (~H & tn)), (n[14] = W ^ (~en & pn)), (n[15] = H ^ (~tn & mn)), (n[16] = en ^ (~pn & C)), (n[17] = tn ^ (~mn & R)), (n[18] = pn ^ (~C & z)), (n[19] = mn ^ (~R & q)), (n[20] = k ^ (~U & Q)), (n[21] = S ^ (~N & G)), (n[22] = U ^ (~Q & sn)), (n[23] = N ^ (~G & fn)), (n[24] = Q ^ (~sn & ln)), (n[25] = G ^ (~fn & an)), (n[26] = sn ^ (~ln & k)), (n[27] = fn ^ (~an & S)), (n[28] = ln ^ (~k & U)), (n[29] = an ^ (~S & N)), (n[30] = I ^ (~B & V)), (n[31] = D ^ (~P & J)), (n[32] = B ^ (~V & rn)), (n[33] = P ^ (~J & on)), (n[34] = V ^ (~rn & gn)), (n[35] = J ^ (~on & wn)), (n[36] = rn ^ (~gn & I)), (n[37] = on ^ (~wn & D)), (n[38] = gn ^ (~I & B)), (n[39] = wn ^ (~D & P)), (n[40] = O ^ (~j & Y)), (n[41] = T ^ (~F & X)), (n[42] = j ^ (~Y & _)), (n[43] = F ^ (~X & nn)), (n[44] = Y ^ (~_ & hn)), (n[45] = X ^ (~nn & dn)), (n[46] = _ ^ (~hn & O)), (n[47] = nn ^ (~dn & T)), (n[48] = hn ^ (~O & j)), (n[49] = dn ^ (~T & F)), (n[0] ^= IOTA_CONSTANTS[e * 2]), (n[1] ^= IOTA_CONSTANTS[e * 2 + 1])
|
|
2169
2184
|
}
|
|
2170
2185
|
}
|
|
2171
2186
|
function bytesToNumbers(n) {
|
|
@@ -2175,18 +2190,18 @@ function bytesToNumbers(n) {
|
|
|
2175
2190
|
}
|
|
2176
2191
|
function divideToBlocks(n, e) {
|
|
2177
2192
|
if (!n.length) {
|
|
2178
|
-
const
|
|
2179
|
-
return (
|
|
2193
|
+
const i = new Uint8Array(136)
|
|
2194
|
+
return (i[0] = e), (i[135] = 128), [bytesToNumbers(i)]
|
|
2180
2195
|
}
|
|
2181
2196
|
const t = partition(n, 136),
|
|
2182
2197
|
r = t[t.length - 1]
|
|
2183
2198
|
if (r.length < 136) {
|
|
2184
|
-
const
|
|
2185
|
-
|
|
2199
|
+
const i = new Uint8Array(136)
|
|
2200
|
+
i.set(r), (i[r.length] = e), (i[135] |= 128), (t[t.length - 1] = i)
|
|
2186
2201
|
}
|
|
2187
2202
|
if (r.length === 136) {
|
|
2188
|
-
const
|
|
2189
|
-
;(
|
|
2203
|
+
const i = new Uint8Array(136)
|
|
2204
|
+
;(i[0] = e), (i[135] = 128), t.push(i)
|
|
2190
2205
|
}
|
|
2191
2206
|
return t.map(bytesToNumbers)
|
|
2192
2207
|
}
|
|
@@ -2209,8 +2224,8 @@ function sha3_256(n) {
|
|
|
2209
2224
|
function proximity(n, e) {
|
|
2210
2225
|
const t = Math.min(n.length, e.length)
|
|
2211
2226
|
for (let r = 0; r < t; r++) {
|
|
2212
|
-
const
|
|
2213
|
-
for (let
|
|
2227
|
+
const i = n[r] ^ e[r]
|
|
2228
|
+
for (let o = 0; o < 8; o++) if ((i >> (7 - o)) & 1) return r * 8 + o
|
|
2214
2229
|
}
|
|
2215
2230
|
return Math.min(n.length, e.length) * 8
|
|
2216
2231
|
}
|
|
@@ -2220,17 +2235,17 @@ function commonPrefix(n, e) {
|
|
|
2220
2235
|
return n.subarray(0, t)
|
|
2221
2236
|
}
|
|
2222
2237
|
function setBit(n, e, t, r) {
|
|
2223
|
-
const
|
|
2224
|
-
|
|
2225
|
-
t === 1 ? (n[
|
|
2238
|
+
const i = Math.floor(e / 8),
|
|
2239
|
+
o = e % 8
|
|
2240
|
+
t === 1 ? (n[i] |= 1 << (r === 'BE' ? 7 - o : o)) : (n[i] &= ~(1 << (r === 'BE' ? 7 - o : o)))
|
|
2226
2241
|
}
|
|
2227
2242
|
function getBit(n, e, t) {
|
|
2228
2243
|
const r = Math.floor(e / 8),
|
|
2229
|
-
|
|
2230
|
-
return (n[r] >> (t === 'BE' ? 7 -
|
|
2244
|
+
i = e % 8
|
|
2245
|
+
return (n[r] >> (t === 'BE' ? 7 - i : i)) & 1
|
|
2231
2246
|
}
|
|
2232
2247
|
function binaryIndexOf(n, e, t = 0) {
|
|
2233
|
-
for (let r = t; r < n.length; r++) for (let
|
|
2248
|
+
for (let r = t; r < n.length; r++) for (let i = 0; i < e.length && n[r + i] === e[i]; i++) if (i === e.length - 1) return r
|
|
2234
2249
|
return -1
|
|
2235
2250
|
}
|
|
2236
2251
|
function binaryPadStart(n, e, t = 0) {
|
|
@@ -2284,12 +2299,12 @@ function mod(n, e) {
|
|
|
2284
2299
|
function modInverse(n, e) {
|
|
2285
2300
|
n = mod(n, e)
|
|
2286
2301
|
let [t, r] = [0n, 1n],
|
|
2287
|
-
[
|
|
2288
|
-
for (;
|
|
2289
|
-
const u =
|
|
2290
|
-
;([t, r] = [r, t - u * r]), ([
|
|
2302
|
+
[i, o] = [e, n]
|
|
2303
|
+
for (; o !== 0n; ) {
|
|
2304
|
+
const u = i / o
|
|
2305
|
+
;([t, r] = [r, t - u * r]), ([i, o] = [o, i - u * o])
|
|
2291
2306
|
}
|
|
2292
|
-
if (
|
|
2307
|
+
if (i > 1n) throw new Error('a is not invertible')
|
|
2293
2308
|
return t < 0n && (t += e), t
|
|
2294
2309
|
}
|
|
2295
2310
|
function modPow(n, e, t) {
|
|
@@ -2307,18 +2322,18 @@ const SECP256K1_P = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeff
|
|
|
2307
2322
|
function ellipticDouble(n, e, t) {
|
|
2308
2323
|
if (e === 0n) return [0n, 0n]
|
|
2309
2324
|
const r = mod(3n * n * n * modInverse(2n * e, t), t),
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
return [
|
|
2325
|
+
i = mod(r * r - 2n * n, t),
|
|
2326
|
+
o = mod(r * (n - i) - e, t)
|
|
2327
|
+
return [i, o]
|
|
2313
2328
|
}
|
|
2314
|
-
function ellipticAdd(n, e, t, r,
|
|
2329
|
+
function ellipticAdd(n, e, t, r, i) {
|
|
2315
2330
|
if (n === 0n && e === 0n) return [t, r]
|
|
2316
2331
|
if (t === 0n && r === 0n) return [n, e]
|
|
2317
|
-
if (n === t && e === mod(-r,
|
|
2318
|
-
if (n === t && e === r) return ellipticDouble(n, e,
|
|
2319
|
-
const
|
|
2320
|
-
u = mod(
|
|
2321
|
-
s = mod(
|
|
2332
|
+
if (n === t && e === mod(-r, i)) return [0n, 0n]
|
|
2333
|
+
if (n === t && e === r) return ellipticDouble(n, e, i)
|
|
2334
|
+
const o = mod((r - e) * modInverse(t - n, i), i),
|
|
2335
|
+
u = mod(o * o - n - t, i),
|
|
2336
|
+
s = mod(o * (n - u) - e, i)
|
|
2322
2337
|
return [u, s]
|
|
2323
2338
|
}
|
|
2324
2339
|
function privateKeyToPublicKey(n) {
|
|
@@ -2335,8 +2350,8 @@ function publicKeyFromCompressed(n) {
|
|
|
2335
2350
|
t = modSqrt(mod(e ** 3n + 7n, SECP256K1_P), SECP256K1_P)
|
|
2336
2351
|
if (!t) throw Error('Invalid x: does not correspond to a valid curve point')
|
|
2337
2352
|
const r = mod(-t, SECP256K1_P),
|
|
2338
|
-
|
|
2339
|
-
return [e, n[0] === 2 ? (
|
|
2353
|
+
i = t % 2n === 0n
|
|
2354
|
+
return [e, n[0] === 2 ? (i ? t : r) : i ? r : t]
|
|
2340
2355
|
}
|
|
2341
2356
|
function publicKeyToAddress(n) {
|
|
2342
2357
|
const e = new Uint8Array(20),
|
|
@@ -2345,17 +2360,17 @@ function publicKeyToAddress(n) {
|
|
|
2345
2360
|
}
|
|
2346
2361
|
function checksumEncode(n) {
|
|
2347
2362
|
const e = exports.Binary.uint8ArrayToHex(n),
|
|
2348
|
-
t = exports.Binary.uint8ArrayToHex(exports.Binary.keccak256(new Uint8Array([...e].map(
|
|
2363
|
+
t = exports.Binary.uint8ArrayToHex(exports.Binary.keccak256(new Uint8Array([...e].map(i => i.charCodeAt(0)))))
|
|
2349
2364
|
let r = '0x'
|
|
2350
|
-
for (let
|
|
2365
|
+
for (let i = 0; i < e.length; i++) parseInt(t[i], 16) > 7 ? (r += e[i].toUpperCase()) : (r += e[i])
|
|
2351
2366
|
return r
|
|
2352
2367
|
}
|
|
2353
2368
|
function doubleAndAdd(n, e, t, r) {
|
|
2354
|
-
let
|
|
2355
|
-
|
|
2369
|
+
let i = [0n, 0n],
|
|
2370
|
+
o = [n, e]
|
|
2356
2371
|
const u = t.toString(2)
|
|
2357
|
-
for (const s of u) s === '0' ? ((
|
|
2358
|
-
return
|
|
2372
|
+
for (const s of u) s === '0' ? ((o = ellipticAdd(i[0], i[1], o[0], o[1], r)), (i = ellipticDouble(i[0], i[1], r))) : ((i = ellipticAdd(i[0], i[1], o[0], o[1], r)), (o = ellipticDouble(o[0], o[1], r)))
|
|
2373
|
+
return i
|
|
2359
2374
|
}
|
|
2360
2375
|
function signMessage(n, e, t) {
|
|
2361
2376
|
return signHash(uint256ToNumber(keccak256(n), 'BE'), e, t)
|
|
@@ -2364,18 +2379,18 @@ function signHash(n, e, t) {
|
|
|
2364
2379
|
if (e <= 0n || e >= SECP256K1_N) throw new Error('Invalid private key')
|
|
2365
2380
|
if ((t || (t = mod(uint256ToNumber(keccak256(concatBytes(keccak256(numberToUint256(e, 'BE')), numberToUint256(n, 'BE'))), 'BE'), SECP256K1_N)), t <= 0n || t >= SECP256K1_N)) throw new Error('Invalid nonce')
|
|
2366
2381
|
const r = mod(n, SECP256K1_N),
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
let u = mod((r + mod(
|
|
2370
|
-
if (
|
|
2371
|
-
let s =
|
|
2372
|
-
return u > SECP256K1_N / 2n && ((u = SECP256K1_N - u), (s = s === 27n ? 28n : 27n)), [
|
|
2382
|
+
i = doubleAndAdd(SECP256K1_X, SECP256K1_Y, t, SECP256K1_P),
|
|
2383
|
+
o = mod(i[0], SECP256K1_N)
|
|
2384
|
+
let u = mod((r + mod(o, SECP256K1_N) * e) * modInverse(t, SECP256K1_N), SECP256K1_N)
|
|
2385
|
+
if (o === 0n || u === 0n) throw new Error('Invalid r or s value')
|
|
2386
|
+
let s = i[1] % 2n === 0n ? 27n : 28n
|
|
2387
|
+
return u > SECP256K1_N / 2n && ((u = SECP256K1_N - u), (s = s === 27n ? 28n : 27n)), [o, u, s]
|
|
2373
2388
|
}
|
|
2374
2389
|
function recoverPublicKey(n, e, t, r) {
|
|
2375
|
-
const
|
|
2376
|
-
if (!
|
|
2377
|
-
const
|
|
2378
|
-
u =
|
|
2390
|
+
const i = modSqrt(mod(e ** 3n + 7n, SECP256K1_P), SECP256K1_P)
|
|
2391
|
+
if (!i) throw new Error('Invalid r: does not correspond to a valid curve point')
|
|
2392
|
+
const o = r === 27n ? 0n : 1n,
|
|
2393
|
+
u = i % 2n === o ? i : SECP256K1_P - i,
|
|
2379
2394
|
s = mod(uint256ToNumber(keccak256(n), 'BE'), SECP256K1_N),
|
|
2380
2395
|
c = doubleAndAdd(e, u, t, SECP256K1_P),
|
|
2381
2396
|
f = doubleAndAdd(SECP256K1_X, SECP256K1_Y, s, SECP256K1_P),
|
|
@@ -2383,10 +2398,10 @@ function recoverPublicKey(n, e, t, r) {
|
|
|
2383
2398
|
return doubleAndAdd(l[0], l[1], modInverse(e, SECP256K1_N), SECP256K1_P)
|
|
2384
2399
|
}
|
|
2385
2400
|
function verifySignature(n, e, t, r) {
|
|
2386
|
-
const
|
|
2387
|
-
|
|
2388
|
-
u = mod(
|
|
2389
|
-
s = mod(t *
|
|
2401
|
+
const i = mod(uint256ToNumber(keccak256(n), 'BE'), SECP256K1_N),
|
|
2402
|
+
o = modInverse(r, SECP256K1_N),
|
|
2403
|
+
u = mod(i * o, SECP256K1_N),
|
|
2404
|
+
s = mod(t * o, SECP256K1_N),
|
|
2390
2405
|
c = doubleAndAdd(SECP256K1_X, SECP256K1_Y, u, SECP256K1_P),
|
|
2391
2406
|
f = doubleAndAdd(e[0], e[1], s, SECP256K1_P),
|
|
2392
2407
|
l = ellipticAdd(c[0], c[1], f[0], f[1], SECP256K1_P)
|
|
@@ -2440,11 +2455,11 @@ class MerkleTree {
|
|
|
2440
2455
|
return await r.append(e), r.finalize()
|
|
2441
2456
|
}
|
|
2442
2457
|
async append(e, t = 0, r = 0n) {
|
|
2443
|
-
const
|
|
2444
|
-
for (;
|
|
2458
|
+
const i = new Uint8ArrayReader(e)
|
|
2459
|
+
for (; i.max() > 0; ) {
|
|
2445
2460
|
this.chunks[t].writer.max() === 0 && (await this.elevate(t))
|
|
2446
|
-
const
|
|
2447
|
-
r ? (this.chunks[t].span += r) : (this.chunks[0].span += BigInt(
|
|
2461
|
+
const o = this.chunks[t].writer.write(i)
|
|
2462
|
+
r ? (this.chunks[t].span += r) : (this.chunks[0].span += BigInt(o))
|
|
2448
2463
|
}
|
|
2449
2464
|
}
|
|
2450
2465
|
async elevate(e) {
|
|
@@ -2469,8 +2484,8 @@ class FixedPointNumber {
|
|
|
2469
2484
|
}
|
|
2470
2485
|
static fromDecimalString(e, t) {
|
|
2471
2486
|
;/e\-\d+$/i.test(e) && (e = parseFloat(e).toFixed(t))
|
|
2472
|
-
let [r,
|
|
2473
|
-
return (
|
|
2487
|
+
let [r, i] = e.split('.')
|
|
2488
|
+
return (i = (i || '').padEnd(t, '0').slice(0, t)), new FixedPointNumber(BigInt(r + i), t)
|
|
2474
2489
|
}
|
|
2475
2490
|
static fromFloat(e, t) {
|
|
2476
2491
|
return FixedPointNumber.fromDecimalString(e.toString(), t)
|
|
@@ -2492,12 +2507,12 @@ class FixedPointNumber {
|
|
|
2492
2507
|
}
|
|
2493
2508
|
exchange(e, t, r) {
|
|
2494
2509
|
if (e === '*') {
|
|
2495
|
-
const
|
|
2496
|
-
return new FixedPointNumber(
|
|
2510
|
+
const o = (this.value * t.value) / 10n ** BigInt(this.scale)
|
|
2511
|
+
return new FixedPointNumber(o, r)
|
|
2497
2512
|
}
|
|
2498
2513
|
this.assertSameScale(t)
|
|
2499
|
-
const
|
|
2500
|
-
return new FixedPointNumber(
|
|
2514
|
+
const i = (this.value * 10n ** BigInt(r)) / t.value
|
|
2515
|
+
return new FixedPointNumber(i, r)
|
|
2501
2516
|
}
|
|
2502
2517
|
compare(e) {
|
|
2503
2518
|
return this.assertSameScale(e), this.value > e.value ? 1 : this.value < e.value ? -1 : 0
|
|
@@ -2529,44 +2544,44 @@ function tickPlaybook(n) {
|
|
|
2529
2544
|
return e.ttlMax ? --e.ttl <= 0 && n.shift() : (e.ttlMax = e.ttl), { progress: (e.ttlMax - e.ttl) / e.ttlMax, data: e.data }
|
|
2530
2545
|
}
|
|
2531
2546
|
function getArgument(n, e, t, r) {
|
|
2532
|
-
const
|
|
2533
|
-
|
|
2534
|
-
if (!
|
|
2535
|
-
if (
|
|
2536
|
-
const u = n[
|
|
2547
|
+
const i = n.findIndex(s => s === `--${e}` || s.startsWith(`--${e}=`)),
|
|
2548
|
+
o = n[i]
|
|
2549
|
+
if (!o) return (t || {})[r || e || ''] || null
|
|
2550
|
+
if (o.includes('=')) return o.split('=')[1]
|
|
2551
|
+
const u = n[i + 1]
|
|
2537
2552
|
return u && !u.startsWith('-') ? u : (t || {})[r || e || ''] || null
|
|
2538
2553
|
}
|
|
2539
2554
|
function getNumberArgument(n, e, t, r) {
|
|
2540
|
-
const
|
|
2541
|
-
if (!
|
|
2555
|
+
const i = getArgument(n, e, t, r)
|
|
2556
|
+
if (!i) return null
|
|
2542
2557
|
try {
|
|
2543
|
-
return makeNumber(
|
|
2558
|
+
return makeNumber(i)
|
|
2544
2559
|
} catch {
|
|
2545
|
-
throw new Error(`Invalid number argument ${e}: ${
|
|
2560
|
+
throw new Error(`Invalid number argument ${e}: ${i}`)
|
|
2546
2561
|
}
|
|
2547
2562
|
}
|
|
2548
2563
|
function getBooleanArgument(n, e, t, r) {
|
|
2549
|
-
const
|
|
2550
|
-
|
|
2551
|
-
if (!
|
|
2552
|
-
if (!
|
|
2564
|
+
const i = n.some(c => c.endsWith('-' + e)),
|
|
2565
|
+
o = getArgument(n, e, t, r)
|
|
2566
|
+
if (!o && i) return !0
|
|
2567
|
+
if (!o && !i) return null
|
|
2553
2568
|
const u = ['true', '1', 'yes', 'y', 'on'],
|
|
2554
2569
|
s = ['false', '0', 'no', 'n', 'off']
|
|
2555
|
-
if (u.includes(
|
|
2556
|
-
if (s.includes(
|
|
2557
|
-
throw Error(`Invalid boolean argument ${e}: ${
|
|
2570
|
+
if (u.includes(o.toLowerCase())) return !0
|
|
2571
|
+
if (s.includes(o.toLowerCase())) return !1
|
|
2572
|
+
throw Error(`Invalid boolean argument ${e}: ${o}`)
|
|
2558
2573
|
}
|
|
2559
2574
|
function requireStringArgument(n, e, t, r) {
|
|
2560
|
-
const
|
|
2561
|
-
if (!
|
|
2562
|
-
return
|
|
2575
|
+
const i = getArgument(n, e, t, r)
|
|
2576
|
+
if (!i) throw new Error(`Missing argument ${e}`)
|
|
2577
|
+
return i
|
|
2563
2578
|
}
|
|
2564
2579
|
function requireNumberArgument(n, e, t, r) {
|
|
2565
|
-
const
|
|
2580
|
+
const i = requireStringArgument(n, e, t, r)
|
|
2566
2581
|
try {
|
|
2567
|
-
return makeNumber(
|
|
2582
|
+
return makeNumber(i)
|
|
2568
2583
|
} catch {
|
|
2569
|
-
throw new Error(`Invalid argument ${e}: ${
|
|
2584
|
+
throw new Error(`Invalid argument ${e}: ${i}`)
|
|
2570
2585
|
}
|
|
2571
2586
|
}
|
|
2572
2587
|
function bringToFrontInPlace(n, e) {
|
|
@@ -2598,8 +2613,8 @@ function getDistanceBetweenPoints(n, e) {
|
|
|
2598
2613
|
}
|
|
2599
2614
|
function filterCoordinates(n, e, t = 'row-first') {
|
|
2600
2615
|
const r = []
|
|
2601
|
-
if (t === 'column-first') for (let
|
|
2602
|
-
else for (let
|
|
2616
|
+
if (t === 'column-first') for (let i = 0; i < n.length; i++) for (let o = 0; o < n[0].length; o++) e(i, o) && r.push({ x: i, y: o })
|
|
2617
|
+
else for (let i = 0; i < n[0].length; i++) for (let o = 0; o < n.length; o++) e(o, i) && r.push({ x: o, y: i })
|
|
2603
2618
|
return r
|
|
2604
2619
|
}
|
|
2605
2620
|
function isHorizontalLine(n, e, t) {
|
|
@@ -2625,26 +2640,26 @@ function getCorners(n, e, t) {
|
|
|
2625
2640
|
return n[e][t] ? (isHorizontalLine(n, e, t) || isVerticalLine(n, e, t) ? [] : (!n[e - 1]?.[t - 1] && isLeftmost(n, e, t) && isTopmost(n, e, t) && r.push({ x: e, y: t }), !n[e + 1]?.[t - 1] && isRightmost(n, e, t) && isTopmost(n, e, t) && r.push({ x: e + 1, y: t }), !n[e - 1]?.[t + 1] && isLeftmost(n, e, t) && isBottommost(n, e, t) && r.push({ x: e, y: t + 1 }), !n[e + 1]?.[t + 1] && isRightmost(n, e, t) && isBottommost(n, e, t) && r.push({ x: e + 1, y: t + 1 }), r)) : (n[e - 1]?.[t] && n[e][t - 1] && r.push({ x: e, y: t }), n[e + 1]?.[t] && n[e][t - 1] && r.push({ x: e + 1, y: t }), n[e - 1]?.[t] && n[e][t + 1] && r.push({ x: e, y: t + 1 }), n[e + 1]?.[t] && n[e][t + 1] && r.push({ x: e + 1, y: t + 1 }), r)
|
|
2626
2641
|
}
|
|
2627
2642
|
function findCorners(n, e, t, r) {
|
|
2628
|
-
const
|
|
2643
|
+
const i = [
|
|
2629
2644
|
{ x: 0, y: 0 },
|
|
2630
2645
|
{ x: t, y: 0 },
|
|
2631
2646
|
{ x: 0, y: r },
|
|
2632
2647
|
{ x: t, y: r }
|
|
2633
2648
|
]
|
|
2634
|
-
for (let
|
|
2649
|
+
for (let o = 0; o < n.length; o++)
|
|
2635
2650
|
for (let u = 0; u < n[0].length; u++) {
|
|
2636
|
-
const s = getCorners(n,
|
|
2637
|
-
for (const c of s)
|
|
2651
|
+
const s = getCorners(n, o, u)
|
|
2652
|
+
for (const c of s) i.some(f => f.x === c.x && f.y === c.y) || i.push(c)
|
|
2638
2653
|
}
|
|
2639
|
-
return
|
|
2654
|
+
return i.map(o => ({ x: o.x * e, y: o.y * e }))
|
|
2640
2655
|
}
|
|
2641
2656
|
function findLines(n, e) {
|
|
2642
2657
|
const t = filterCoordinates(n, (c, f) => n[c][f] === 0 && n[c][f + 1] !== 0, 'row-first').map(c => ({ ...c, dx: 1, dy: 0 })),
|
|
2643
2658
|
r = filterCoordinates(n, (c, f) => n[c][f] === 0 && n[c][f - 1] !== 0, 'row-first').map(c => ({ ...c, dx: 1, dy: 0 })),
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
t.forEach(c => c.y++),
|
|
2647
|
-
const u = group([...
|
|
2659
|
+
i = filterCoordinates(n, (c, f) => n[c][f] === 0 && n[c - 1]?.[f] !== 0, 'column-first').map(c => ({ ...c, dx: 0, dy: 1 })),
|
|
2660
|
+
o = filterCoordinates(n, (c, f) => n[c][f] === 0 && n[c + 1]?.[f] !== 0, 'column-first').map(c => ({ ...c, dx: 0, dy: 1 }))
|
|
2661
|
+
t.forEach(c => c.y++), o.forEach(c => c.x++)
|
|
2662
|
+
const u = group([...i, ...o], (c, f) => c.x === f.x && c.y - 1 === f.y),
|
|
2648
2663
|
s = group([...r, ...t], (c, f) => c.y === f.y && c.x - 1 === f.x)
|
|
2649
2664
|
return [...u, ...s].map(c => ({ start: c[0], end: last(c) })).map(c => ({ start: multiplyPoint(c.start, e), end: multiplyPoint(addPoint(c.end, { x: c.start.dx, y: c.start.dy }), e) }))
|
|
2650
2665
|
}
|
|
@@ -2655,38 +2670,38 @@ function getSortedRayAngles(n, e) {
|
|
|
2655
2670
|
return e.map(t => getAngleInRadians(n, t)).sort((t, r) => t - r)
|
|
2656
2671
|
}
|
|
2657
2672
|
function getLineIntersectionPoint(n, e, t, r) {
|
|
2658
|
-
const
|
|
2659
|
-
if (
|
|
2660
|
-
let
|
|
2673
|
+
const i = (r.y - t.y) * (e.x - n.x) - (r.x - t.x) * (e.y - n.y)
|
|
2674
|
+
if (i === 0) return null
|
|
2675
|
+
let o = n.y - t.y,
|
|
2661
2676
|
u = n.x - t.x
|
|
2662
|
-
const s = (r.x - t.x) *
|
|
2663
|
-
c = (e.x - n.x) *
|
|
2664
|
-
return (
|
|
2677
|
+
const s = (r.x - t.x) * o - (r.y - t.y) * u,
|
|
2678
|
+
c = (e.x - n.x) * o - (e.y - n.y) * u
|
|
2679
|
+
return (o = s / i), (u = c / i), o > 0 && o < 1 && u > 0 && u < 1 ? { x: n.x + o * (e.x - n.x), y: n.y + o * (e.y - n.y) } : null
|
|
2665
2680
|
}
|
|
2666
2681
|
function raycast(n, e, t) {
|
|
2667
2682
|
const r = [],
|
|
2668
|
-
|
|
2669
|
-
for (const
|
|
2670
|
-
const u = getLineIntersectionPoint(n,
|
|
2683
|
+
i = pushPoint(n, t, 1e4)
|
|
2684
|
+
for (const o of e) {
|
|
2685
|
+
const u = getLineIntersectionPoint(n, i, o.start, o.end)
|
|
2671
2686
|
u && r.push(u)
|
|
2672
2687
|
}
|
|
2673
2688
|
return r.length
|
|
2674
|
-
? r.reduce((
|
|
2689
|
+
? r.reduce((o, u) => {
|
|
2675
2690
|
const s = getDistanceBetweenPoints(n, u),
|
|
2676
|
-
c = getDistanceBetweenPoints(n,
|
|
2677
|
-
return s < c ? u :
|
|
2691
|
+
c = getDistanceBetweenPoints(n, o)
|
|
2692
|
+
return s < c ? u : o
|
|
2678
2693
|
})
|
|
2679
2694
|
: null
|
|
2680
2695
|
}
|
|
2681
2696
|
function raycastCircle(n, e, t) {
|
|
2682
|
-
const
|
|
2683
|
-
|
|
2684
|
-
for (const u of
|
|
2697
|
+
const i = getSortedRayAngles(n, t),
|
|
2698
|
+
o = []
|
|
2699
|
+
for (const u of i) {
|
|
2685
2700
|
const s = raycast(n, e, u - 0.001),
|
|
2686
2701
|
c = raycast(n, e, u + 0.001)
|
|
2687
|
-
s &&
|
|
2702
|
+
s && o.push(s), c && o.push(c)
|
|
2688
2703
|
}
|
|
2689
|
-
return
|
|
2704
|
+
return o
|
|
2690
2705
|
}
|
|
2691
2706
|
class PubSubChannel {
|
|
2692
2707
|
constructor() {
|
|
@@ -2754,23 +2769,23 @@ class TrieRouter {
|
|
|
2754
2769
|
return
|
|
2755
2770
|
}
|
|
2756
2771
|
const r = e[0]
|
|
2757
|
-
let
|
|
2758
|
-
|
|
2759
|
-
if ((r.startsWith(':') && ((
|
|
2772
|
+
let i = r,
|
|
2773
|
+
o
|
|
2774
|
+
if ((r.startsWith(':') && ((i = ':'), (o = r.slice(1))), !this.forks.has(i))) {
|
|
2760
2775
|
const u = new TrieRouter()
|
|
2761
|
-
|
|
2776
|
+
o && (u.variableName = o), this.forks.set(i, u)
|
|
2762
2777
|
}
|
|
2763
|
-
this.forks.get(
|
|
2778
|
+
this.forks.get(i).insert(e.slice(1), t)
|
|
2764
2779
|
}
|
|
2765
|
-
async handle(e, t, r,
|
|
2766
|
-
if (e.length === 0) return this.handler ? (await this.handler(t, r,
|
|
2767
|
-
const
|
|
2768
|
-
u = this.forks.get(
|
|
2769
|
-
if (u) return u.handle(e.slice(1), t, r,
|
|
2780
|
+
async handle(e, t, r, i) {
|
|
2781
|
+
if (e.length === 0) return this.handler ? (await this.handler(t, r, i), !0) : !1
|
|
2782
|
+
const o = e[0],
|
|
2783
|
+
u = this.forks.get(o)
|
|
2784
|
+
if (u) return u.handle(e.slice(1), t, r, i)
|
|
2770
2785
|
const s = this.forks.get(':')
|
|
2771
|
-
if (s) return s.variableName &&
|
|
2786
|
+
if (s) return s.variableName && i.set(s.variableName, decodeURIComponent(o)), s.handle(e.slice(1), t, r, i)
|
|
2772
2787
|
const c = this.forks.get('*')
|
|
2773
|
-
return c ? (
|
|
2788
|
+
return c ? (i.set('wildcard', e.join('/')), c.handler ? (await c.handler(t, r, i), !0) : !1) : !1
|
|
2774
2789
|
}
|
|
2775
2790
|
}
|
|
2776
2791
|
exports.TrieRouter = TrieRouter
|
|
@@ -2810,8 +2825,8 @@ class Solver {
|
|
|
2810
2825
|
for (const t of this.steps)
|
|
2811
2826
|
try {
|
|
2812
2827
|
if (t.transientSkipStepName) {
|
|
2813
|
-
const
|
|
2814
|
-
if (
|
|
2828
|
+
const i = e[t.transientSkipStepName]
|
|
2829
|
+
if (i === 'skipped' || i === 'failed') {
|
|
2815
2830
|
;(e = { ...e, [t.name]: 'skipped' }), await this.onStepChange(e)
|
|
2816
2831
|
continue
|
|
2817
2832
|
}
|
|
@@ -2821,7 +2836,7 @@ class Solver {
|
|
|
2821
2836
|
continue
|
|
2822
2837
|
}
|
|
2823
2838
|
;(e = { ...e, [t.name]: 'in-progress' }), await this.onStepChange(e)
|
|
2824
|
-
for (let
|
|
2839
|
+
for (let i = 0; (await t.action(this.context, i)) === 'retry'; i++);
|
|
2825
2840
|
;(e = { ...e, [t.name]: 'completed' }), await this.onStepChange(e)
|
|
2826
2841
|
} catch (r) {
|
|
2827
2842
|
throw ((e = { ...e, [t.name]: 'failed' }), (this.status = 'failed'), await this.onStatusChange(this.status), await this.onStepChange(e), await this.onError(r), r)
|
|
@@ -2850,7 +2865,7 @@ class Lock {
|
|
|
2850
2865
|
(exports.Binary = { hexToUint8Array, uint8ArrayToHex, binaryToUint8Array, uint8ArrayToBinary, base64ToUint8Array, uint8ArrayToBase64, base32ToUint8Array, uint8ArrayToBase32, log2Reduce, partition, concatBytes, numberToUint8, uint8ToNumber, numberToUint16, uint16ToNumber, numberToUint32, uint32ToNumber, numberToUint64, uint64ToNumber, numberToUint256, uint256ToNumber, sliceBytes, keccak256, sha3_256, proximity, commonPrefix, setBit, getBit, indexOf: binaryIndexOf, equals: binaryEquals, padStart: binaryPadStart, padStartToMultiple: binaryPadStartToMultiple, padEnd: binaryPadEnd, padEndToMultiple: binaryPadEndToMultiple, xorCypher, isUtf8 }),
|
|
2851
2866
|
(exports.Elliptic = { privateKeyToPublicKey, compressPublicKey, publicKeyFromCompressed, publicKeyToAddress, signMessage, signHash, verifySignature, recoverPublicKey, checksumEncode }),
|
|
2852
2867
|
(exports.Random = { intBetween, floatBetween, chance, signed: signedRandom, makeSeededRng, point: randomPoint, procs }),
|
|
2853
|
-
(exports.Arrays = { countUnique, makeUnique, splitBySize, splitByCount, index: indexArray, indexCollection: indexArrayToCollection, onlyOrThrow, onlyOrNull, firstOrThrow, firstOrNull, shuffle, initialize: initializeArray, initialize2D: initialize2DArray, rotate2D: rotate2DArray, containsShape, glue, pluck, pick, pickMany, pickManyUnique, pickWeighted, pickRandomIndices, pickGuaranteed, last, pipe, makePipe, sortWeighted, pushAll, unshiftAll, filterAndRemove, merge: mergeArrays, empty, pushToBucket, unshiftAndLimit, atRolling, group, createOscillator, organiseWithLimits, tickPlaybook, getArgument, getBooleanArgument, getNumberArgument, requireStringArgument, requireNumberArgument, bringToFront, bringToFrontInPlace, findInstance, filterInstances, interleave, toggle, createHierarchy, multicall, maxBy }),
|
|
2868
|
+
(exports.Arrays = { countUnique, makeUnique, splitBySize, splitByCount, index: indexArray, indexCollection: indexArrayToCollection, onlyOrThrow, onlyOrNull, firstOrThrow, firstOrNull, shuffle, initialize: initializeArray, initialize2D: initialize2DArray, rotate2D: rotate2DArray, containsShape, glue, pluck, pick, pickMany, pickManyUnique, pickWeighted, pickRandomIndices, pickGuaranteed, last, pipe, makePipe, sortWeighted, pushAll, unshiftAll, filterAndRemove, merge: mergeArrays, empty, pushToBucket, unshiftAndLimit, atRolling, group, createOscillator, organiseWithLimits, tickPlaybook, getArgument, getBooleanArgument, getNumberArgument, requireStringArgument, requireNumberArgument, bringToFront, bringToFrontInPlace, findInstance, filterInstances, interleave, toggle, createHierarchy, multicall, maxBy, minBy, allIndexOf: allArrayIndexOf }),
|
|
2854
2869
|
(exports.System = { sleepMillis, forever, scheduleMany, waitFor, expandError, runAndSetInterval, whereAmI, withRetries }),
|
|
2855
2870
|
(exports.Numbers = { make: makeNumber, sum, average, median, getDistanceFromMidpoint, clamp, range, interpolate, createSequence, increment, decrement, format: formatNumber, fromDecimals, makeStorage, asMegabytes, convertBytes, hexToRgb, rgbToHex, haversineDistanceToMeters, roundToNearest, formatDistance, triangularNumber, searchFloat, binomialSample, toSignificantDigits }),
|
|
2856
2871
|
(exports.Promises = { raceFulfilled, invert: invertPromise, runInParallelBatches }),
|
|
@@ -2859,5 +2874,5 @@ class Lock {
|
|
|
2859
2874
|
(exports.Types = { isFunction, isObject, isStrictlyObject, isEmptyArray, isEmptyObject, isUndefined, isString, isNumber, isBoolean, isDate, isBlank, isId, isIntegerString, isHexString, isUrl, isBigint, isNullable, asString, asHexString, asSafeString, asIntegerString, asNumber, asFunction, asInteger, asBoolean, asDate, asNullableString, asEmptiableString, asId, asTime, asArray, asObject, asNullableObject, asStringMap, asNumericDictionary, asUrl, asBigint, asEmptiable, asNullable, asOptional, enforceObjectShape, enforceArrayShape, isPng, isJpg, isWebp, isImage }),
|
|
2860
2875
|
(exports.Strings = { tokenizeByCount, tokenizeByLength, searchHex, searchSubstring, randomHex: randomHexString, randomLetter: randomLetterString, randomAlphanumeric: randomAlphanumericString, randomRichAscii: randomRichAsciiString, randomUnicode: randomUnicodeString, includesAny, slugify, normalForm, enumify, escapeHtml, decodeHtmlEntities, after, afterLast, before, beforeLast, betweenWide, betweenNarrow, getPreLine, containsWord, containsWords, joinUrl, getFuzzyMatchScore, sortByFuzzyScore, splitOnce, splitAll, randomize, expand, shrinkTrim, capitalize, decapitalize, csvEscape, parseCsv, surroundInOut, getExtension, getBasename, normalizeEmail, normalizeFilename, parseFilename, camelToTitle, slugToTitle, slugToCamel, joinHumanly, findWeightedPair, extractBlock, extractAllBlocks, replaceBlocks, indexOfEarliest, lastIndexOfBefore, parseHtmlAttributes, readNextWord, readWordsAfterAll, resolveVariables, resolveVariableWithDefaultSyntax, resolveRemainingVariablesWithDefaults, isLetter, isDigit, isLetterOrDigit, isValidObjectPathCharacter, insert: insertString, indexOfRegex, allIndexOf, lineMatches, linesMatchInOrder, represent, resolveMarkdownLinks, buildUrl, isChinese, replaceBetweenStrings, describeMarkdown, isBalanced, textToFormat, splitFormatting, splitHashtags, splitUrls, route, explodeReplace, generateVariants, replaceWord, replacePascalCaseWords, stripHtml, breakLine, measureTextWidth, toLines, levenshteinDistance, findCommonPrefix, findCommonDirectory }),
|
|
2861
2876
|
(exports.Assertions = { asEqual, asTrue, asTruthy, asFalse, asFalsy, asEither }),
|
|
2862
|
-
(exports.Cache = { get: getCached, delete: deleteFromCache, deleteExpired: deleteExpiredFromCache, size: cacheSize }),
|
|
2877
|
+
(exports.Cache = { get: getCached, delete: deleteFromCache, deleteExpired: deleteExpiredFromCache, size: cacheSize, clear: clearCache }),
|
|
2863
2878
|
(exports.Vector = { addPoint, subtractPoint, multiplyPoint, normalizePoint, pushPoint, filterCoordinates, findCorners, findLines, raycast, raycastCircle, getLineIntersectionPoint })
|