@fireproof/core 0.0.6 → 0.0.8

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 (38) hide show
  1. package/coverage/blockstore.js.html +254 -242
  2. package/coverage/clock.js.html +203 -266
  3. package/coverage/db-index.js.html +426 -213
  4. package/coverage/fireproof.js.html +424 -238
  5. package/coverage/index.html +69 -84
  6. package/coverage/listener.js.html +13 -25
  7. package/coverage/prolly.js.html +267 -219
  8. package/coverage/tmp/coverage-28490-1680373005621-0.json +1 -0
  9. package/coverage/tmp/coverage-28494-1680373004502-0.json +1 -0
  10. package/coverage/tmp/coverage-28500-1680373005593-0.json +1 -0
  11. package/coverage/tmp/coverage-28504-1680373005559-0.json +1 -0
  12. package/coverage/valet.js.html +96 -246
  13. package/hooks/use-fireproof.ts +9 -8
  14. package/package.json +5 -5
  15. package/src/blockstore.js +16 -14
  16. package/src/clock.js +27 -5
  17. package/src/db-index.js +139 -96
  18. package/src/fireproof.js +48 -16
  19. package/src/hydrator.js +10 -0
  20. package/src/listener.js +0 -6
  21. package/src/prolly.js +43 -32
  22. package/src/valet.js +6 -62
  23. package/{src → test}/block.js +6 -6
  24. package/test/clock.test.js +0 -5
  25. package/test/db-index.test.js +11 -10
  26. package/test/fireproof.test.js +74 -19
  27. package/test/helpers.js +1 -1
  28. package/test/hydrator.test.js +75 -0
  29. package/test/prolly.test.js +2 -2
  30. package/test/proofs.test.js +5 -5
  31. package/test/reproduce-fixture-bug.test.js +2 -2
  32. package/coverage/tmp/coverage-42191-1678146904346-0.json +0 -1
  33. package/coverage/tmp/coverage-42193-1678146903521-0.json +0 -1
  34. package/coverage/tmp/coverage-42196-1678146904322-0.json +0 -1
  35. package/coverage/tmp/coverage-42197-1678146904292-0.json +0 -1
  36. package/scripts/propernames/gen.sh +0 -3
  37. package/scripts/randomcid.js +0 -12
  38. package/scripts/words/gen.js +0 -55
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">93.77% </span>
26
+ <span class="strong">94.35% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>241/257</span>
28
+ <span class='fraction'>301/319</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">85.71% </span>
33
+ <span class="strong">91.22% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>30/35</span>
35
+ <span class='fraction'>52/57</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">82.35% </span>
40
+ <span class="strong">80.95% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>14/17</span>
42
+ <span class='fraction'>17/21</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">93.77% </span>
47
+ <span class="strong">94.35% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>241/257</span>
49
+ <span class='fraction'>301/319</span>
50
50
  </div>
51
51
 
52
52
 
@@ -320,7 +320,69 @@
320
320
  <a name='L255'></a><a href='#L255'>255</a>
321
321
  <a name='L256'></a><a href='#L256'>256</a>
322
322
  <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
324
386
  <span class="cline-any cline-yes">1x</span>
325
387
  <span class="cline-any cline-yes">1x</span>
326
388
  <span class="cline-any cline-yes">1x</span>
@@ -338,247 +400,310 @@
338
400
  <span class="cline-any cline-yes">1x</span>
339
401
  <span class="cline-any cline-yes">1x</span>
340
402
  <span class="cline-any cline-yes">1x</span>
341
- <span class="cline-any cline-yes">31x</span>
342
- <span class="cline-any cline-yes">31x</span>
343
- <span class="cline-any cline-yes">31x</span>
344
- <span class="cline-any cline-yes">31x</span>
345
- <span class="cline-any cline-yes">31x</span>
346
- <span class="cline-any cline-yes">31x</span>
347
- <span class="cline-any cline-yes">31x</span>
348
- <span class="cline-any cline-yes">31x</span>
349
- <span class="cline-any cline-yes">31x</span>
350
- <span class="cline-any cline-yes">31x</span>
351
- <span class="cline-any cline-yes">31x</span>
352
- <span class="cline-any cline-yes">2x</span>
353
- <span class="cline-any cline-yes">2x</span>
354
- <span class="cline-any cline-yes">31x</span>
355
- <span class="cline-any cline-yes">31x</span>
356
- <span class="cline-any cline-yes">31x</span>
357
- <span class="cline-any cline-yes">31x</span>
358
- <span class="cline-any cline-yes">31x</span>
359
- <span class="cline-any cline-yes">31x</span>
360
- <span class="cline-any cline-yes">31x</span>
361
- <span class="cline-any cline-yes">31x</span>
362
- <span class="cline-any cline-yes">31x</span>
363
- <span class="cline-any cline-yes">31x</span>
364
- <span class="cline-any cline-yes">31x</span>
365
- <span class="cline-any cline-yes">31x</span>
366
- <span class="cline-any cline-yes">31x</span>
367
- <span class="cline-any cline-yes">31x</span>
368
- <span class="cline-any cline-yes">31x</span>
369
- <span class="cline-any cline-yes">31x</span>
370
- <span class="cline-any cline-yes">31x</span>
371
- <span class="cline-any cline-yes">31x</span>
372
- <span class="cline-any cline-yes">31x</span>
403
+ <span class="cline-any cline-yes">1x</span>
404
+ <span class="cline-any cline-yes">46x</span>
405
+ <span class="cline-any cline-yes">46x</span>
406
+ <span class="cline-any cline-yes">46x</span>
407
+ <span class="cline-any cline-yes">46x</span>
408
+ <span class="cline-any cline-yes">46x</span>
409
+ <span class="cline-any cline-yes">46x</span>
410
+ <span class="cline-any cline-yes">46x</span>
411
+ <span class="cline-any cline-yes">46x</span>
412
+ <span class="cline-any cline-yes">46x</span>
413
+ <span class="cline-any cline-yes">46x</span>
414
+ <span class="cline-any cline-yes">46x</span>
415
+ <span class="cline-any cline-yes">34x</span>
416
+ <span class="cline-any cline-yes">34x</span>
417
+ <span class="cline-any cline-yes">46x</span>
418
+ <span class="cline-any cline-yes">46x</span>
419
+ <span class="cline-any cline-yes">46x</span>
420
+ <span class="cline-any cline-yes">46x</span>
421
+ <span class="cline-any cline-yes">46x</span>
422
+ <span class="cline-any cline-yes">46x</span>
423
+ <span class="cline-any cline-yes">46x</span>
424
+ <span class="cline-any cline-yes">46x</span>
425
+ <span class="cline-any cline-yes">46x</span>
426
+ <span class="cline-any cline-yes">46x</span>
427
+ <span class="cline-any cline-yes">46x</span>
428
+ <span class="cline-any cline-yes">46x</span>
429
+ <span class="cline-any cline-yes">46x</span>
430
+ <span class="cline-any cline-yes">46x</span>
431
+ <span class="cline-any cline-yes">46x</span>
432
+ <span class="cline-any cline-yes">46x</span>
433
+ <span class="cline-any cline-yes">46x</span>
434
+ <span class="cline-any cline-yes">46x</span>
435
+ <span class="cline-any cline-yes">46x</span>
436
+ <span class="cline-any cline-yes">46x</span>
373
437
  <span class="cline-any cline-yes">4x</span>
