@onlineapps/conn-base-storage 1.0.1 → 1.0.3
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/coverage/clover.xml +288 -204
- package/coverage/coverage-final.json +5 -2
- package/coverage/lcov-report/config.js.html +244 -0
- package/coverage/lcov-report/defaults.js.html +214 -0
- package/coverage/lcov-report/index.html +72 -27
- package/coverage/lcov-report/index.js.html +1228 -199
- package/coverage/lcov-report/internal-url-adapter.js.html +28 -73
- package/coverage/lcov-report/sharedUrlAdapter.js.html +856 -0
- package/coverage/lcov.info +522 -393
- package/package.json +3 -1
- package/src/config.js +53 -0
- package/src/defaults.js +43 -0
- package/src/index.js +72 -83
- package/src/internal-url-adapter.js +13 -28
- package/tests/unit/internal-url-adapter.test.js +4 -0
- package/tests/unit/storage.extended.unit.test.js +14 -6
- package/tests/unit/storage.unit.test.js +16 -8
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">74.35% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>116/156</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">67.18% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>43/64</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">74.07% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>20/
|
|
42
|
+
<span class='fraction'>20/27</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">75.16% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>115/153</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -561,9 +561,350 @@
|
|
|
561
561
|
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
562
|
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
563
|
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
-
<a name='L499'></a><a href='#L499'>499</a
|
|
565
|
-
<
|
|
566
|
-
<
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
567
908
|
<span class="cline-any cline-neutral"> </span>
|
|
568
909
|
<span class="cline-any cline-neutral"> </span>
|
|
569
910
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -572,9 +913,12 @@
|
|
|
572
913
|
<span class="cline-any cline-neutral"> </span>
|
|
573
914
|
<span class="cline-any cline-neutral"> </span>
|
|
574
915
|
<span class="cline-any cline-neutral"> </span>
|
|
575
|
-
<span class="cline-any cline-yes">132x</span>
|
|
576
916
|
<span class="cline-any cline-neutral"> </span>
|
|
577
917
|
<span class="cline-any cline-neutral"> </span>
|
|
918
|
+
<span class="cline-any cline-yes">2x</span>
|
|
919
|
+
<span class="cline-any cline-yes">2x</span>
|
|
920
|
+
<span class="cline-any cline-yes">2x</span>
|
|
921
|
+
<span class="cline-any cline-yes">2x</span>
|
|
578
922
|
<span class="cline-any cline-neutral"> </span>
|
|
579
923
|
<span class="cline-any cline-neutral"> </span>
|
|
580
924
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -584,7 +928,6 @@
|
|
|
584
928
|
<span class="cline-any cline-neutral"> </span>
|
|
585
929
|
<span class="cline-any cline-neutral"> </span>
|
|
586
930
|
<span class="cline-any cline-neutral"> </span>
|
|
587
|
-
<span class="cline-any cline-yes">132x</span>
|
|
588
931
|
<span class="cline-any cline-neutral"> </span>
|
|
589
932
|
<span class="cline-any cline-neutral"> </span>
|
|
590
933
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -592,29 +935,19 @@
|
|
|
592
935
|
<span class="cline-any cline-neutral"> </span>
|
|
593
936
|
<span class="cline-any cline-neutral"> </span>
|
|
594
937
|
<span class="cline-any cline-neutral"> </span>
|
|
595
|
-
<span class="cline-any cline-yes">132x</span>
|
|
596
|
-
<span class="cline-any cline-yes">132x</span>
|
|
597
938
|
<span class="cline-any cline-neutral"> </span>
|
|
598
939
|
<span class="cline-any cline-neutral"> </span>
|
|
599
|
-
<span class="cline-any cline-yes">132x</span>
|
|
600
940
|
<span class="cline-any cline-neutral"> </span>
|
|
601
941
|
<span class="cline-any cline-neutral"> </span>
|
|
602
942
|
<span class="cline-any cline-neutral"> </span>
|
|
603
943
|
<span class="cline-any cline-neutral"> </span>
|
|
604
944
|
<span class="cline-any cline-neutral"> </span>
|
|
605
945
|
<span class="cline-any cline-neutral"> </span>
|
|
606
|
-
<span class="cline-any cline-yes">132x</span>
|
|
607
946
|
<span class="cline-any cline-neutral"> </span>
|
|
608
947
|
<span class="cline-any cline-neutral"> </span>
|
|
609
|
-
<span class="cline-any cline-yes">132x</span>
|
|
610
|
-
<span class="cline-any cline-yes">132x</span>
|
|
611
|
-
<span class="cline-any cline-yes">132x</span>
|
|
612
|
-
<span class="cline-any cline-yes">132x</span>
|
|
613
948
|
<span class="cline-any cline-neutral"> </span>
|
|
614
949
|
<span class="cline-any cline-neutral"> </span>
|
|
615
|
-
<span class="cline-any cline-yes">132x</span>
|
|
616
950
|
<span class="cline-any cline-neutral"> </span>
|
|
617
|
-
<span class="cline-any cline-yes">132x</span>
|
|
618
951
|
<span class="cline-any cline-neutral"> </span>
|
|
619
952
|
<span class="cline-any cline-neutral"> </span>
|
|
620
953
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -625,17 +958,11 @@
|
|
|
625
958
|
<span class="cline-any cline-neutral"> </span>
|
|
626
959
|
<span class="cline-any cline-neutral"> </span>
|
|
627
960
|
<span class="cline-any cline-neutral"> </span>
|
|
628
|
-
<span class="cline-any cline-yes">35x</span>
|
|
629
961
|
<span class="cline-any cline-neutral"> </span>
|
|
630
|
-
<span class="cline-any cline-yes">35x</span>
|
|
631
962
|
<span class="cline-any cline-neutral"> </span>
|
|
632
|
-
<span class="cline-any cline-yes">29x</span>
|
|
633
963
|
<span class="cline-any cline-neutral"> </span>
|
|
634
|
-
<span class="cline-any cline-yes">4x</span>
|
|
635
|
-
<span class="cline-any cline-yes">4x</span>
|
|
636
964
|
<span class="cline-any cline-neutral"> </span>
|
|
637
965
|
<span class="cline-any cline-neutral"> </span>
|
|
638
|
-
<span class="cline-any cline-yes">4x</span>
|
|
639
966
|
<span class="cline-any cline-neutral"> </span>
|
|
640
967
|
<span class="cline-any cline-neutral"> </span>
|
|
641
968
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -647,18 +974,14 @@
|
|
|
647
974
|
<span class="cline-any cline-neutral"> </span>
|
|
648
975
|
<span class="cline-any cline-neutral"> </span>
|
|
649
976
|
<span class="cline-any cline-neutral"> </span>
|
|
650
|
-
<span class="cline-any cline-yes">4x</span>
|
|
651
977
|
<span class="cline-any cline-neutral"> </span>
|
|
652
978
|
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-yes">71x</span>
|
|
653
980
|
<span class="cline-any cline-neutral"> </span>
|
|
654
981
|
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-yes">71x</span>
|
|
655
983
|
<span class="cline-any cline-neutral"> </span>
|
|
656
|
-
<span class="cline-any cline-yes">29x</span>
|
|
657
|
-
<span class="cline-any cline-yes">29x</span>
|
|
658
|
-
<span class="cline-any cline-yes">29x</span>
|
|
659
984
|
<span class="cline-any cline-neutral"> </span>
|
|
660
|
-
<span class="cline-any cline-yes">6x</span>
|
|
661
|
-
<span class="cline-any cline-yes">6x</span>
|
|
662
985
|
<span class="cline-any cline-neutral"> </span>
|
|
663
986
|
<span class="cline-any cline-neutral"> </span>
|
|
664
987
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -667,59 +990,130 @@
|
|
|
667
990
|
<span class="cline-any cline-neutral"> </span>
|
|
668
991
|
<span class="cline-any cline-neutral"> </span>
|
|
669
992
|
<span class="cline-any cline-neutral"> </span>
|
|
670
|
-
<span class="cline-any cline-yes">62x</span>
|
|
671
|
-
<span class="cline-any cline-yes">4x</span>
|
|
672
|
-
<span class="cline-any cline-yes">58x</span>
|
|
673
|
-
<span class="cline-any cline-yes">1x</span>
|
|
674
|
-
<span class="cline-any cline-yes">57x</span>
|
|
675
993
|
<span class="cline-any cline-neutral"> </span>
|
|
676
|
-
<span class="cline-any cline-yes">
|
|
677
|
-
<span class="cline-any cline-yes">16x</span>
|
|
994
|
+
<span class="cline-any cline-yes">71x</span>
|
|
678
995
|
<span class="cline-any cline-neutral"> </span>
|
|
679
996
|
<span class="cline-any cline-neutral"> </span>
|
|
680
|
-
<span class="cline-any cline-yes">4x</span>
|
|
681
997
|
<span class="cline-any cline-neutral"> </span>
|
|
682
998
|
<span class="cline-any cline-neutral"> </span>
|
|
683
999
|
<span class="cline-any cline-neutral"> </span>
|
|
684
|
-
<span class="cline-any cline-yes">62x</span>
|
|
685
1000
|
<span class="cline-any cline-neutral"> </span>
|
|
686
1001
|
<span class="cline-any cline-neutral"> </span>
|
|
687
1002
|
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1004
|
+
<span class="cline-any cline-yes">71x</span>
|
|
688
1005
|
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-yes">71x</span>
|
|
689
1007
|
<span class="cline-any cline-neutral"> </span>
|
|
690
1008
|
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-yes">71x</span>
|
|
691
1010
|
<span class="cline-any cline-neutral"> </span>
|
|
692
1011
|
<span class="cline-any cline-neutral"> </span>
|
|
693
1012
|
<span class="cline-any cline-neutral"> </span>
|
|
694
1013
|
<span class="cline-any cline-neutral"> </span>
|
|
695
|
-
<span class="cline-any cline-yes">20x</span>
|
|
696
1014
|
<span class="cline-any cline-neutral"> </span>
|
|
697
|
-
<span class="cline-any cline-yes">20x</span>
|
|
698
1015
|
<span class="cline-any cline-neutral"> </span>
|
|
699
1016
|
<span class="cline-any cline-neutral"> </span>
|
|
700
1017
|
<span class="cline-any cline-neutral"> </span>
|
|
701
|
-
<span class="cline-any cline-
|
|
702
|
-
<span class="cline-any cline-
|
|
703
|
-
<span class="cline-any cline-yes">
|
|
1018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1045
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1056
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1063
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1064
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1067
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1069
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1070
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1071
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1079
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1085
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1086
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1087
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1089
|
+
<span class="cline-any cline-yes">4x</span>
|
|
704
1090
|
<span class="cline-any cline-yes">4x</span>
|
|
705
1091
|
<span class="cline-any cline-neutral"> </span>
|
|
706
|
-
<span class="cline-any cline-yes">15x</span>
|
|
707
1092
|
<span class="cline-any cline-neutral"> </span>
|
|
708
1093
|
<span class="cline-any cline-neutral"> </span>
|
|
709
1094
|
<span class="cline-any cline-neutral"> </span>
|
|
710
|
-
<span class="cline-any cline-yes">20x</span>
|
|
711
1095
|
<span class="cline-any cline-neutral"> </span>
|
|
712
1096
|
<span class="cline-any cline-neutral"> </span>
|
|
713
|
-
<span class="cline-any cline-yes">20x</span>
|
|
714
1097
|
<span class="cline-any cline-neutral"> </span>
|
|
715
1098
|
<span class="cline-any cline-neutral"> </span>
|
|
716
1099
|
<span class="cline-any cline-neutral"> </span>
|
|
717
1100
|
<span class="cline-any cline-neutral"> </span>
|
|
718
|
-
<span class="cline-any cline-yes">20x</span>
|
|
719
|
-
<span class="cline-any cline-yes">20x</span>
|
|
720
|
-
<span class="cline-any cline-yes">9x</span>
|
|
721
1101
|
<span class="cline-any cline-neutral"> </span>
|
|
722
|
-
<span class="cline-any cline-
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1108
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1111
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
1117
|
<span class="cline-any cline-neutral"> </span>
|
|
724
1118
|
<span class="cline-any cline-neutral"> </span>
|
|
725
1119
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -731,7 +1125,6 @@
|
|
|
731
1125
|
<span class="cline-any cline-neutral"> </span>
|
|
732
1126
|
<span class="cline-any cline-neutral"> </span>
|
|
733
1127
|
<span class="cline-any cline-neutral"> </span>
|
|
734
|
-
<span class="cline-any cline-yes">11x</span>
|
|
735
1128
|
<span class="cline-any cline-neutral"> </span>
|
|
736
1129
|
<span class="cline-any cline-neutral"> </span>
|
|
737
1130
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -743,9 +1136,7 @@
|
|
|
743
1136
|
<span class="cline-any cline-neutral"> </span>
|
|
744
1137
|
<span class="cline-any cline-neutral"> </span>
|
|
745
1138
|
<span class="cline-any cline-neutral"> </span>
|
|
746
|
-
<span class="cline-any cline-yes">9x</span>
|
|
747
1139
|
<span class="cline-any cline-neutral"> </span>
|
|
748
|
-
<span class="cline-any cline-yes">9x</span>
|
|
749
1140
|
<span class="cline-any cline-neutral"> </span>
|
|
750
1141
|
<span class="cline-any cline-neutral"> </span>
|
|
751
1142
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -754,8 +1145,6 @@
|
|
|
754
1145
|
<span class="cline-any cline-neutral"> </span>
|
|
755
1146
|
<span class="cline-any cline-neutral"> </span>
|
|
756
1147
|
<span class="cline-any cline-neutral"> </span>
|
|
757
|
-
<span class="cline-any cline-yes">2x</span>
|
|
758
|
-
<span class="cline-any cline-yes">2x</span>
|
|
759
1148
|
<span class="cline-any cline-neutral"> </span>
|
|
760
1149
|
<span class="cline-any cline-neutral"> </span>
|
|
761
1150
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -764,47 +1153,143 @@
|
|
|
764
1153
|
<span class="cline-any cline-neutral"> </span>
|
|
765
1154
|
<span class="cline-any cline-neutral"> </span>
|
|
766
1155
|
<span class="cline-any cline-yes">10x</span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
1157
|
<span class="cline-any cline-yes">10x</span>
|
|
768
1158
|
<span class="cline-any cline-neutral"> </span>
|
|
769
1159
|
<span class="cline-any cline-neutral"> </span>
|
|
770
|
-
<span class="cline-any cline-
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
1161
|
<span class="cline-any cline-yes">10x</span>
|
|
772
1162
|
<span class="cline-any cline-yes">1x</span>
|
|
1163
|
+
<span class="cline-any cline-yes">9x</span>
|
|
773
1164
|
<span class="cline-any cline-yes">1x</span>
|
|
774
1165
|
<span class="cline-any cline-neutral"> </span>
|
|
1166
|
+
<span class="cline-any cline-yes">8x</span>
|
|
775
1167
|
<span class="cline-any cline-neutral"> </span>
|
|
776
1168
|
<span class="cline-any cline-neutral"> </span>
|
|
777
|
-
<span class="cline-any cline-yes">9x</span>
|
|
778
1169
|
<span class="cline-any cline-neutral"> </span>
|
|
1170
|
+
<span class="cline-any cline-yes">10x</span>
|
|
779
1171
|
<span class="cline-any cline-neutral"> </span>
|
|
780
|
-
<span class="cline-any cline-yes">8x</span>
|
|
781
|
-
<span class="cline-any cline-yes">8x</span>
|
|
782
|
-
<span class="cline-any cline-yes">8x</span>
|
|
783
1172
|
<span class="cline-any cline-neutral"> </span>
|
|
784
|
-
<span class="cline-any cline-yes">
|
|
1173
|
+
<span class="cline-any cline-yes">10x</span>
|
|
785
1174
|
<span class="cline-any cline-neutral"> </span>
|
|
786
1175
|
<span class="cline-any cline-neutral"> </span>
|
|
787
|
-
<span class="cline-any cline-yes">8x</span>
|
|
788
|
-
<span class="cline-any cline-yes">5x</span>
|
|
789
1176
|
<span class="cline-any cline-neutral"> </span>
|
|
790
|
-
<span class="cline-any cline-
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1179
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1180
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
1182
|
<span class="cline-any cline-yes">2x</span>
|
|
792
1183
|
<span class="cline-any cline-neutral"> </span>
|
|
793
1184
|
<span class="cline-any cline-neutral"> </span>
|
|
794
1185
|
<span class="cline-any cline-neutral"> </span>
|
|
795
1186
|
<span class="cline-any cline-neutral"> </span>
|
|
796
|
-
<span class="cline-any cline-yes">3x</span>
|
|
797
1187
|
<span class="cline-any cline-neutral"> </span>
|
|
798
1188
|
<span class="cline-any cline-neutral"> </span>
|
|
799
1189
|
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
1205
|
<span class="cline-any cline-yes">6x</span>
|
|
801
1206
|
<span class="cline-any cline-neutral"> </span>
|
|
802
1207
|
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1215
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1221
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1239
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1253
|
+
<span class="cline-any cline-yes">6x</span>
|
|
803
1254
|
<span class="cline-any cline-yes">6x</span>
|
|
804
|
-
<span class="cline-any cline-yes">3x</span>
|
|
805
1255
|
<span class="cline-any cline-neutral"> </span>
|
|
806
1256
|
<span class="cline-any cline-neutral"> </span>
|
|
807
1257
|
<span class="cline-any cline-yes">6x</span>
|
|
1258
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1259
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1260
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1264
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1268
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1269
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1271
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1275
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1276
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1277
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1281
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1285
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1289
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1292
|
+
<span class="cline-any cline-yes">2x</span>
|
|
808
1293
|
<span class="cline-any cline-neutral"> </span>
|
|
809
1294
|
<span class="cline-any cline-neutral"> </span>
|
|
810
1295
|
<span class="cline-any cline-yes">3x</span>
|
|
@@ -816,10 +1301,25 @@
|
|
|
816
1301
|
<span class="cline-any cline-neutral"> </span>
|
|
817
1302
|
<span class="cline-any cline-neutral"> </span>
|
|
818
1303
|
<span class="cline-any cline-neutral"> </span>
|
|
819
|
-
<span class="cline-any cline-no"> </span>
|
|
820
|
-
<span class="cline-any cline-no"> </span>
|
|
821
1304
|
<span class="cline-any cline-neutral"> </span>
|
|
822
|
-
<span class="cline-any cline-
|
|
1305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1318
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
1323
|
<span class="cline-any cline-neutral"> </span>
|
|
824
1324
|
<span class="cline-any cline-neutral"> </span>
|
|
825
1325
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -830,24 +1330,49 @@
|
|
|
830
1330
|
<span class="cline-any cline-neutral"> </span>
|
|
831
1331
|
<span class="cline-any cline-neutral"> </span>
|
|
832
1332
|
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
833
1335
|
<span class="cline-any cline-no"> </span>
|
|
834
1336
|
<span class="cline-any cline-neutral"> </span>
|
|
835
1337
|
<span class="cline-any cline-neutral"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
836
1359
|
<span class="cline-any cline-neutral"> </span>
|
|
837
1360
|
<span class="cline-any cline-neutral"> </span>
|
|
838
1361
|
<span class="cline-any cline-neutral"> </span>
|
|
839
1362
|
<span class="cline-any cline-neutral"> </span>
|
|
840
1363
|
<span class="cline-any cline-neutral"> </span>
|
|
841
|
-
<span class="cline-any cline-no"> </span>
|
|
842
|
-
<span class="cline-any cline-no"> </span>
|
|
843
1364
|
<span class="cline-any cline-neutral"> </span>
|
|
844
1365
|
<span class="cline-any cline-no"> </span>
|
|
845
1366
|
<span class="cline-any cline-no"> </span>
|
|
846
1367
|
<span class="cline-any cline-neutral"> </span>
|
|
847
|
-
<span class="cline-any cline-no"> </span>
|
|
848
1368
|
<span class="cline-any cline-neutral"> </span>
|
|
849
1369
|
<span class="cline-any cline-no"> </span>
|
|
850
1370
|
<span class="cline-any cline-neutral"> </span>
|
|
1371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-no"> </span>
|
|
851
1376
|
<span class="cline-any cline-no"> </span>
|
|
852
1377
|
<span class="cline-any cline-neutral"> </span>
|
|
853
1378
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -860,6 +1385,10 @@
|
|
|
860
1385
|
<span class="cline-any cline-no"> </span>
|
|
861
1386
|
<span class="cline-any cline-neutral"> </span>
|
|
862
1387
|
<span class="cline-any cline-neutral"> </span>
|
|
1388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
863
1392
|
<span class="cline-any cline-no"> </span>
|
|
864
1393
|
<span class="cline-any cline-no"> </span>
|
|
865
1394
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -869,9 +1398,23 @@
|
|
|
869
1398
|
<span class="cline-any cline-neutral"> </span>
|
|
870
1399
|
<span class="cline-any cline-neutral"> </span>
|
|
871
1400
|
<span class="cline-any cline-neutral"> </span>
|
|
1401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
1414
|
<span class="cline-any cline-no"> </span>
|
|
873
1415
|
<span class="cline-any cline-no"> </span>
|
|
874
1416
|
<span class="cline-any cline-neutral"> </span>
|
|
1417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
1418
|
<span class="cline-any cline-no"> </span>
|
|
876
1419
|
<span class="cline-any cline-no"> </span>
|
|
877
1420
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -893,6 +1436,15 @@
|
|
|
893
1436
|
<span class="cline-any cline-neutral"> </span>
|
|
894
1437
|
<span class="cline-any cline-neutral"> </span>
|
|
895
1438
|
<span class="cline-any cline-neutral"> </span>
|
|
1439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1443
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
1448
|
<span class="cline-any cline-no"> </span>
|
|
897
1449
|
<span class="cline-any cline-no"> </span>
|
|
898
1450
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -906,33 +1458,49 @@
|
|
|
906
1458
|
<span class="cline-any cline-neutral"> </span>
|
|
907
1459
|
<span class="cline-any cline-neutral"> </span>
|
|
908
1460
|
<span class="cline-any cline-neutral"> </span>
|
|
909
|
-
<span class="cline-any cline-yes">1015x</span>
|
|
910
|
-
<span class="cline-any cline-yes">3x</span>
|
|
911
|
-
<span class="cline-any cline-yes">3x</span>
|
|
912
1461
|
<span class="cline-any cline-neutral"> </span>
|
|
913
1462
|
<span class="cline-any cline-neutral"> </span>
|
|
914
1463
|
<span class="cline-any cline-neutral"> </span>
|
|
915
|
-
<span class="cline-any cline-yes">1015x</span>
|
|
916
1464
|
<span class="cline-any cline-neutral"> </span>
|
|
917
1465
|
<span class="cline-any cline-neutral"> </span>
|
|
918
1466
|
<span class="cline-any cline-neutral"> </span>
|
|
1467
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1468
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
|
+
<span class="cline-any cline-no"> </span>
|
|
919
1470
|
<span class="cline-any cline-neutral"> </span>
|
|
920
1471
|
<span class="cline-any cline-neutral"> </span>
|
|
921
1472
|
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
+
<span class="cline-any cline-yes">2x</span>
|
|
922
1474
|
<span class="cline-any cline-neutral"> </span>
|
|
923
|
-
<span class="cline-any cline-yes">6x</span>
|
|
924
|
-
<span class="cline-any cline-yes">6x</span>
|
|
925
1475
|
<span class="cline-any cline-neutral"> </span>
|
|
926
|
-
<span class="cline-any cline-yes">5x</span>
|
|
927
|
-
<span class="cline-any cline-yes">3x</span>
|
|
928
|
-
<span class="cline-any cline-yes">2x</span>
|
|
929
1476
|
<span class="cline-any cline-neutral"> </span>
|
|
930
1477
|
<span class="cline-any cline-neutral"> </span>
|
|
931
|
-
<span class="cline-any cline-
|
|
1478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1491
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1493
|
+
<span class="cline-any cline-yes">3x</span>
|
|
932
1494
|
<span class="cline-any cline-neutral"> </span>
|
|
933
1495
|
<span class="cline-any cline-yes">2x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
1499
|
<span class="cline-any cline-yes">2x</span>
|
|
935
1500
|
<span class="cline-any cline-neutral"> </span>
|
|
1501
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1502
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
936
1504
|
<span class="cline-any cline-neutral"> </span>
|
|
937
1505
|
<span class="cline-any cline-neutral"> </span>
|
|
938
1506
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -940,18 +1508,35 @@
|
|
|
940
1508
|
<span class="cline-any cline-neutral"> </span>
|
|
941
1509
|
<span class="cline-any cline-neutral"> </span>
|
|
942
1510
|
<span class="cline-any cline-neutral"> </span>
|
|
943
|
-
<span class="cline-any cline-yes">132x</span>
|
|
944
|
-
<span class="cline-any cline-yes">132x</span>
|
|
945
|
-
<span class="cline-any cline-yes">132x</span>
|
|
946
1511
|
<span class="cline-any cline-neutral"> </span>
|
|
947
|
-
<span class="cline-any cline-yes">132x</span>
|
|
948
1512
|
<span class="cline-any cline-neutral"> </span>
|
|
949
1513
|
<span class="cline-any cline-neutral"> </span>
|
|
950
1514
|
<span class="cline-any cline-neutral"> </span>
|
|
951
|
-
<span class="cline-any cline-yes">4x</span>
|
|
952
1515
|
<span class="cline-any cline-neutral"> </span>
|
|
953
1516
|
<span class="cline-any cline-neutral"> </span>
|
|
954
|
-
<span class="cline-any cline-
|
|
1517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1520
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1521
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1523
|
+
<span class="cline-any cline-yes">71x</span>
|
|
1524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1527
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1530
|
+
<span class="cline-any cline-yes">66x</span>
|
|
1531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
1540
|
<span class="cline-any cline-neutral"> </span>
|
|
956
1541
|
<span class="cline-any cline-neutral"> </span>
|
|
957
1542
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -969,6 +1554,14 @@
|
|
|
969
1554
|
<span class="cline-any cline-neutral"> </span>
|
|
970
1555
|
<span class="cline-any cline-neutral"> </span>
|
|
971
1556
|
<span class="cline-any cline-neutral"> </span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
972
1565
|
<span class="cline-any cline-yes">6x</span>
|
|
973
1566
|
<span class="cline-any cline-yes">6x</span>
|
|
974
1567
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -978,26 +1571,30 @@
|
|
|
978
1571
|
<span class="cline-any cline-neutral"> </span>
|
|
979
1572
|
<span class="cline-any cline-neutral"> </span>
|
|
980
1573
|
<span class="cline-any cline-neutral"> </span>
|
|
981
|
-
<span class="cline-any cline-
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1580
|
+
<span class="cline-any cline-yes">20x</span>
|
|
982
1581
|
<span class="cline-any cline-yes">9x</span>
|
|
983
1582
|
<span class="cline-any cline-yes">9x</span>
|
|
984
1583
|
<span class="cline-any cline-neutral"> </span>
|
|
985
|
-
<span class="cline-any cline-yes">
|
|
1584
|
+
<span class="cline-any cline-yes">20x</span>
|
|
986
1585
|
<span class="cline-any cline-neutral"> </span>
|
|
987
1586
|
<span class="cline-any cline-neutral"> </span>
|
|
988
1587
|
<span class="cline-any cline-neutral"> </span>
|
|
989
1588
|
<span class="cline-any cline-neutral"> </span>
|
|
990
1589
|
<span class="cline-any cline-neutral"> </span>
|
|
991
1590
|
<span class="cline-any cline-neutral"> </span>
|
|
992
|
-
<span class="cline-any cline-yes">14x</span>
|
|
993
1591
|
<span class="cline-any cline-neutral"> </span>
|
|
994
1592
|
<span class="cline-any cline-neutral"> </span>
|
|
995
1593
|
<span class="cline-any cline-neutral"> </span>
|
|
996
1594
|
<span class="cline-any cline-neutral"> </span>
|
|
997
1595
|
<span class="cline-any cline-neutral"> </span>
|
|
1596
|
+
<span class="cline-any cline-yes">10x</span>
|
|
998
1597
|
<span class="cline-any cline-neutral"> </span>
|
|
999
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1000
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1001
1598
|
<span class="cline-any cline-neutral"> </span>
|
|
1002
1599
|
<span class="cline-any cline-neutral"> </span>
|
|
1003
1600
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1005,7 +1602,47 @@
|
|
|
1005
1602
|
<span class="cline-any cline-neutral"> </span>
|
|
1006
1603
|
<span class="cline-any cline-neutral"> </span>
|
|
1007
1604
|
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
-
<span class="cline-any cline-
|
|
1605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1611
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1641
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
1646
|
<span class="cline-any cline-neutral"> </span>
|
|
1010
1647
|
<span class="cline-any cline-neutral"> </span>
|
|
1011
1648
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1014,7 +1651,6 @@
|
|
|
1014
1651
|
<span class="cline-any cline-neutral"> </span>
|
|
1015
1652
|
<span class="cline-any cline-neutral"> </span>
|
|
1016
1653
|
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
-
<span class="cline-any cline-yes">19x</span>
|
|
1018
1654
|
<span class="cline-any cline-neutral"> </span>
|
|
1019
1655
|
<span class="cline-any cline-neutral"> </span>
|
|
1020
1656
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -1033,6 +1669,15 @@
|
|
|
1033
1669
|
<span class="cline-any cline-neutral"> </span>
|
|
1034
1670
|
<span class="cline-any cline-neutral"> </span>
|
|
1035
1671
|
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1036
1681
|
<span class="cline-any cline-yes">4x</span>
|
|
1037
1682
|
<span class="cline-any cline-yes">4x</span>
|
|
1038
1683
|
<span class="cline-any cline-yes">4x</span>
|
|
@@ -1059,19 +1704,124 @@
|
|
|
1059
1704
|
<span class="cline-any cline-neutral"> </span>
|
|
1060
1705
|
<span class="cline-any cline-neutral"> </span>
|
|
1061
1706
|
<span class="cline-any cline-neutral"> </span>
|
|
1062
|
-
<span class="cline-any cline-
|
|
1063
|
-
|
|
1707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1726
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1742
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1748
|
+
<span class="cline-any cline-yes">2x</span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1749
|
+
* @module @onlineapps/conn-base-storage
|
|
1750
|
+
* @description MinIO storage connector with automatic SHA256 fingerprinting for OA Drive.
|
|
1751
|
+
* Provides immutable content storage with verification, caching, and presigned URLs.
|
|
1752
|
+
*
|
|
1753
|
+
* @see {@link https://github.com/onlineapps/oa-drive/tree/main/shared/connector/conn-base-storage|GitHub Repository}
|
|
1754
|
+
* @author OA Drive Team
|
|
1755
|
+
* @license MIT
|
|
1756
|
+
* @since 1.0.0
|
|
1757
|
+
*/
|
|
1758
|
+
|
|
1759
|
+
const { StorageCore } = require('@onlineapps/storage-core');
|
|
1064
1760
|
const winston = require('winston');
|
|
1761
|
+
const SharedUrlAdapter = require('./sharedUrlAdapter');
|
|
1762
|
+
const runtimeCfg = require('./config');
|
|
1065
1763
|
|
|
1066
1764
|
/**
|
|
1067
|
-
* Storage
|
|
1068
|
-
*
|
|
1765
|
+
* Storage connector for MinIO with automatic fingerprinting
|
|
1766
|
+
*
|
|
1767
|
+
* @class StorageConnector
|
|
1768
|
+
*
|
|
1769
|
+
* @example <caption>Basic Usage</caption>
|
|
1770
|
+
* const storage = new StorageConnector({
|
|
1771
|
+
* endPoint: 'minio.example.com',
|
|
1772
|
+
* port: 9000,
|
|
1773
|
+
* accessKey: 'minioadmin',
|
|
1774
|
+
* secretKey: 'minioadmin'
|
|
1775
|
+
* });
|
|
1776
|
+
*
|
|
1777
|
+
* await storage.initialize();
|
|
1778
|
+
* const result = await storage.uploadWithFingerprint(
|
|
1779
|
+
* 'documents',
|
|
1780
|
+
* { type: 'invoice', amount: 1500 },
|
|
1781
|
+
* 'invoices'
|
|
1782
|
+
* );
|
|
1783
|
+
*
|
|
1784
|
+
* @example <caption>With Caching</caption>
|
|
1785
|
+
* const storage = new StorageConnector({
|
|
1786
|
+
* cacheEnabled: true,
|
|
1787
|
+
* maxCacheSize: 200
|
|
1788
|
+
* });
|
|
1069
1789
|
*/
|
|
1070
1790
|
class StorageConnector {
|
|
1071
|
-
|
|
1791
|
+
/**
|
|
1792
|
+
* Creates a new StorageConnector instance
|
|
1793
|
+
*
|
|
1794
|
+
* @constructor
|
|
1795
|
+
* @param {Object} [config={}] - Configuration options
|
|
1796
|
+
* @param {string} [config.endPoint='localhost'] - MinIO server endpoint
|
|
1797
|
+
* @param {number} [config.port=9000] - MinIO server port
|
|
1798
|
+
* @param {boolean} [config.useSSL=false] - Use SSL/TLS
|
|
1799
|
+
* @param {string} [config.accessKey='minioadmin'] - Access key
|
|
1800
|
+
* @param {string} [config.secretKey='minioadmin'] - Secret key
|
|
1801
|
+
* @param {string} [config.defaultBucket='api-storage'] - Default bucket name
|
|
1802
|
+
* @param {boolean} [config.cacheEnabled=true] - Enable content caching
|
|
1803
|
+
* @param {number} [config.maxCacheSize=100] - Maximum cache entries
|
|
1804
|
+
* @param {string} [config.logLevel='info'] - Logging level
|
|
1805
|
+
*
|
|
1806
|
+
* @example <caption>Full Configuration</caption>
|
|
1807
|
+
* const storage = new StorageConnector({
|
|
1808
|
+
* endPoint: 'minio.example.com',
|
|
1809
|
+
* port: 9000,
|
|
1810
|
+
* useSSL: true,
|
|
1811
|
+
* accessKey: 'AKIAIOSFODNN7EXAMPLE',
|
|
1812
|
+
* secretKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
|
|
1813
|
+
* defaultBucket: 'production-storage',
|
|
1814
|
+
* cacheEnabled: true,
|
|
1815
|
+
* maxCacheSize: 500
|
|
1816
|
+
* });
|
|
1817
|
+
*/
|
|
1818
|
+
constructor(config = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
|
|
1819
|
+
// Resolve runtime configuration for wrapper behavior
|
|
1820
|
+
const resolved = runtimeCfg.resolve(config);
|
|
1821
|
+
|
|
1072
1822
|
// Logger setup
|
|
1073
1823
|
this.logger = winston.createLogger({
|
|
1074
|
-
level:
|
|
1824
|
+
level: resolved.logLevel,
|
|
1075
1825
|
format: winston.format.combine(
|
|
1076
1826
|
winston.format.timestamp(),
|
|
1077
1827
|
winston.format.json()
|
|
@@ -1081,58 +1831,80 @@ class StorageConnector {
|
|
|
1081
1831
|
]
|
|
1082
1832
|
});
|
|
1083
1833
|
|
|
1084
|
-
// MinIO client
|
|
1085
|
-
|
|
1086
|
-
endPoint:
|
|
1087
|
-
port:
|
|
1088
|
-
useSSL:
|
|
1089
|
-
accessKey:
|
|
1090
|
-
secretKey:
|
|
1091
|
-
};
|
|
1834
|
+
// Create StorageCore instance (handles MinIO client internally)
|
|
1835
|
+
this.core = new StorageCore({
|
|
1836
|
+
endPoint: resolved.endPoint,
|
|
1837
|
+
port: resolved.port,
|
|
1838
|
+
useSSL: resolved.useSSL,
|
|
1839
|
+
accessKey: resolved.accessKey,
|
|
1840
|
+
secretKey: resolved.secretKey
|
|
1841
|
+
});
|
|
1842
|
+
|
|
1843
|
+
// Expose MinIO client for backward compatibility
|
|
1844
|
+
this.client = this.core.client;
|
|
1845
|
+
this.minioClient = this.core.client;
|
|
1092
1846
|
|
|
1093
|
-
this.
|
|
1094
|
-
this.defaultBucket = config.defaultBucket || process.env.MINIO_DEFAULT_BUCKET || 'api-storage';
|
|
1847
|
+
this.defaultBucket = resolved.defaultBucket;
|
|
1095
1848
|
|
|
1096
1849
|
// Store config for access in tests
|
|
1097
1850
|
this.config = {
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1851
|
+
endPoint: this.core.config.endPoint,
|
|
1852
|
+
port: this.core.config.port,
|
|
1853
|
+
useSSL: this.core.config.useSSL,
|
|
1854
|
+
accessKey: this.core.config.accessKey,
|
|
1855
|
+
secretKey: this.core.config.secretKey,
|
|
1856
|
+
bucketName: this.validateBucketName(config.bucketName || resolved.bucketName),
|
|
1857
|
+
cacheMaxSize: resolved.cacheMaxSize
|
|
1101
1858
|
};
|
|
1102
|
-
|
|
1103
|
-
// MinIO client
|
|
1104
|
-
this.minioClient = this.client;
|
|
1105
1859
|
|
|
1106
1860
|
// Cache configuration
|
|
1107
1861
|
this.cacheEnabled = config.cacheEnabled !== false;
|
|
1108
1862
|
this.cache = new Map();
|
|
1109
1863
|
this.contentCache = new Map();
|
|
1110
|
-
this.maxCacheSize =
|
|
1864
|
+
this.maxCacheSize = resolved.maxCacheSize;
|
|
1111
1865
|
|
|
1112
1866
|
// Track initialization
|
|
1113
1867
|
this.initialized = false;
|
|
1868
|
+
|
|
1869
|
+
// Initialize shared URL adapter
|
|
1870
|
+
this.sharedUrl = new SharedUrlAdapter(this);
|
|
1114
1871
|
|
|
1115
1872
|
this.logger.info('StorageConnector initialized', {
|
|
1116
|
-
endpoint:
|
|
1117
|
-
port:
|
|
1873
|
+
endpoint: this.core.config.endPoint,
|
|
1874
|
+
port: this.core.config.port,
|
|
1118
1875
|
defaultBucket: this.defaultBucket
|
|
1119
1876
|
});
|
|
1120
1877
|
}
|
|
1121
1878
|
|
|
1122
1879
|
/**
|
|
1123
1880
|
* Initialize connector and ensure bucket exists
|
|
1881
|
+
*
|
|
1882
|
+
* @async
|
|
1883
|
+
* @method initialize
|
|
1884
|
+
* @returns {Promise<boolean>} Returns true when initialized
|
|
1885
|
+
*
|
|
1886
|
+
* @throws {Error} If initialization fails
|
|
1887
|
+
*
|
|
1888
|
+
* @example
|
|
1889
|
+
* try {
|
|
1890
|
+
* await storage.initialize();
|
|
1891
|
+
* console.log('Storage ready');
|
|
1892
|
+
* } catch (error) {
|
|
1893
|
+
* console.error('Failed to initialize:', error);
|
|
1894
|
+
* }
|
|
1124
1895
|
*/
|
|
1125
1896
|
async initialize() {
|
|
1126
1897
|
try {
|
|
1127
|
-
//
|
|
1128
|
-
|
|
1898
|
+
// Initialize StorageCore
|
|
1899
|
+
await this.core.initialize();
|
|
1129
1900
|
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1901
|
+
// Ensure default bucket exists (using StorageCore)
|
|
1902
|
+
const created = await this.core.ensureBucket(this.defaultBucket);
|
|
1903
|
+
|
|
1904
|
+
if (created) {
|
|
1133
1905
|
this.logger.info(`Bucket ${this.defaultBucket} created`);
|
|
1134
1906
|
|
|
1135
|
-
// Set bucket policy for read access
|
|
1907
|
+
// Set bucket policy for read access (business-specific feature)
|
|
1136
1908
|
const policy = {
|
|
1137
1909
|
Version: '2012-10-17',
|
|
1138
1910
|
Statement: [
|
|
@@ -1162,32 +1934,63 @@ class StorageConnector {
|
|
|
1162
1934
|
|
|
1163
1935
|
/**
|
|
1164
1936
|
* Generate SHA256 fingerprint for content
|
|
1937
|
+
*
|
|
1938
|
+
* @method generateFingerprint
|
|
1939
|
+
* @param {string|Buffer|Object} content - Content to fingerprint
|
|
1940
|
+
* @returns {string} SHA256 hash in hex format
|
|
1941
|
+
*
|
|
1942
|
+
* @example <caption>String Content</caption>
|
|
1943
|
+
* const hash = storage.generateFingerprint('Hello World');
|
|
1944
|
+
* // Returns: SHA256 hash
|
|
1945
|
+
*
|
|
1946
|
+
* @example <caption>Object Content</caption>
|
|
1947
|
+
* const hash = storage.generateFingerprint({ name: 'John', age: 30 });
|
|
1948
|
+
* // Returns consistent hash for the object
|
|
1165
1949
|
*/
|
|
1166
1950
|
generateFingerprint(content) {
|
|
1167
|
-
//
|
|
1168
|
-
|
|
1169
|
-
content = String(content);
|
|
1170
|
-
} else if (typeof content === 'symbol') {
|
|
1171
|
-
content = content.toString();
|
|
1172
|
-
} else if (typeof content !== 'string' && !Buffer.isBuffer(content)) {
|
|
1173
|
-
// Handle circular references
|
|
1174
|
-
try {
|
|
1175
|
-
content = JSON.stringify(content);
|
|
1176
|
-
} catch (err) {
|
|
1177
|
-
// If circular reference, use a deterministic string representation
|
|
1178
|
-
content = '[Circular Reference]';
|
|
1179
|
-
}
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
|
-
return crypto
|
|
1183
|
-
.createHash('sha256')
|
|
1184
|
-
.update(content)
|
|
1185
|
-
.digest('hex');
|
|
1951
|
+
// Delegate to StorageCore
|
|
1952
|
+
return this.core.calculateFingerprint(content);
|
|
1186
1953
|
}
|
|
1187
1954
|
|
|
1188
1955
|
/**
|
|
1189
1956
|
* Upload content with automatic fingerprinting
|
|
1190
|
-
*
|
|
1957
|
+
*
|
|
1958
|
+
* @async
|
|
1959
|
+
* @method uploadWithFingerprint
|
|
1960
|
+
* @param {string} bucket - Bucket name
|
|
1961
|
+
* @param {string|Buffer|Object} content - Content to upload
|
|
1962
|
+
* @param {string} [pathPrefix=''] - Path prefix for organization
|
|
1963
|
+
* @returns {Promise<UploadResult>} Upload result with fingerprint
|
|
1964
|
+
* @returns {string} result.fingerprint - SHA256 fingerprint
|
|
1965
|
+
* @returns {string} result.bucket - Bucket name
|
|
1966
|
+
* @returns {string} result.path - Storage path
|
|
1967
|
+
* @returns {string} result.url - Public URL
|
|
1968
|
+
* @returns {boolean} result.existed - Whether object already existed
|
|
1969
|
+
*
|
|
1970
|
+
* @throws {Error} If upload fails
|
|
1971
|
+
*
|
|
1972
|
+
* @example <caption>Upload JSON Object</caption>
|
|
1973
|
+
* const result = await storage.uploadWithFingerprint(
|
|
1974
|
+
* 'invoices',
|
|
1975
|
+
* { invoiceId: 'INV-123', amount: 1500 },
|
|
1976
|
+
* '2024/01'
|
|
1977
|
+
* );
|
|
1978
|
+
* console.log(`Stored at: ${result.url}`);
|
|
1979
|
+
* console.log(`Fingerprint: ${result.fingerprint}`);
|
|
1980
|
+
*
|
|
1981
|
+
* @example <caption>Upload String Content</caption>
|
|
1982
|
+
* const result = await storage.uploadWithFingerprint(
|
|
1983
|
+
* 'documents',
|
|
1984
|
+
* 'Important document content',
|
|
1985
|
+
* 'contracts'
|
|
1986
|
+
* );
|
|
1987
|
+
*
|
|
1988
|
+
* @example <caption>Upload Buffer</caption>
|
|
1989
|
+
* const buffer = Buffer.from('Binary data');
|
|
1990
|
+
* const result = await storage.uploadWithFingerprint(
|
|
1991
|
+
* 'files',
|
|
1992
|
+
* buffer
|
|
1993
|
+
* );
|
|
1191
1994
|
*/
|
|
1192
1995
|
async uploadWithFingerprint(bucket, content, pathPrefix = '') {
|
|
1193
1996
|
try {
|
|
@@ -1212,9 +2015,9 @@ class StorageConnector {
|
|
|
1212
2015
|
? `${pathPrefix}/${fingerprint}.json`
|
|
1213
2016
|
: `${fingerprint}.json`;
|
|
1214
2017
|
|
|
1215
|
-
// Check if object already exists (immutable)
|
|
1216
|
-
|
|
1217
|
-
|
|
2018
|
+
// Check if object already exists (immutable) - using StorageCore
|
|
2019
|
+
const exists = await this.core.objectExists(bucket, path);
|
|
2020
|
+
if (exists) {
|
|
1218
2021
|
this.logger.debug(`Object already exists: ${bucket}/${path}`);
|
|
1219
2022
|
|
|
1220
2023
|
return {
|
|
@@ -1224,16 +2027,13 @@ class StorageConnector {
|
|
|
1224
2027
|
url: this.getPublicUrl(bucket, path),
|
|
1225
2028
|
existed: true
|
|
1226
2029
|
};
|
|
1227
|
-
} catch (err) {
|
|
1228
|
-
// Object doesn't exist, proceed with upload
|
|
1229
2030
|
}
|
|
1230
2031
|
|
|
1231
|
-
// Upload to MinIO
|
|
1232
|
-
await this.
|
|
2032
|
+
// Upload to MinIO - using StorageCore
|
|
2033
|
+
await this.core.putObject(
|
|
1233
2034
|
bucket,
|
|
1234
2035
|
path,
|
|
1235
2036
|
buffer,
|
|
1236
|
-
buffer.length,
|
|
1237
2037
|
{
|
|
1238
2038
|
'Content-Type': 'application/json',
|
|
1239
2039
|
'x-amz-meta-fingerprint': fingerprint,
|
|
@@ -1259,6 +2059,36 @@ class StorageConnector {
|
|
|
1259
2059
|
|
|
1260
2060
|
/**
|
|
1261
2061
|
* Download content and verify fingerprint
|
|
2062
|
+
*
|
|
2063
|
+
* @async
|
|
2064
|
+
* @method downloadWithVerification
|
|
2065
|
+
* @param {string} bucket - Bucket name
|
|
2066
|
+
* @param {string} path - Object path
|
|
2067
|
+
* @param {string} expectedFingerprint - Expected SHA256 fingerprint
|
|
2068
|
+
* @returns {Promise<string>} Content as string
|
|
2069
|
+
*
|
|
2070
|
+
* @throws {Error} If download fails or fingerprint mismatch
|
|
2071
|
+
*
|
|
2072
|
+
* @example <caption>Download with Verification</caption>
|
|
2073
|
+
* const content = await storage.downloadWithVerification(
|
|
2074
|
+
* 'invoices',
|
|
2075
|
+
* '2024/01/abc123.json',
|
|
2076
|
+
* 'abc123...'
|
|
2077
|
+
* );
|
|
2078
|
+
* const data = JSON.parse(content);
|
|
2079
|
+
*
|
|
2080
|
+
* @example <caption>Handle Verification Failure</caption>
|
|
2081
|
+
* try {
|
|
2082
|
+
* const content = await storage.downloadWithVerification(
|
|
2083
|
+
* 'documents',
|
|
2084
|
+
* 'contract.json',
|
|
2085
|
+
* expectedHash
|
|
2086
|
+
* );
|
|
2087
|
+
* } catch (error) {
|
|
2088
|
+
* if (error.message.includes('Fingerprint mismatch')) {
|
|
2089
|
+
* console.error('Content has been tampered!');
|
|
2090
|
+
* }
|
|
2091
|
+
* }
|
|
1262
2092
|
*/
|
|
1263
2093
|
async downloadWithVerification(bucket, path, expectedFingerprint) {
|
|
1264
2094
|
try {
|
|
@@ -1271,8 +2101,8 @@ class StorageConnector {
|
|
|
1271
2101
|
return this.contentCache.get(cacheKey);
|
|
1272
2102
|
}
|
|
1273
2103
|
|
|
1274
|
-
// Download from MinIO
|
|
1275
|
-
const stream = await this.
|
|
2104
|
+
// Download from MinIO - using StorageCore
|
|
2105
|
+
const stream = await this.core.getObject(bucket, path);
|
|
1276
2106
|
|
|
1277
2107
|
// Collect stream data
|
|
1278
2108
|
const chunks = [];
|
|
@@ -1281,16 +2111,14 @@ class StorageConnector {
|
|
|
1281
2111
|
}
|
|
1282
2112
|
const buffer = Buffer.concat(chunks);
|
|
1283
2113
|
|
|
1284
|
-
// Verify fingerprint if provided
|
|
1285
|
-
if (expectedFingerprint) {
|
|
1286
|
-
const actualFingerprint = this.
|
|
1287
|
-
|
|
2114
|
+
// Verify fingerprint if provided - using StorageCore
|
|
2115
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (expectedFingerprint) {
|
|
2116
|
+
const actualFingerprint = this.core.calculateFingerprint(buffer);
|
|
1288
2117
|
if (actualFingerprint !== expectedFingerprint) {
|
|
1289
2118
|
throw new Error(
|
|
1290
2119
|
`Fingerprint mismatch! Expected: ${expectedFingerprint}, Got: ${actualFingerprint}`
|
|
1291
2120
|
);
|
|
1292
2121
|
}
|
|
1293
|
-
|
|
1294
2122
|
this.logger.debug(`Fingerprint verified for ${bucket}/${path}`);
|
|
1295
2123
|
}
|
|
1296
2124
|
|
|
@@ -1298,7 +2126,7 @@ class StorageConnector {
|
|
|
1298
2126
|
const content = buffer.toString('utf8');
|
|
1299
2127
|
|
|
1300
2128
|
// Update cache
|
|
1301
|
-
if (this.cacheEnabled && expectedFingerprint) {
|
|
2129
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (this.cacheEnabled && expectedFingerprint) {
|
|
1302
2130
|
this.updateCache(cacheKey, content);
|
|
1303
2131
|
}
|
|
1304
2132
|
|
|
@@ -1312,16 +2140,37 @@ class StorageConnector {
|
|
|
1312
2140
|
|
|
1313
2141
|
/**
|
|
1314
2142
|
* Get pre-signed URL for direct access
|
|
2143
|
+
*
|
|
2144
|
+
* @async
|
|
2145
|
+
* @method getPresignedUrl
|
|
2146
|
+
* @param {string} bucket - Bucket name
|
|
2147
|
+
* @param {string} path - Object path
|
|
2148
|
+
* @param {number} [expiry=3600] - URL expiry in seconds
|
|
2149
|
+
* @returns {Promise<string>} Pre-signed URL
|
|
2150
|
+
*
|
|
2151
|
+
* @throws {Error} If URL generation fails
|
|
2152
|
+
*
|
|
2153
|
+
* @example <caption>Generate Temporary URL</caption>
|
|
2154
|
+
* const url = await storage.getPresignedUrl(
|
|
2155
|
+
* 'invoices',
|
|
2156
|
+
* '2024/01/invoice-123.json',
|
|
2157
|
+
* 7200 // 2 hours
|
|
2158
|
+
* );
|
|
2159
|
+
* // Share URL with external service
|
|
2160
|
+
*
|
|
2161
|
+
* @example <caption>Short-lived URL</caption>
|
|
2162
|
+
* const url = await storage.getPresignedUrl(
|
|
2163
|
+
* 'temp',
|
|
2164
|
+
* 'report.pdf',
|
|
2165
|
+
* 300 // 5 minutes
|
|
2166
|
+
* );
|
|
1315
2167
|
*/
|
|
1316
2168
|
<span class="fstat-no" title="function not covered" > as</span>ync getPresignedUrl(bucket, path, expiry = <span class="branch-0 cbranch-no" title="branch not covered" >3600)</span> {
|
|
1317
2169
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1318
2170
|
<span class="cstat-no" title="statement not covered" > bucket = bucket || this.defaultBucket;</span>
|
|
1319
2171
|
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
path,
|
|
1323
|
-
expiry
|
|
1324
|
-
);
|
|
2172
|
+
// Use StorageCore
|
|
2173
|
+
const url = <span class="cstat-no" title="statement not covered" >await this.core.getPresignedUrl(bucket, path, expiry);</span>
|
|
1325
2174
|
|
|
1326
2175
|
<span class="cstat-no" title="statement not covered" > this.logger.debug(`Generated presigned URL for ${bucket}/${path}`);</span>
|
|
1327
2176
|
<span class="cstat-no" title="statement not covered" > return url;</span>
|
|
@@ -1334,25 +2183,48 @@ class StorageConnector {
|
|
|
1334
2183
|
|
|
1335
2184
|
/**
|
|
1336
2185
|
* List objects with fingerprint metadata
|
|
2186
|
+
*
|
|
2187
|
+
* @async
|
|
2188
|
+
* @method listWithFingerprints
|
|
2189
|
+
* @param {string} bucket - Bucket name
|
|
2190
|
+
* @param {string} [prefix=''] - Path prefix to filter
|
|
2191
|
+
* @returns {Promise<Array<ObjectInfo>>} List of objects with metadata
|
|
2192
|
+
*
|
|
2193
|
+
* @example <caption>List All Objects</caption>
|
|
2194
|
+
* const objects = await storage.listWithFingerprints('invoices');
|
|
2195
|
+
* objects.forEach(obj => {
|
|
2196
|
+
* console.log(`${obj.name}: ${obj.fingerprint}`);
|
|
2197
|
+
* });
|
|
2198
|
+
*
|
|
2199
|
+
* @example <caption>List with Prefix</caption>
|
|
2200
|
+
* const objects = await storage.listWithFingerprints(
|
|
2201
|
+
* 'documents',
|
|
2202
|
+
* '2024/01/'
|
|
2203
|
+
* );
|
|
1337
2204
|
*/
|
|
1338
2205
|
<span class="fstat-no" title="function not covered" > as</span>ync listWithFingerprints(bucket, prefix = <span class="branch-0 cbranch-no" title="branch not covered" >'')</span> {
|
|
1339
2206
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1340
2207
|
<span class="cstat-no" title="statement not covered" > bucket = bucket || this.defaultBucket;</span>
|
|
1341
2208
|
|
|
2209
|
+
// Use StorageCore to list objects
|
|
2210
|
+
const objectNames = <span class="cstat-no" title="statement not covered" >await this.core.listByPrefix(bucket, prefix, true);</span>
|
|
2211
|
+
|
|
2212
|
+
// Get metadata for each object
|
|
1342
2213
|
const objects = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
2214
|
+
<span class="cstat-no" title="statement not covered" > for (const name of objectNames) {</span>
|
|
2215
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2216
|
+
const stat = <span class="cstat-no" title="statement not covered" >await this.core.statObject(bucket, name);</span>
|
|
2217
|
+
<span class="cstat-no" title="statement not covered" > objects.push({</span>
|
|
2218
|
+
name,
|
|
2219
|
+
size: stat.size,
|
|
2220
|
+
lastModified: stat.lastModified,
|
|
2221
|
+
fingerprint: stat.metaData?.['x-amz-meta-fingerprint'],
|
|
2222
|
+
uploadedAt: stat.metaData?.['x-amz-meta-uploaded-at']
|
|
2223
|
+
});
|
|
2224
|
+
} catch (err) {
|
|
2225
|
+
// Skip objects that can't be stat'd
|
|
2226
|
+
<span class="cstat-no" title="statement not covered" > this.logger.warn(`Failed to stat object ${name}`, err);</span>
|
|
2227
|
+
}
|
|
1356
2228
|
}
|
|
1357
2229
|
|
|
1358
2230
|
<span class="cstat-no" title="statement not covered" > return objects;</span>
|
|
@@ -1365,12 +2237,26 @@ class StorageConnector {
|
|
|
1365
2237
|
|
|
1366
2238
|
/**
|
|
1367
2239
|
* Delete object (use with caution - breaks immutability)
|
|
2240
|
+
*
|
|
2241
|
+
* @async
|
|
2242
|
+
* @method deleteObject
|
|
2243
|
+
* @param {string} bucket - Bucket name
|
|
2244
|
+
* @param {string} path - Object path
|
|
2245
|
+
* @returns {Promise<boolean>} Returns true on successful deletion
|
|
2246
|
+
*
|
|
2247
|
+
* @throws {Error} If deletion fails
|
|
2248
|
+
*
|
|
2249
|
+
* @warning This breaks immutability - use only when necessary
|
|
2250
|
+
*
|
|
2251
|
+
* @example
|
|
2252
|
+
* await storage.deleteObject('temp', 'temporary-file.json');
|
|
1368
2253
|
*/
|
|
1369
2254
|
<span class="fstat-no" title="function not covered" > as</span>ync deleteObject(bucket, path) {
|
|
1370
2255
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1371
2256
|
<span class="cstat-no" title="statement not covered" > bucket = bucket || this.defaultBucket;</span>
|
|
1372
2257
|
|
|
1373
|
-
|
|
2258
|
+
// Use StorageCore
|
|
2259
|
+
<span class="cstat-no" title="statement not covered" > await this.core.deleteObject(bucket, path);</span>
|
|
1374
2260
|
<span class="cstat-no" title="statement not covered" > this.logger.warn(`Deleted object: ${bucket}/${path}`);</span>
|
|
1375
2261
|
|
|
1376
2262
|
// Clear from cache
|
|
@@ -1389,6 +2275,15 @@ class StorageConnector {
|
|
|
1389
2275
|
|
|
1390
2276
|
/**
|
|
1391
2277
|
* Get public URL for an object
|
|
2278
|
+
*
|
|
2279
|
+
* @method getPublicUrl
|
|
2280
|
+
* @param {string} bucket - Bucket name
|
|
2281
|
+
* @param {string} path - Object path
|
|
2282
|
+
* @returns {string} Public URL
|
|
2283
|
+
*
|
|
2284
|
+
* @example
|
|
2285
|
+
* const url = storage.getPublicUrl('invoices', '2024/invoice-123.json');
|
|
2286
|
+
* // Returns: http://localhost:9000/invoices/2024/invoice-123.json
|
|
1392
2287
|
*/
|
|
1393
2288
|
<span class="fstat-no" title="function not covered" > ge</span>tPublicUrl(bucket, path) {
|
|
1394
2289
|
const protocol = <span class="cstat-no" title="statement not covered" >this.client.useSSL ? 'https' : 'http';</span>
|
|
@@ -1401,12 +2296,18 @@ class StorageConnector {
|
|
|
1401
2296
|
|
|
1402
2297
|
/**
|
|
1403
2298
|
* Update cache with LRU eviction
|
|
2299
|
+
*
|
|
2300
|
+
* @private
|
|
2301
|
+
* @method updateCache
|
|
2302
|
+
* @param {string} key - Cache key
|
|
2303
|
+
* @param {*} value - Value to cache
|
|
2304
|
+
* @returns {void}
|
|
1404
2305
|
*/
|
|
1405
2306
|
updateCache(key, value) {
|
|
1406
2307
|
// Remove oldest entry if cache is full
|
|
1407
|
-
if (this.contentCache.size >= this.maxCacheSize) {
|
|
1408
|
-
const firstKey = this.contentCache.keys().next().value
|
|
1409
|
-
this.contentCache.delete(firstKey)
|
|
2308
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.contentCache.size >= this.maxCacheSize) {
|
|
2309
|
+
const firstKey = <span class="cstat-no" title="statement not covered" >this.contentCache.keys().next().value;</span>
|
|
2310
|
+
<span class="cstat-no" title="statement not covered" > this.contentCache.delete(firstKey);</span>
|
|
1410
2311
|
}
|
|
1411
2312
|
|
|
1412
2313
|
// Add new entry
|
|
@@ -1416,13 +2317,23 @@ class StorageConnector {
|
|
|
1416
2317
|
|
|
1417
2318
|
/**
|
|
1418
2319
|
* Create bucket if not exists
|
|
2320
|
+
*
|
|
2321
|
+
* @async
|
|
2322
|
+
* @method ensureBucket
|
|
2323
|
+
* @param {string} bucketName - Bucket name to ensure
|
|
2324
|
+
* @returns {Promise<boolean>} Returns true when bucket exists
|
|
2325
|
+
*
|
|
2326
|
+
* @throws {Error} If bucket creation fails
|
|
2327
|
+
*
|
|
2328
|
+
* @example
|
|
2329
|
+
* await storage.ensureBucket('new-bucket');
|
|
1419
2330
|
*/
|
|
1420
2331
|
async ensureBucket(bucketName) {
|
|
1421
2332
|
try {
|
|
1422
|
-
|
|
2333
|
+
// Use StorageCore
|
|
2334
|
+
const created = await this.core.ensureBucket(bucketName);
|
|
1423
2335
|
|
|
1424
|
-
if (
|
|
1425
|
-
await this.client.makeBucket(bucketName, 'us-east-1');
|
|
2336
|
+
if (created) {
|
|
1426
2337
|
this.logger.info(`Bucket ${bucketName} created`);
|
|
1427
2338
|
}
|
|
1428
2339
|
|
|
@@ -1435,6 +2346,14 @@ class StorageConnector {
|
|
|
1435
2346
|
|
|
1436
2347
|
/**
|
|
1437
2348
|
* Validate bucket name according to S3 standards
|
|
2349
|
+
*
|
|
2350
|
+
* @method validateBucketName
|
|
2351
|
+
* @param {string} name - Bucket name to validate
|
|
2352
|
+
* @returns {string} Valid bucket name or default
|
|
2353
|
+
*
|
|
2354
|
+
* @example
|
|
2355
|
+
* const validName = storage.validateBucketName('My-Bucket');
|
|
2356
|
+
* // Returns: 'oa-drive-storage' (invalid characters)
|
|
1438
2357
|
*/
|
|
1439
2358
|
validateBucketName(name) {
|
|
1440
2359
|
// S3 bucket naming rules
|
|
@@ -1453,7 +2372,16 @@ class StorageConnector {
|
|
|
1453
2372
|
}
|
|
1454
2373
|
|
|
1455
2374
|
/**
|
|
1456
|
-
* Get object name with fingerprint
|
|
2375
|
+
* Get object name with fingerprint appended
|
|
2376
|
+
*
|
|
2377
|
+
* @method getObjectNameWithFingerprint
|
|
2378
|
+
* @param {string} originalName - Original file name
|
|
2379
|
+
* @param {string} fingerprint - SHA256 fingerprint
|
|
2380
|
+
* @returns {string} Name with fingerprint
|
|
2381
|
+
*
|
|
2382
|
+
* @example
|
|
2383
|
+
* const name = storage.getObjectNameWithFingerprint('document.pdf', 'abc123...');
|
|
2384
|
+
* // Returns: 'document-abc123...pdf'
|
|
1457
2385
|
*/
|
|
1458
2386
|
getObjectNameWithFingerprint(originalName, fingerprint) {
|
|
1459
2387
|
const parts = originalName.split('.');
|
|
@@ -1464,6 +2392,14 @@ class StorageConnector {
|
|
|
1464
2392
|
|
|
1465
2393
|
/**
|
|
1466
2394
|
* Extract fingerprint from object name
|
|
2395
|
+
*
|
|
2396
|
+
* @method extractFingerprintFromName
|
|
2397
|
+
* @param {string} objectName - Object name with fingerprint
|
|
2398
|
+
* @returns {string|null} Extracted fingerprint or null
|
|
2399
|
+
*
|
|
2400
|
+
* @example
|
|
2401
|
+
* const fp = storage.extractFingerprintFromName('document-abc123def456.pdf');
|
|
2402
|
+
* // Returns: 'abc123def456' if valid format
|
|
1467
2403
|
*/
|
|
1468
2404
|
extractFingerprintFromName(objectName) {
|
|
1469
2405
|
// Match pattern: name-<64-char-hex>.extension
|
|
@@ -1473,6 +2409,12 @@ class StorageConnector {
|
|
|
1473
2409
|
|
|
1474
2410
|
/**
|
|
1475
2411
|
* Add item to cache with size limit
|
|
2412
|
+
*
|
|
2413
|
+
* @private
|
|
2414
|
+
* @method addToCache
|
|
2415
|
+
* @param {string} key - Cache key
|
|
2416
|
+
* @param {*} value - Value to cache
|
|
2417
|
+
* @returns {void}
|
|
1476
2418
|
*/
|
|
1477
2419
|
addToCache(key, value) {
|
|
1478
2420
|
// Remove oldest if at max size
|
|
@@ -1485,6 +2427,11 @@ class StorageConnector {
|
|
|
1485
2427
|
|
|
1486
2428
|
/**
|
|
1487
2429
|
* Get item from cache
|
|
2430
|
+
*
|
|
2431
|
+
* @private
|
|
2432
|
+
* @method getFromCache
|
|
2433
|
+
* @param {string} key - Cache key
|
|
2434
|
+
* @returns {*} Cached value or undefined
|
|
1488
2435
|
*/
|
|
1489
2436
|
getFromCache(key) {
|
|
1490
2437
|
return this.cache.get(key);
|
|
@@ -1492,6 +2439,13 @@ class StorageConnector {
|
|
|
1492
2439
|
|
|
1493
2440
|
/**
|
|
1494
2441
|
* Clear all caches
|
|
2442
|
+
*
|
|
2443
|
+
* @method clearCache
|
|
2444
|
+
* @returns {void}
|
|
2445
|
+
*
|
|
2446
|
+
* @example
|
|
2447
|
+
* storage.clearCache();
|
|
2448
|
+
* // All cached content cleared
|
|
1495
2449
|
*/
|
|
1496
2450
|
clearCache() {
|
|
1497
2451
|
this.cache.clear();
|
|
@@ -1500,7 +2454,15 @@ class StorageConnector {
|
|
|
1500
2454
|
|
|
1501
2455
|
/**
|
|
1502
2456
|
* Get internal URL for service-to-service communication
|
|
1503
|
-
*
|
|
2457
|
+
*
|
|
2458
|
+
* @method getInternalUrl
|
|
2459
|
+
* @param {string} bucket - Bucket name
|
|
2460
|
+
* @param {string} path - Object path
|
|
2461
|
+
* @returns {string} Internal URL with internal:// protocol
|
|
2462
|
+
*
|
|
2463
|
+
* @example
|
|
2464
|
+
* const url = storage.getInternalUrl('invoices', 'invoice-123.json');
|
|
2465
|
+
* // Returns: 'internal://storage/invoices/invoice-123.json'
|
|
1504
2466
|
*/
|
|
1505
2467
|
getInternalUrl(bucket, path) {
|
|
1506
2468
|
return `internal://storage/${bucket}/${path}`;
|
|
@@ -1508,7 +2470,12 @@ class StorageConnector {
|
|
|
1508
2470
|
|
|
1509
2471
|
/**
|
|
1510
2472
|
* Get public URL for an object
|
|
2473
|
+
*
|
|
1511
2474
|
* @deprecated Use getInternalUrl() for service-to-service communication
|
|
2475
|
+
* @method getPublicUrl
|
|
2476
|
+
* @param {string} bucket - Bucket name
|
|
2477
|
+
* @param {string} path - Object path
|
|
2478
|
+
* @returns {string} Internal URL for backward compatibility
|
|
1512
2479
|
*/
|
|
1513
2480
|
getPublicUrl(bucket, path) {
|
|
1514
2481
|
// Pro zpětnou kompatibilitu, vrací internal URL
|
|
@@ -1517,10 +2484,22 @@ class StorageConnector {
|
|
|
1517
2484
|
|
|
1518
2485
|
/**
|
|
1519
2486
|
* Get presigned URL for temporary access
|
|
2487
|
+
*
|
|
2488
|
+
* @async
|
|
2489
|
+
* @method getPresignedUrl
|
|
2490
|
+
* @param {string} bucket - Bucket name
|
|
2491
|
+
* @param {string} objectName - Object name
|
|
2492
|
+
* @param {number} [expiry=86400] - URL expiry in seconds (default 24 hours)
|
|
2493
|
+
* @returns {Promise<string>} Pre-signed URL
|
|
2494
|
+
*
|
|
2495
|
+
* @throws {Error} If URL generation fails
|
|
2496
|
+
*
|
|
2497
|
+
* @example
|
|
2498
|
+
* const url = await storage.getPresignedUrl('documents', 'contract.pdf', 3600);
|
|
1520
2499
|
*/
|
|
1521
2500
|
async getPresignedUrl(bucket, objectName, expiry = 86400) {
|
|
1522
2501
|
try {
|
|
1523
|
-
return await this.client.
|
|
2502
|
+
return await this.client.presignedUrl('GET', bucket, objectName, expiry);
|
|
1524
2503
|
} catch (error) {
|
|
1525
2504
|
<span class="cstat-no" title="statement not covered" > this.logger.error('Failed to generate presigned URL', error);</span>
|
|
1526
2505
|
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
@@ -1528,7 +2507,16 @@ class StorageConnector {
|
|
|
1528
2507
|
}
|
|
1529
2508
|
|
|
1530
2509
|
/**
|
|
1531
|
-
* List objects with fingerprints
|
|
2510
|
+
* List objects with extracted fingerprints
|
|
2511
|
+
*
|
|
2512
|
+
* @async
|
|
2513
|
+
* @method listObjectsWithFingerprints
|
|
2514
|
+
* @param {string} bucket - Bucket name
|
|
2515
|
+
* @param {string} [prefix=''] - Path prefix to filter
|
|
2516
|
+
* @returns {Promise<Array<Object>>} List of objects with fingerprints
|
|
2517
|
+
*
|
|
2518
|
+
* @example
|
|
2519
|
+
* const objects = await storage.listObjectsWithFingerprints('invoices', '2024/');
|
|
1532
2520
|
*/
|
|
1533
2521
|
async listObjectsWithFingerprints(bucket, prefix = '') {
|
|
1534
2522
|
try {
|
|
@@ -1557,14 +2545,55 @@ class StorageConnector {
|
|
|
1557
2545
|
}
|
|
1558
2546
|
}
|
|
1559
2547
|
|
|
1560
|
-
|
|
2548
|
+
/**
|
|
2549
|
+
* @typedef {Object} UploadResult
|
|
2550
|
+
* @property {string} fingerprint - SHA256 fingerprint of content
|
|
2551
|
+
* @property {string} bucket - Bucket name
|
|
2552
|
+
* @property {string} path - Storage path
|
|
2553
|
+
* @property {string} url - Public or internal URL
|
|
2554
|
+
* @property {boolean} existed - Whether object already existed
|
|
2555
|
+
*/
|
|
2556
|
+
|
|
2557
|
+
/**
|
|
2558
|
+
* @typedef {Object} ObjectInfo
|
|
2559
|
+
* @property {string} name - Object name
|
|
2560
|
+
* @property {number} size - Object size in bytes
|
|
2561
|
+
* @property {Date} lastModified - Last modification date
|
|
2562
|
+
* @property {string} [fingerprint] - SHA256 fingerprint if available
|
|
2563
|
+
* @property {string} [uploadedAt] - Upload timestamp
|
|
2564
|
+
*/
|
|
2565
|
+
|
|
2566
|
+
// Export main class
|
|
2567
|
+
module.exports = StorageConnector;
|
|
2568
|
+
|
|
2569
|
+
/**
|
|
2570
|
+
* Factory function to create storage instance
|
|
2571
|
+
*
|
|
2572
|
+
* @function create
|
|
2573
|
+
* @param {Object} config - Configuration object
|
|
2574
|
+
* @returns {StorageConnector} New storage connector instance
|
|
2575
|
+
*
|
|
2576
|
+
* @example
|
|
2577
|
+
* const storage = StorageConnector.create({
|
|
2578
|
+
* endPoint: 'minio.example.com',
|
|
2579
|
+
* accessKey: 'key',
|
|
2580
|
+
* secretKey: 'secret'
|
|
2581
|
+
* });
|
|
2582
|
+
*/
|
|
2583
|
+
module.exports.create = <span class="fstat-no" title="function not covered" >(c</span>onfig) => <span class="cstat-no" title="statement not covered" >new StorageConnector(config);</span>
|
|
2584
|
+
|
|
2585
|
+
/**
|
|
2586
|
+
* Current version
|
|
2587
|
+
* @constant {string}
|
|
2588
|
+
*/
|
|
2589
|
+
module.exports.VERSION = '1.0.0';</pre></td></tr></table></pre>
|
|
1561
2590
|
|
|
1562
2591
|
<div class='push'></div><!-- for sticky footer -->
|
|
1563
2592
|
</div><!-- /wrapper -->
|
|
1564
2593
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1565
2594
|
Code coverage generated by
|
|
1566
2595
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1567
|
-
at 2025-
|
|
2596
|
+
at 2025-12-22T11:22:15.884Z
|
|
1568
2597
|
</div>
|
|
1569
2598
|
<script src="prettify.js"></script>
|
|
1570
2599
|
<script>
|