374
438
  <span class="cline-any cline-yes">4x</span>
375
439
  <span class="cline-any cline-yes">4x</span>
376
440
  <span class="cline-any cline-yes">4x</span>
377
- <span class="cline-any cline-yes">31x</span>
378
- <span class="cline-any cline-yes">31x</span>
379
- <span class="cline-any cline-yes">31x</span>
380
- <span class="cline-any cline-yes">31x</span>
381
- <span class="cline-any cline-yes">31x</span>
382
- <span class="cline-any cline-yes">31x</span>
383
- <span class="cline-any cline-yes">31x</span>
384
- <span class="cline-any cline-yes">31x</span>
385
- <span class="cline-any cline-yes">31x</span>
386
- <span class="cline-any cline-yes">31x</span>
387
- <span class="cline-any cline-yes">31x</span>
441
+ <span class="cline-any cline-yes">46x</span>
442
+ <span class="cline-any cline-yes">46x</span>
443
+ <span class="cline-any cline-yes">46x</span>
444
+ <span class="cline-any cline-yes">46x</span>
445
+ <span class="cline-any cline-yes">46x</span>
446
+ <span class="cline-any cline-yes">46x</span>
447
+ <span class="cline-any cline-yes">46x</span>
448
+ <span class="cline-any cline-yes">46x</span>
449
+ <span class="cline-any cline-yes">46x</span>
450
+ <span class="cline-any cline-yes">46x</span>
451
+ <span class="cline-any cline-yes">46x</span>
388
452
  <span class="cline-any cline-yes">1x</span>
389
453
  <span class="cline-any cline-yes">1x</span>
390
454
  <span class="cline-any cline-yes">1x</span>
391
455
  <span class="cline-any cline-yes">1x</span>
392
- <span class="cline-any cline-yes">31x</span>
393
- <span class="cline-any cline-yes">31x</span>
394
- <span class="cline-any cline-yes">31x</span>
395
- <span class="cline-any cline-yes">31x</span>
396
- <span class="cline-any cline-yes">31x</span>
397
- <span class="cline-any cline-yes">31x</span>
398
- <span class="cline-any cline-yes">31x</span>
399
- <span class="cline-any cline-yes">31x</span>
456
+ <span class="cline-any cline-yes">46x</span>
457
+ <span class="cline-any cline-yes">46x</span>
458
+ <span class="cline-any cline-yes">46x</span>
459
+ <span class="cline-any cline-yes">46x</span>
460
+ <span class="cline-any cline-yes">46x</span>
461
+ <span class="cline-any cline-yes">46x</span>
462
+ <span class="cline-any cline-yes">46x</span>
463
+ <span class="cline-any cline-yes">46x</span>
400
464
  <span class="cline-any cline-no">&nbsp;</span>
401
465
  <span class="cline-any cline-no">&nbsp;</span>
402
466
  <span class="cline-any cline-no">&nbsp;</span>
403
- <span class="cline-any cline-yes">31x</span>
404
- <span class="cline-any cline-yes">31x</span>
405
- <span class="cline-any cline-yes">31x</span>
406
- <span class="cline-any cline-yes">31x</span>
407
- <span class="cline-any cline-yes">31x</span>
408
- <span class="cline-any cline-yes">31x</span>
409
- <span class="cline-any cline-yes">31x</span>
410
- <span class="cline-any cline-yes">31x</span>
411
- <span class="cline-any cline-yes">31x</span>
412
- <span class="cline-any cline-yes">31x</span>
413
- <span class="cline-any cline-yes">53x</span>
414
- <span class="cline-any cline-yes">53x</span>
415
- <span class="cline-any cline-yes">53x</span>
416
- <span class="cline-any cline-yes">9x</span>
417
- <span class="cline-any cline-yes">9x</span>
418
- <span class="cline-any cline-yes">9x</span>
419
- <span class="cline-any cline-yes">6x</span>
467
+ <span class="cline-any cline-yes">46x</span>
468
+ <span class="cline-any cline-yes">46x</span>
469
+ <span class="cline-any cline-yes">46x</span>
470
+ <span class="cline-any cline-yes">46x</span>
471
+ <span class="cline-any cline-yes">46x</span>
472
+ <span class="cline-any cline-yes">46x</span>
473
+ <span class="cline-any cline-yes">46x</span>
474
+ <span class="cline-any cline-yes">46x</span>
475
+ <span class="cline-any cline-yes">46x</span>
476
+ <span class="cline-any cline-yes">46x</span>
477
+ <span class="cline-any cline-yes">61x</span>
478
+ <span class="cline-any cline-yes">61x</span>
479
+ <span class="cline-any cline-yes">61x</span>
480
+ <span class="cline-any cline-yes">10x</span>
481
+ <span class="cline-any cline-yes">10x</span>
482
+ <span class="cline-any cline-yes">10x</span>
483
+ <span class="cline-any cline-yes">7x</span>
420
484
  <span class="cline-any cline-no">&nbsp;</span>
421
- <span class="cline-any cline-yes">6x</span>
422
- <span class="cline-any cline-yes">6x</span>
423
- <span class="cline-any cline-yes">6x</span>
424
- <span class="cline-any cline-yes">6x</span>
425
- <span class="cline-any cline-yes">9x</span>
426
- <span class="cline-any cline-yes">9x</span>
427
- <span class="cline-any cline-yes">53x</span>
428
- <span class="cline-any cline-yes">44x</span>
429
- <span class="cline-any cline-yes">44x</span>
430
- <span class="cline-any cline-yes">44x</span>
431
- <span class="cline-any cline-yes">53x</span>
432
- <span class="cline-any cline-yes">53x</span>
433
- <span class="cline-any cline-yes">31x</span>
434
- <span class="cline-any cline-yes">31x</span>
435
- <span class="cline-any cline-yes">31x</span>
436
- <span class="cline-any cline-yes">31x</span>
437
- <span class="cline-any cline-yes">31x</span>
438
- <span class="cline-any cline-yes">31x</span>
439
- <span class="cline-any cline-yes">31x</span>
440
- <span class="cline-any cline-yes">31x</span>
441
- <span class="cline-any cline-yes">31x</span>
485
+ <span class="cline-any cline-yes">7x</span>
486
+ <span class="cline-any cline-yes">7x</span>
487
+ <span class="cline-any cline-yes">7x</span>
488
+ <span class="cline-any cline-yes">7x</span>
489
+ <span class="cline-any cline-yes">10x</span>
490
+ <span class="cline-any cline-yes">10x</span>
491
+ <span class="cline-any cline-yes">10x</span>
492
+ <span class="cline-any cline-yes">61x</span>
493
+ <span class="cline-any cline-yes">51x</span>
494
+ <span class="cline-any cline-yes">51x</span>
495
+ <span class="cline-any cline-yes">51x</span>
496
+ <span class="cline-any cline-yes">51x</span>
497
+ <span class="cline-any cline-yes">51x</span>
498
+ <span class="cline-any cline-yes">61x</span>
499
+ <span class="cline-any cline-yes">61x</span>
500
+ <span class="cline-any cline-yes">61x</span>
501
+ <span class="cline-any cline-yes">61x</span>
502
+ <span class="cline-any cline-yes">61x</span>
503
+ <span class="cline-any cline-yes">61x</span>
504
+ <span class="cline-any cline-yes">46x</span>
505
+ <span class="cline-any cline-yes">46x</span>
506
+ <span class="cline-any cline-yes">46x</span>
507
+ <span class="cline-any cline-yes">46x</span>
508
+ <span class="cline-any cline-yes">46x</span>
509
+ <span class="cline-any cline-yes">46x</span>
510
+ <span class="cline-any cline-yes">46x</span>
511
+ <span class="cline-any cline-yes">46x</span>
512
+ <span class="cline-any cline-yes">46x</span>
442
513
  <span class="cline-any cline-yes">10x</span>
443
514
  <span class="cline-any cline-yes">10x</span>
444
515
  <span class="cline-any cline-no">&nbsp;</span>
445
516
  <span class="cline-any cline-no">&nbsp;</span>
446
517
  <span class="cline-any cline-yes">10x</span>
447
- <span class="cline-any cline-yes">31x</span>
448
- <span class="cline-any cline-yes">31x</span>
449
- <span class="cline-any cline-yes">123x</span>
450
- <span class="cline-any cline-yes">123x</span>
518
+ <span class="cline-any cline-yes">46x</span>
519
+ <span class="cline-any cline-yes">46x</span>
520
+ <span class="cline-any cline-yes">166x</span>
521
+ <span class="cline-any cline-yes">166x</span>
451
522
  <span class="cline-any cline-yes">14x</span>
452
523
  <span class="cline-any cline-yes">14x</span>
453
- <span class="cline-any cline-yes">123x</span>
454
- <span class="cline-any cline-yes">31x</span>
455
- <span class="cline-any cline-yes">31x</span>
456
- <span class="cline-any cline-yes">31x</span>
457
- <span class="cline-any cline-yes">31x</span>
458
- <span class="cline-any cline-yes">31x</span>
459
- <span class="cline-any cline-yes">31x</span>
460
- <span class="cline-any cline-yes">31x</span>
461
- <span class="cline-any cline-yes">31x</span>
462
- <span class="cline-any cline-yes">31x</span>
463
- <span class="cline-any cline-yes">31x</span>
464
- <span class="cline-any cline-yes">31x</span>
465
- <span class="cline-any cline-yes">125x</span>
524
+ <span class="cline-any cline-yes">166x</span>
525
+ <span class="cline-any cline-yes">46x</span>
526
+ <span class="cline-any cline-yes">46x</span>
527
+ <span class="cline-any cline-yes">46x</span>
528
+ <span class="cline-any cline-yes">46x</span>
529
+ <span class="cline-any cline-yes">46x</span>
530
+ <span class="cline-any cline-yes">46x</span>
531
+ <span class="cline-any cline-yes">46x</span>
532
+ <span class="cline-any cline-yes">46x</span>
533
+ <span class="cline-any cline-yes">46x</span>
534
+ <span class="cline-any cline-yes">46x</span>
535
+ <span class="cline-any cline-yes">46x</span>
536
+ <span class="cline-any cline-yes">170x</span>
466
537
  <span class="cline-any cline-yes">5x</span>
467
538
  <span class="cline-any cline-yes">5x</span>
468
539
  <span class="cline-any cline-yes">5x</span>
469
540
  <span class="cline-any cline-yes">5x</span>
470
541
  <span class="cline-any cline-yes">5x</span>
471
- <span class="cline-any cline-yes">125x</span>
472
- <span class="cline-any cline-yes">31x</span>
473
- <span class="cline-any cline-yes">31x</span>
474
- <span class="cline-any cline-yes">31x</span>
475
- <span class="cline-any cline-yes">31x</span>
476
- <span class="cline-any cline-yes">31x</span>
477
- <span class="cline-any cline-yes">31x</span>
478
- <span class="cline-any cline-yes">31x</span>
479
- <span class="cline-any cline-yes">31x</span>
480
- <span class="cline-any cline-yes">31x</span>
481
- <span class="cline-any cline-yes">31x</span>
482
- <span class="cline-any cline-yes">31x</span>
483
- <span class="cline-any cline-yes">31x</span>
484
- <span class="cline-any cline-yes">122x</span>
485
- <span class="cline-any cline-yes">122x</span>
486
- <span class="cline-any cline-yes">120x</span>
487
- <span class="cline-any cline-yes">122x</span>
488
- <span class="cline-any cline-yes">31x</span>
489
- <span class="cline-any cline-yes">31x</span>
490
- <span class="cline-any cline-yes">31x</span>
491
- <span class="cline-any cline-yes">31x</span>
492
- <span class="cline-any cline-yes">31x</span>
493
- <span class="cline-any cline-yes">31x</span>
494
- <span class="cline-any cline-yes">31x</span>
495
- <span class="cline-any cline-yes">31x</span>
496
- <span class="cline-any cline-yes">31x</span>
542
+ <span class="cline-any cline-yes">170x</span>
543
+ <span class="cline-any cline-yes">46x</span>
544
+ <span class="cline-any cline-yes">46x</span>
545
+ <span class="cline-any cline-yes">46x</span>
546
+ <span class="cline-any cline-yes">46x</span>
547
+ <span class="cline-any cline-yes">46x</span>
548
+ <span class="cline-any cline-yes">46x</span>
549
+ <span class="cline-any cline-yes">46x</span>
550
+ <span class="cline-any cline-yes">46x</span>
551
+ <span class="cline-any cline-yes">46x</span>
552
+ <span class="cline-any cline-yes">46x</span>
553
+ <span class="cline-any cline-yes">46x</span>
554
+ <span class="cline-any cline-yes">46x</span>
555
+ <span class="cline-any cline-yes">166x</span>
556
+ <span class="cline-any cline-yes">166x</span>
557
+ <span class="cline-any cline-yes">164x</span>
558
+ <span class="cline-any cline-yes">166x</span>
559
+ <span class="cline-any cline-yes">46x</span>
560
+ <span class="cline-any cline-yes">46x</span>
561
+ <span class="cline-any cline-yes">46x</span>
562
+ <span class="cline-any cline-yes">46x</span>
563
+ <span class="cline-any cline-yes">46x</span>
564
+ <span class="cline-any cline-yes">46x</span>
565
+ <span class="cline-any cline-yes">46x</span>
566
+ <span class="cline-any cline-yes">46x</span>
567
+ <span class="cline-any cline-yes">46x</span>
568
+ <span class="cline-any cline-yes">4x</span>
569
+ <span class="cline-any cline-yes">4x</span>
570
+ <span class="cline-any cline-yes">4x</span>
571
+ <span class="cline-any cline-yes">1x</span>
572
+ <span class="cline-any cline-yes">1x</span>
573
+ <span class="cline-any cline-yes">4x</span>
497
574
  <span class="cline-any cline-yes">3x</span>
575
+ <span class="cline-any cline-yes">3x</span>
576
+ <span class="cline-any cline-yes">4x</span>
577
+ <span class="cline-any cline-yes">3x</span>
578
+ <span class="cline-any cline-yes">3x</span>
579
+ <span class="cline-any cline-yes">3x</span>
580
+ <span class="cline-any cline-yes">4x</span>
581
+ <span class="cline-any cline-yes">46x</span>
582
+ <span class="cline-any cline-yes">46x</span>
583
+ <span class="cline-any cline-yes">46x</span>
584
+ <span class="cline-any cline-yes">46x</span>
585
+ <span class="cline-any cline-yes">46x</span>
586
+ <span class="cline-any cline-yes">46x</span>
587
+ <span class="cline-any cline-yes">46x</span>
588
+ <span class="cline-any cline-yes">46x</span>
589
+ <span class="cline-any cline-yes">167x</span>
590
+ <span class="cline-any cline-yes">167x</span>
591
+ <span class="cline-any cline-yes">4x</span>
592
+ <span class="cline-any cline-yes">4x</span>
593
+ <span class="cline-any cline-yes">4x</span>
594
+ <span class="cline-any cline-yes">4x</span>
595
+ <span class="cline-any cline-yes">4x</span>
498
596
  <span class="cline-any cline-yes">2x</span>
499
597
  <span class="cline-any cline-yes">2x</span>
500
- <span class="cline-any cline-yes">2x</span>
501
- <span class="cline-any cline-yes">3x</span>
502
- <span class="cline-any cline-yes">31x</span>
503
- <span class="cline-any cline-yes">31x</span>
504
- <span class="cline-any cline-yes">31x</span>
505
- <span class="cline-any cline-yes">31x</span>
506
- <span class="cline-any cline-yes">31x</span>
507
- <span class="cline-any cline-yes">31x</span>
508
- <span class="cline-any cline-yes">31x</span>
509
- <span class="cline-any cline-yes">31x</span>
510
- <span class="cline-any cline-yes">122x</span>
511
- <span class="cline-any cline-yes">122x</span>
512
- <span class="cline-any cline-yes">122x</span>
513
- <span class="cline-any cline-yes">122x</span>
514
- <span class="cline-any cline-yes">122x</span>
515
- <span class="cline-any cline-yes">122x</span>
598
+ <span class="cline-any cline-yes">4x</span>
599
+ <span class="cline-any cline-yes">165x</span>
600
+ <span class="cline-any cline-yes">165x</span>
601
+ <span class="cline-any cline-yes">165x</span>
602
+ <span class="cline-any cline-yes">165x</span>
603
+ <span class="cline-any cline-yes">165x</span>
604
+ <span class="cline-any cline-yes">167x</span>
516
605
  <span class="cline-any cline-no">&nbsp;</span>
517
606
  <span class="cline-any cline-no">&nbsp;</span>
518
607
  <span class="cline-any cline-no">&nbsp;</span>
519
- <span class="cline-any cline-yes">122x</span>
520
- <span class="cline-any cline-yes">122x</span>
521
- <span class="cline-any cline-yes">122x</span>
522
- <span class="cline-any cline-yes">122x</span>
523
- <span class="cline-any cline-yes">122x</span>
524
- <span class="cline-any cline-yes">31x</span>
525
- <span class="cline-any cline-yes">31x</span>
526
- <span class="cline-any cline-yes">31x</span>
527
- <span class="cline-any cline-yes">31x</span>
528
- <span class="cline-any cline-yes">31x</span>
529
- <span class="cline-any cline-yes">31x</span>
530
- <span class="cline-any cline-yes">31x</span>
531
- <span class="cline-any cline-yes">31x</span>
532
- <span class="cline-any cline-yes">31x</span>
533
- <span class="cline-any cline-yes">31x</span>
534
- <span class="cline-any cline-yes">31x</span>
535
- <span class="cline-any cline-yes">31x</span>
536
- <span class="cline-any cline-yes">31x</span>
537
- <span class="cline-any cline-yes">31x</span>
538
- <span class="cline-any cline-yes">31x</span>
539
- <span class="cline-any cline-yes">31x</span>
540
- <span class="cline-any cline-yes">31x</span>
541
- <span class="cline-any cline-yes">31x</span>
542
- <span class="cline-any cline-yes">31x</span>
543
- <span class="cline-any cline-yes">31x</span>
544
- <span class="cline-any cline-yes">31x</span>
545
- <span class="cline-any cline-yes">31x</span>
546
- <span class="cline-any cline-yes">31x</span>
547
- <span class="cline-any cline-yes">31x</span>
548
- <span class="cline-any cline-yes">31x</span>
549
- <span class="cline-any cline-yes">31x</span>
550
- <span class="cline-any cline-yes">31x</span>
551
- <span class="cline-any cline-yes">31x</span>
552
- <span class="cline-any cline-yes">31x</span>
553
- <span class="cline-any cline-yes">31x</span>
554
- <span class="cline-any cline-yes">31x</span>
555
- <span class="cline-any cline-yes">31x</span>
556
- <span class="cline-any cline-yes">31x</span>
557
- <span class="cline-any cline-yes">31x</span>
558
- <span class="cline-any cline-yes">31x</span>
559
- <span class="cline-any cline-yes">31x</span>
560
- <span class="cline-any cline-yes">46x</span>
561
- <span class="cline-any cline-yes">41x</span>
608
+ <span class="cline-any cline-yes">165x</span>
609
+ <span class="cline-any cline-yes">165x</span>
610
+ <span class="cline-any cline-yes">165x</span>
611
+ <span class="cline-any cline-yes">165x</span>
612
+ <span class="cline-any cline-yes">165x</span>
613
+ <span class="cline-any cline-yes">165x</span>
614
+ <span class="cline-any cline-yes">165x</span>
615
+ <span class="cline-any cline-yes">165x</span>
616
+ <span class="cline-any cline-yes">165x</span>
617
+ <span class="cline-any cline-yes">167x</span>
618
+ <span class="cline-any cline-yes">46x</span>
619
+ <span class="cline-any cline-yes">46x</span>
620
+ <span class="cline-any cline-yes">46x</span>
621
+ <span class="cline-any cline-yes">46x</span>
622
+ <span class="cline-any cline-yes">46x</span>
623
+ <span class="cline-any cline-yes">46x</span>
624
+ <span class="cline-any cline-yes">46x</span>
625
+ <span class="cline-any cline-yes">46x</span>
626
+ <span class="cline-any cline-yes">46x</span>
627
+ <span class="cline-any cline-yes">46x</span>
628
+ <span class="cline-any cline-yes">46x</span>
629
+ <span class="cline-any cline-yes">46x</span>
630
+ <span class="cline-any cline-yes">46x</span>
562
631
  <span class="cline-any cline-yes">46x</span>
632
+ <span class="cline-any cline-yes">46x</span>
633
+ <span class="cline-any cline-yes">46x</span>
634
+ <span class="cline-any cline-yes">46x</span>
635
+ <span class="cline-any cline-yes">46x</span>
636
+ <span class="cline-any cline-yes">46x</span>
637
+ <span class="cline-any cline-yes">46x</span>
638
+ <span class="cline-any cline-yes">46x</span>
639
+ <span class="cline-any cline-yes">46x</span>
640
+ <span class="cline-any cline-yes">46x</span>
641
+ <span class="cline-any cline-yes">46x</span>
642
+ <span class="cline-any cline-yes">46x</span>
643
+ <span class="cline-any cline-yes">46x</span>
644
+ <span class="cline-any cline-yes">46x</span>
645
+ <span class="cline-any cline-yes">46x</span>
646
+ <span class="cline-any cline-yes">46x</span>
647
+ <span class="cline-any cline-yes">46x</span>
648
+ <span class="cline-any cline-yes">46x</span>
649
+ <span class="cline-any cline-yes">46x</span>
650
+ <span class="cline-any cline-yes">46x</span>
651
+ <span class="cline-any cline-yes">46x</span>
652
+ <span class="cline-any cline-yes">46x</span>
653
+ <span class="cline-any cline-yes">62x</span>
654
+ <span class="cline-any cline-yes">62x</span>
655
+ <span class="cline-any cline-yes">57x</span>
656
+ <span class="cline-any cline-yes">57x</span>
657
+ <span class="cline-any cline-yes">62x</span>
563
658
  <span class="cline-any cline-yes">5x</span>
564
659
  <span class="cline-any cline-yes">5x</span>
565
- <span class="cline-any cline-yes">36x</span>
566
- <span class="cline-any cline-yes">36x</span>
660
+ <span class="cline-any cline-yes">52x</span>
661
+ <span class="cline-any cline-yes">62x</span>
662
+ <span class="cline-any cline-yes">7x</span>
663
+ <span class="cline-any cline-yes">7x</span>
664
+ <span class="cline-any cline-yes">52x</span>
665
+ <span class="cline-any cline-yes">52x</span>
666
+ <span class="cline-any cline-yes">52x</span>
667
+ <span class="cline-any cline-yes">52x</span>
668
+ <span class="cline-any cline-yes">52x</span>
669
+ <span class="cline-any cline-yes">52x</span>
670
+ <span class="cline-any cline-yes">62x</span>
671
+ <span class="cline-any cline-yes">46x</span>
672
+ <span class="cline-any cline-yes">46x</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-yes">46x</span>
567
676
  <span class="cline-any cline-yes">46x</span>
568
- <span class="cline-any cline-yes">31x</span>
569
- <span class="cline-any cline-yes">31x</span>
570
677
  <span class="cline-any cline-no">&nbsp;</span>
571
678
  <span class="cline-any cline-no">&nbsp;</span>
572
679
  <span class="cline-any cline-no">&nbsp;</span>
573
680
  <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-yes">31x</span>
575
- <span class="cline-any cline-yes">31x</span>
681
+ <span class="cline-any cline-yes">46x</span>
682
+ <span class="cline-any cline-yes">46x</span>
576
683
  <span class="cline-any cline-no">&nbsp;</span>
577
684
  <span class="cline-any cline-no">&nbsp;</span>
578
685
  <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-yes">31x</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { put, get, getAll, eventsSince } from './prolly.js'
581
- import Blockstore, { doTransaction } from './blockstore.js'
686
+ <span class="cline-any cline-yes">46x</span>
687
+ <span class="cline-any cline-yes">1x</span>
688
+ <span class="cline-any cline-yes">1x</span>
689
+ <span class="cline-any cline-yes">524x</span>
690
+ <span class="cline-any cline-yes">123x</span>
691
+ <span class="cline-any cline-yes">123x</span>
692
+ <span class="cline-any cline-yes">524x</span>
693
+ <span class="cline-any cline-yes">1x</span>
694
+ <span class="cline-any cline-yes">195x</span>
695
+ <span class="cline-any cline-yes">195x</span>
696
+ <span class="cline-any cline-yes">195x</span>
697
+ <span class="cline-any cline-yes">195x</span>
698
+ <span class="cline-any cline-yes">1x</span>
699
+ <span class="cline-any cline-yes">167x</span>
700
+ <span class="cline-any cline-yes">167x</span>
701
+ <span class="cline-any cline-yes">167x</span>
702
+ <span class="cline-any cline-yes">167x</span>
703
+ <span class="cline-any cline-yes">167x</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { vis, put, get, getAll, eventsSince } from './prolly.js'
705
+ import TransactionBlockstore, { doTransaction } from './blockstore.js'
706
+ import charwise from 'charwise'
582
707
  &nbsp;
583
708
  // const sleep = ms =&gt; new Promise(resolve =&gt; setTimeout(resolve, ms))
584
709
  &nbsp;
@@ -605,16 +730,17 @@ export default class Fireproof {
605
730
  * @static
606
731
  * @returns {Fireproof} - a new Fireproof instance
607
732
  */
608
- static storage = () =&gt; {
609
- return new Fireproof(new Blockstore(), [])
733
+ static storage = (name) =&gt; {
734
+ return new Fireproof(new TransactionBlockstore(name), [], { name })
610
735
  }
611
736
  &nbsp;
612
- constructor (blocks, clock, config = {}, authCtx = {}) {
737
+ constructor (blocks, clock, config, authCtx = {}) {
738
+ this.name = config?.name || 'global'
739
+ this.instanceId = `fp.${this.name}.${Math.random().toString(36).substring(2, 7)}`
613
740
  this.blocks = blocks
614
741
  this.clock = clock
615
742
  this.config = config
616
743
  this.authCtx = authCtx
617
- this.instanceId = 'db.' + Math.random().toString(36).substring(2, 7)
618
744
  }
619
745
  &nbsp;
620
746
  /**
@@ -628,7 +754,7 @@ export default class Fireproof {
628
754
  */
629
755
  snapshot (clock) {
630
756
  // how to handle listeners, views, and config?
631
- // todo needs a test for that
757
+ // todo needs a test for listeners, views, and config
632
758
  return new Fireproof(this.blocks, clock <span class="branch-0 cbranch-no" title="branch not covered" >|| this.clock)</span>
633
759
  }
634
760
  &nbsp;
@@ -668,11 +794,11 @@ export default class Fireproof {
668
794
  */
669
795
  async changesSince (event) {
670
796
  // console.log('changesSince', this.instanceId, event, this.clock)
671
- let rows
797
+ let rows, dataCIDs, clockCIDs
672
798
  if (event) {
673
799
  const resp = await eventsSince(this.blocks, this.clock, event)
674
800
  const docsMap = new Map()
675
- for (const { key, type, value } of resp) {
801
+ for (const { key, type, value } of resp.result.map(decodeEvent)) {
676
802
  if (type === 'del') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
677
803
  <span class="cstat-no" title="statement not covered" > docsMap.set(key, { key, del: true })</span>
678
804
  } else {
@@ -680,12 +806,19 @@ export default class Fireproof {
680
806
  }
681
807
  }
682
808
  rows = Array.from(docsMap.values())
809
+ clockCIDs = resp.cids
683
810
  // console.log('change rows', this.instanceId, rows)
684
811
  } else {
685
- rows = (await getAll(this.blocks, this.clock)).map(({ key, value }) =&gt; ({ key, value }))
812
+ const allResp = await getAll(this.blocks, this.clock)
813
+ rows = allResp.result.map(({ key, value }) =&gt; (decodeEvent({ key, value })))
814
+ dataCIDs = allResp.cids
686
815
  // console.log('dbdoc rows', this.instanceId, rows)
687
816
  }
688
- return { rows, clock: this.clock }
817
+ return {
818
+ rows,
819
+ clock: this.clock,
820
+ proof: { data: await cidsToProof(dataCIDs), clock: await cidsToProof(clockCIDs) }
821
+ }
689
822
  }
690
823
  &nbsp;
691
824
  /**
@@ -703,7 +836,7 @@ export default class Fireproof {
703
836
  }
704
837
  &nbsp;
705
838
  async #notifyListeners (changes) {
706
- // await sleep(0)
839
+ // await sleep(10)
707
840
  for (const listener of this.#listeners) {
708
841
  await listener(changes)
709
842
  }
@@ -737,10 +870,10 @@ export default class Fireproof {
737
870
  * @memberof Fireproof
738
871
  * @instance
739
872
  */
740
- async put ({ _id, ...doc }) {
741
- const id = _id <span class="branch-0 cbranch-no" title="branch not covered" >|| 'f' + Math.random().toString(36).slice(2)</span>
873
+ async put ({ _id, _proof, ...doc }) {
874
+ const id = _id || 'f' + Math.random().toString(36).slice(2)
742
875
  await this.#runValidation({ _id: id, ...doc })
743
- return await this.#putToProllyTree({ key: id, value: doc })
876
+ return await this.#putToProllyTree({ key: id, value: doc }, doc._clock)
744
877
  }
745
878
  &nbsp;
746
879
  /**
@@ -750,20 +883,38 @@ export default class Fireproof {
750
883
  * @memberof Fireproof
751
884
  * @instance
752
885
  */
753
- async del (id) {
886
+ async del (docOrId) {
887
+ let id
888
+ let clock = null
889
+ if (docOrId._id) {
890
+ id = docOrId._id
891
+ clock = docOrId._clock
892
+ } else {
893
+ id = docOrId
894
+ }
754
895
  await this.#runValidation({ _id: id, _deleted: true })
755
896
  // return await this.#putToProllyTree({ key: id, del: true }) // not working at prolly tree layer?
756
897
  // this tombstone is temporary until we can get the prolly tree to delete
757
- return await this.#putToProllyTree({ key: id, value: null })
898
+ return await this.#putToProllyTree({ key: id, value: null }, clock)
758
899
  }
759
900
  &nbsp;
760
901
  /**
761
902
  * Updates the underlying storage with the specified event.
762
903
  * @private
763
- * @param {import('../clock').EventLink&lt;import('../crdt').EventData&gt;} event - the event to add
764
- * @returns {Object&lt;{ id: string, clock: import('../clock').EventLink&lt;import('../crdt').EventData }&gt;} - The result of adding the event to storage
904
+ * @param {Object&lt;{key : string, value: any}&gt;} event - the event to add
905
+ * @returns {Object&lt;{ id: string, clock: CID[] }&gt;} - The result of adding the event to storage
765
906
  */
766
- async #putToProllyTree (event) {
907
+ async #putToProllyTree (decodedEvent, clock = null) {
908
+ const event = encodeEvent(decodedEvent)
909
+ if (clock &amp;&amp; JSON.stringify(clock) !== JSON.stringify(this.clock)) {
910
+ // we need to check and see what version of the document exists at the clock specified
911
+ // if it is the same as the one we are trying to put, then we can proceed
912
+ const resp = await eventsSince(this.blocks, this.clock, event.value._clock)
913
+ const missedChange = resp.result.find(({ key }) =&gt; key === event.key)
914
+ if (missedChange) {
915
+ throw new Error('MVCC conflict, document is changed, please reload the document and try again.')
916
+ }
917
+ }
767
918
  const result = await doTransaction(
768
919
  '#putToProllyTree',
769
920
  this.blocks,
@@ -773,17 +924,20 @@ export default class Fireproof {
773
924
  <span class="cstat-no" title="statement not covered" > console.error('failed', event)</span>
774
925
  <span class="cstat-no" title="statement not covered" > throw new Error('failed to put at storage layer')</span>
775
926
  <span class="cstat-no" title="statement not covered" > }</span>
927
+ // console.log('new clock head', this.instanceId, result.head.toString())
776
928
  this.clock = result.head // do we want to do this as a finally block
777
- result.id = event.key
778
- await this.#notifyListeners([event])
779
- return { id: result.id, clock: this.clock }
929
+ await this.#notifyListeners([decodedEvent]) // this type is odd
930
+ return {
931
+ id: decodedEvent.key,
932
+ clock: this.clock,
933
+ proof: { data: await cidsToProof(result.cids), clock: await cidsToProof(result.clockCIDs) }
934
+ }
935
+ // todo should include additions (or split clock)
780
936
  }
781
937
  &nbsp;
782
938
  // /**
783
939
  // * Advances the clock to the specified event and updates the root CID
784
940
  // * Will be used by replication
785
- // * @param {import('../clock').EventLink&lt;import('../crdt').EventData&gt;} event - the event to advance to
786
- // * @returns {import('../clock').EventLink&lt;import('../crdt').EventData&gt;[]} - the new clock after advancing
787
941
  // */
788
942
  // async advance (event) {
789
943
  // this.clock = await advance(this.blocks, this.clock, event)
@@ -809,20 +963,35 @@ export default class Fireproof {
809
963
  * Retrieves the document with the specified ID from the database
810
964
  *
811
965
  * @param {string} key - the ID of the document to retrieve
966
+ * @param {Object} [opts] - options
812
967
  * @returns {Object&lt;{_id: string, ...doc: Object}&gt;} - the document with the specified ID
813
968
  * @memberof Fireproof
814
969
  * @instance
815
970
  */
816
- async get (key) {
817
- const got = await get(this.blocks, this.clock, key)
971
+ async get (key, opts = {}) {
972
+ const clock = opts.clock || this.clock
973
+ const resp = await get(this.blocks, clock, charwise.encode(key))
974
+ &nbsp;
818
975
  // this tombstone is temporary until we can get the prolly tree to delete
819
- if (got === null) {
976
+ if (!resp || resp.result === null) {
820
977
  throw new Error('Not found')
821
978
  }
822
- got._id = key
823
- return got
979
+ const doc = resp.result
980
+ if (opts.mvcc === true) {
981
+ doc._clock = this.clock
982
+ }
983
+ doc._proof = {
984
+ data: await cidsToProof(resp.cids),
985
+ clock: this.clock
986
+ }
987
+ doc._id = key
988
+ return doc
824
989
  }
825
990
  &nbsp;
991
+ <span class="fstat-no" title="function not covered" > async * vis () {</span>
992
+ <span class="cstat-no" title="statement not covered" > return yield * vis(this.blocks, this.clock)</span>
993
+ <span class="cstat-no" title="statement not covered" > }</span>
994
+ &nbsp;
826
995
  <span class="fstat-no" title="function not covered" > setCarUploader (carUploaderFn) {</span>
827
996
  <span class="cstat-no" title="statement not covered" > console.log('registering car uploader')</span>
828
997
  <span class="cstat-no" title="statement not covered" > // https://en.wikipedia.org/wiki/Law_of_Demeter - this is a violation of the law of demeter</span>
@@ -834,6 +1003,23 @@ export default class Fireproof {
834
1003
  <span class="cstat-no" title="statement not covered" > this.blocks.valet.remoteBlockFunction = remoteBlockReaderFn</span>
835
1004
  <span class="cstat-no" title="statement not covered" > }</span>
836
1005
  }
1006
+ &nbsp;
1007
+ export async function cidsToProof (cids) {
1008
+ if (!cids || !cids.all) return []
1009
+ const all = await cids.all()
1010
+ return [...all].map((cid) =&gt; cid.toString())
1011
+ }
1012
+ &nbsp;
1013
+ function decodeEvent (event) {
1014
+ const decodedKey = charwise.decode(event.key)
1015
+ return { ...event, key: decodedKey }
1016
+ }
1017
+ &nbsp;
1018
+ function encodeEvent (event) {
1019
+ if (!(event &amp;&amp; event.key)) <span class="branch-0 cbranch-no" title="branch not covered" >return</span>
1020
+ const encodedKey = charwise.encode(event.key)
1021
+ return { ...event, key: encodedKey }
1022
+ }
837
1023
  &nbsp;</pre></td></tr></table></pre>
838
1024
 
839
1025
  <div class='push'></div><!-- for sticky footer -->
@@ -841,7 +1027,7 @@ export default class Fireproof {
841
1027
  <div class='footer quiet pad2 space-top1 center small'>
842
1028
  Code coverage generated by
843
1029
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
844
- at 2023-03-06T23:55:04.435Z
1030
+ at 2023-04-01T18:16:45.716Z
845
1031
  </div>
846
1032
  <script src="prettify.js"></script>
847
1033
  <script>