@hsuite/native-connect-angular 1.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/coverage-summary.json +49 -49
- package/coverage/index.html +122 -122
- package/coverage/lcov-report/index.html +122 -122
- package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
- package/coverage/lcov-report/lib/components/account-selector/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
- package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
- package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
- package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
- package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
- package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
- package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
- package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/index.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
- package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
- package/coverage/lcov-report/lib/index.html +1 -1
- package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
- package/coverage/lcov-report/lib/models/index.html +1 -1
- package/coverage/lcov-report/lib/models/provider-types.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
- package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
- package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
- package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/index.html +18 -18
- package/coverage/lcov-report/lib/providers/p2p-native/index.html +20 -20
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
- package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
- package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
- package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
- package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
- package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
- package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
- package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
- package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
- package/coverage/lcov-report/lib/services/index.html +31 -31
- package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
- package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
- package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
- package/coverage/lcov-report/lib/services/transaction-builders/index.html +43 -43
- package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
- package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -7
- package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +7 -10
- package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
- package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
- package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
- package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
- package/coverage/lcov-report/lib/transports/index.html +1 -1
- package/coverage/lcov-report/lib/utils/index.html +1 -1
- package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +1 -1
- package/coverage/lcov.info +14420 -14977
- package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
- package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
- package/coverage/lib/components/account-selector/account-formatting.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-list/index.html +1 -1
- package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
- package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
- package/coverage/lib/components/account-selector/index.html +1 -1
- package/coverage/lib/components/wallet-account-display/index.html +1 -1
- package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connect-button/index.html +21 -21
- package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
- package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
- package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
- package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
- package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
- package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
- package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
- package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
- package/coverage/lib/components/wallet-session-display/index.html +1 -1
- package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
- package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
- package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
- package/coverage/lib/directives/index.html +1 -1
- package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
- package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
- package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
- package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
- package/coverage/lib/index.html +1 -1
- package/coverage/lib/models/connection-config.model.ts.html +1 -1
- package/coverage/lib/models/index.html +1 -1
- package/coverage/lib/models/provider-types.ts.html +1 -1
- package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
- package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
- package/coverage/lib/providers/hsuite-native/index.html +19 -19
- package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
- package/coverage/lib/providers/index.html +18 -18
- package/coverage/lib/providers/p2p-native/index.html +20 -20
- package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
- package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
- package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
- package/coverage/lib/providers/walletconnect/core/index.html +65 -65
- package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
- package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
- package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
- package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
- package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
- package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
- package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
- package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
- package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
- package/coverage/lib/services/index.html +31 -31
- package/coverage/lib/services/logger.service.ts.html +4 -4
- package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
- package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
- package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
- package/coverage/lib/services/transaction-builders/index.html +43 -43
- package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
- package/coverage/lib/services/transaction.service.ts.html +4 -7
- package/coverage/lib/services/unified-wallet.service.ts.html +7 -10
- package/coverage/lib/services/wallet-context.service.ts.html +1 -1
- package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
- package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
- package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
- package/coverage/lib/transports/index.html +1 -1
- package/coverage/lib/utils/index.html +1 -1
- package/coverage/lib/utils/ledger-icons.util.ts.html +1 -1
- package/dist/fesm2022/hsuite-native-connect-angular.mjs +85 -20
- package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
- package/dist/index.d.ts +33 -3
- package/package.json +4 -4
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
- package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
- package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +84 -19
- package/src/lib/services/transaction.service.ts +0 -1
- package/src/lib/services/unified-wallet.service.ts +0 -1
- package/src/lib/services/wallet-providers.service.ts +0 -1
|
@@ -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">0% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>0/826</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>0/1</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>0/1</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>0/826</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -889,150 +889,7 @@
|
|
|
889
889
|
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
890
|
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
891
|
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
-
<a name='L827'></a><a href='#L827'>827</a></td><td class="line-coverage quiet"><span class="cline-any cline-
|
|
893
|
-
<span class="cline-any cline-yes">1x</span>
|
|
894
|
-
<span class="cline-any cline-yes">1x</span>
|
|
895
|
-
<span class="cline-any cline-yes">1x</span>
|
|
896
|
-
<span class="cline-any cline-yes">1x</span>
|
|
897
|
-
<span class="cline-any cline-yes">1x</span>
|
|
898
|
-
<span class="cline-any cline-yes">1x</span>
|
|
899
|
-
<span class="cline-any cline-yes">1x</span>
|
|
900
|
-
<span class="cline-any cline-yes">1x</span>
|
|
901
|
-
<span class="cline-any cline-yes">1x</span>
|
|
902
|
-
<span class="cline-any cline-yes">1x</span>
|
|
903
|
-
<span class="cline-any cline-yes">1x</span>
|
|
904
|
-
<span class="cline-any cline-yes">1x</span>
|
|
905
|
-
<span class="cline-any cline-yes">1x</span>
|
|
906
|
-
<span class="cline-any cline-yes">1x</span>
|
|
907
|
-
<span class="cline-any cline-yes">1x</span>
|
|
908
|
-
<span class="cline-any cline-yes">1x</span>
|
|
909
|
-
<span class="cline-any cline-yes">1x</span>
|
|
910
|
-
<span class="cline-any cline-yes">1x</span>
|
|
911
|
-
<span class="cline-any cline-yes">1x</span>
|
|
912
|
-
<span class="cline-any cline-yes">1x</span>
|
|
913
|
-
<span class="cline-any cline-yes">1x</span>
|
|
914
|
-
<span class="cline-any cline-yes">1x</span>
|
|
915
|
-
<span class="cline-any cline-yes">1x</span>
|
|
916
|
-
<span class="cline-any cline-yes">1x</span>
|
|
917
|
-
<span class="cline-any cline-yes">1x</span>
|
|
918
|
-
<span class="cline-any cline-yes">1x</span>
|
|
919
|
-
<span class="cline-any cline-yes">1x</span>
|
|
920
|
-
<span class="cline-any cline-yes">1x</span>
|
|
921
|
-
<span class="cline-any cline-yes">1x</span>
|
|
922
|
-
<span class="cline-any cline-yes">1x</span>
|
|
923
|
-
<span class="cline-any cline-yes">1x</span>
|
|
924
|
-
<span class="cline-any cline-yes">1x</span>
|
|
925
|
-
<span class="cline-any cline-yes">1x</span>
|
|
926
|
-
<span class="cline-any cline-yes">1x</span>
|
|
927
|
-
<span class="cline-any cline-yes">1x</span>
|
|
928
|
-
<span class="cline-any cline-yes">1x</span>
|
|
929
|
-
<span class="cline-any cline-yes">1x</span>
|
|
930
|
-
<span class="cline-any cline-yes">1x</span>
|
|
931
|
-
<span class="cline-any cline-yes">1x</span>
|
|
932
|
-
<span class="cline-any cline-yes">1x</span>
|
|
933
|
-
<span class="cline-any cline-yes">1x</span>
|
|
934
|
-
<span class="cline-any cline-yes">1x</span>
|
|
935
|
-
<span class="cline-any cline-yes">1x</span>
|
|
936
|
-
<span class="cline-any cline-yes">1x</span>
|
|
937
|
-
<span class="cline-any cline-yes">1x</span>
|
|
938
|
-
<span class="cline-any cline-yes">1x</span>
|
|
939
|
-
<span class="cline-any cline-yes">1x</span>
|
|
940
|
-
<span class="cline-any cline-yes">1x</span>
|
|
941
|
-
<span class="cline-any cline-yes">1x</span>
|
|
942
|
-
<span class="cline-any cline-yes">1x</span>
|
|
943
|
-
<span class="cline-any cline-yes">1x</span>
|
|
944
|
-
<span class="cline-any cline-yes">1x</span>
|
|
945
|
-
<span class="cline-any cline-yes">1x</span>
|
|
946
|
-
<span class="cline-any cline-yes">1x</span>
|
|
947
|
-
<span class="cline-any cline-yes">1x</span>
|
|
948
|
-
<span class="cline-any cline-yes">1x</span>
|
|
949
|
-
<span class="cline-any cline-yes">1x</span>
|
|
950
|
-
<span class="cline-any cline-yes">1x</span>
|
|
951
|
-
<span class="cline-any cline-yes">1x</span>
|
|
952
|
-
<span class="cline-any cline-yes">1x</span>
|
|
953
|
-
<span class="cline-any cline-yes">1x</span>
|
|
954
|
-
<span class="cline-any cline-yes">1x</span>
|
|
955
|
-
<span class="cline-any cline-yes">1x</span>
|
|
956
|
-
<span class="cline-any cline-yes">1x</span>
|
|
957
|
-
<span class="cline-any cline-yes">1x</span>
|
|
958
|
-
<span class="cline-any cline-yes">1x</span>
|
|
959
|
-
<span class="cline-any cline-yes">1x</span>
|
|
960
|
-
<span class="cline-any cline-yes">1x</span>
|
|
961
|
-
<span class="cline-any cline-yes">1x</span>
|
|
962
|
-
<span class="cline-any cline-yes">1x</span>
|
|
963
|
-
<span class="cline-any cline-yes">1x</span>
|
|
964
|
-
<span class="cline-any cline-yes">1x</span>
|
|
965
|
-
<span class="cline-any cline-yes">1x</span>
|
|
966
|
-
<span class="cline-any cline-yes">1x</span>
|
|
967
|
-
<span class="cline-any cline-yes">1x</span>
|
|
968
|
-
<span class="cline-any cline-yes">1x</span>
|
|
969
|
-
<span class="cline-any cline-yes">1x</span>
|
|
970
|
-
<span class="cline-any cline-yes">16x</span>
|
|
971
|
-
<span class="cline-any cline-yes">16x</span>
|
|
972
|
-
<span class="cline-any cline-yes">16x</span>
|
|
973
|
-
<span class="cline-any cline-yes">16x</span>
|
|
974
|
-
<span class="cline-any cline-yes">16x</span>
|
|
975
|
-
<span class="cline-any cline-yes">16x</span>
|
|
976
|
-
<span class="cline-any cline-yes">16x</span>
|
|
977
|
-
<span class="cline-any cline-yes">16x</span>
|
|
978
|
-
<span class="cline-any cline-yes">16x</span>
|
|
979
|
-
<span class="cline-any cline-yes">16x</span>
|
|
980
|
-
<span class="cline-any cline-yes">16x</span>
|
|
981
|
-
<span class="cline-any cline-yes">16x</span>
|
|
982
|
-
<span class="cline-any cline-yes">16x</span>
|
|
983
|
-
<span class="cline-any cline-yes">16x</span>
|
|
984
|
-
<span class="cline-any cline-yes">16x</span>
|
|
985
|
-
<span class="cline-any cline-yes">16x</span>
|
|
986
|
-
<span class="cline-any cline-yes">16x</span>
|
|
987
|
-
<span class="cline-any cline-yes">16x</span>
|
|
988
|
-
<span class="cline-any cline-yes">16x</span>
|
|
989
|
-
<span class="cline-any cline-yes">16x</span>
|
|
990
|
-
<span class="cline-any cline-yes">16x</span>
|
|
991
|
-
<span class="cline-any cline-yes">16x</span>
|
|
992
|
-
<span class="cline-any cline-yes">16x</span>
|
|
993
|
-
<span class="cline-any cline-yes">16x</span>
|
|
994
|
-
<span class="cline-any cline-yes">16x</span>
|
|
995
|
-
<span class="cline-any cline-yes">16x</span>
|
|
996
|
-
<span class="cline-any cline-yes">16x</span>
|
|
997
|
-
<span class="cline-any cline-yes">16x</span>
|
|
998
|
-
<span class="cline-any cline-yes">16x</span>
|
|
999
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1000
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1001
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1002
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1003
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1004
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1005
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1006
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1007
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1008
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1009
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1010
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1011
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1012
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1013
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1014
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1015
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1016
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1017
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1018
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1019
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1020
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1021
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1022
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1023
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1024
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1025
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1026
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1027
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1028
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1029
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1030
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1031
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1032
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1033
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1034
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1035
|
-
<span class="cline-any cline-yes">16x</span>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
1036
893
|
<span class="cline-any cline-no"> </span>
|
|
1037
894
|
<span class="cline-any cline-no"> </span>
|
|
1038
895
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1045,27 +902,6 @@
|
|
|
1045
902
|
<span class="cline-any cline-no"> </span>
|
|
1046
903
|
<span class="cline-any cline-no"> </span>
|
|
1047
904
|
<span class="cline-any cline-no"> </span>
|
|
1048
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1049
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1050
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1051
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1052
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1053
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1054
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1055
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1056
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1057
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1058
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1059
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1060
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1061
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1062
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1063
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1064
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1065
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1066
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1067
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1068
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1069
905
|
<span class="cline-any cline-no"> </span>
|
|
1070
906
|
<span class="cline-any cline-no"> </span>
|
|
1071
907
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1097,23 +933,10 @@
|
|
|
1097
933
|
<span class="cline-any cline-no"> </span>
|
|
1098
934
|
<span class="cline-any cline-no"> </span>
|
|
1099
935
|
<span class="cline-any cline-no"> </span>
|
|
1100
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1101
936
|
<span class="cline-any cline-no"> </span>
|
|
1102
937
|
<span class="cline-any cline-no"> </span>
|
|
1103
938
|
<span class="cline-any cline-no"> </span>
|
|
1104
939
|
<span class="cline-any cline-no"> </span>
|
|
1105
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1106
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1107
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1108
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1109
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1110
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1111
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1112
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1113
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1114
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1115
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1116
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1117
940
|
<span class="cline-any cline-no"> </span>
|
|
1118
941
|
<span class="cline-any cline-no"> </span>
|
|
1119
942
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1230,35 +1053,8 @@
|
|
|
1230
1053
|
<span class="cline-any cline-no"> </span>
|
|
1231
1054
|
<span class="cline-any cline-no"> </span>
|
|
1232
1055
|
<span class="cline-any cline-no"> </span>
|
|
1233
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1234
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1235
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1236
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1237
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1238
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1239
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1240
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1241
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1242
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1243
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1244
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1245
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1246
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1247
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1248
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1249
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1250
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1251
1056
|
<span class="cline-any cline-no"> </span>
|
|
1252
1057
|
<span class="cline-any cline-no"> </span>
|
|
1253
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1254
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1255
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1256
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1257
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1258
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1259
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1260
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1261
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1262
1058
|
<span class="cline-any cline-no"> </span>
|
|
1263
1059
|
<span class="cline-any cline-no"> </span>
|
|
1264
1060
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1266,239 +1062,12 @@
|
|
|
1266
1062
|
<span class="cline-any cline-no"> </span>
|
|
1267
1063
|
<span class="cline-any cline-no"> </span>
|
|
1268
1064
|
<span class="cline-any cline-no"> </span>
|
|
1269
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1270
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1271
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1272
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1273
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1274
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1275
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1276
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1277
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1278
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1279
1065
|
<span class="cline-any cline-no"> </span>
|
|
1280
1066
|
<span class="cline-any cline-no"> </span>
|
|
1281
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1282
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1283
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1284
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1285
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1286
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1287
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1288
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1289
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1290
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1291
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1292
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1293
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1294
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1295
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1296
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1297
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1298
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1299
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1300
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1301
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1302
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1303
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1304
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1305
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1306
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1307
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1308
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1309
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1310
1067
|
<span class="cline-any cline-no"> </span>
|
|
1311
1068
|
<span class="cline-any cline-no"> </span>
|
|
1312
1069
|
<span class="cline-any cline-no"> </span>
|
|
1313
1070
|
<span class="cline-any cline-no"> </span>
|
|
1314
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1315
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1316
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1317
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1318
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1319
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1320
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1321
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1322
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1323
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1324
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1325
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1326
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1327
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1328
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1329
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1330
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1331
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1332
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1333
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1334
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1335
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1336
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1337
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1338
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1339
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1340
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1341
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1342
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1343
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1344
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1345
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1346
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1347
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1348
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1349
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1350
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1351
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1352
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1353
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1354
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1355
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1356
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1357
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1358
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1359
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1360
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1361
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1362
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1363
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1364
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1365
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1366
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1367
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1368
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1369
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1370
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1371
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1372
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1373
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1374
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1375
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1376
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1377
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1378
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1379
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1380
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1381
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1382
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1383
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1384
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1385
|
-
<span class="cline-any cline-no"> </span>
|
|
1386
|
-
<span class="cline-any cline-no"> </span>
|
|
1387
|
-
<span class="cline-any cline-no"> </span>
|
|
1388
|
-
<span class="cline-any cline-no"> </span>
|
|
1389
|
-
<span class="cline-any cline-no"> </span>
|
|
1390
|
-
<span class="cline-any cline-no"> </span>
|
|
1391
|
-
<span class="cline-any cline-no"> </span>
|
|
1392
|
-
<span class="cline-any cline-no"> </span>
|
|
1393
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1394
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1395
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1396
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1397
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1398
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1399
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1400
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1401
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1402
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1403
|
-
<span class="cline-any cline-no"> </span>
|
|
1404
|
-
<span class="cline-any cline-no"> </span>
|
|
1405
|
-
<span class="cline-any cline-no"> </span>
|
|
1406
|
-
<span class="cline-any cline-no"> </span>
|
|
1407
|
-
<span class="cline-any cline-no"> </span>
|
|
1408
|
-
<span class="cline-any cline-no"> </span>
|
|
1409
|
-
<span class="cline-any cline-no"> </span>
|
|
1410
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1411
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1412
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1413
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1414
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1415
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1416
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1417
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1418
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1419
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1420
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1421
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1422
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1423
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1424
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1425
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1426
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1427
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1428
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1429
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1430
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1431
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1432
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1433
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1434
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1435
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1436
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1437
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1438
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1439
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1440
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1441
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1442
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1443
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1444
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1445
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1446
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1447
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1448
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1449
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1450
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1451
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1452
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1453
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1454
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1455
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1456
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1457
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1458
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1459
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1460
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1461
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1462
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1463
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1464
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1465
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1466
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1467
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1468
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1469
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1470
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1471
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1472
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1473
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1474
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1475
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1476
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1477
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1478
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1479
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1480
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1481
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1482
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1483
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1484
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1485
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1486
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1487
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1488
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1489
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1490
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1491
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1492
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1493
|
-
<span class="cline-any cline-yes">13x</span>
|
|
1494
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1495
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1496
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1497
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1498
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1499
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1500
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1501
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1502
1071
|
<span class="cline-any cline-no"> </span>
|
|
1503
1072
|
<span class="cline-any cline-no"> </span>
|
|
1504
1073
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1534,46 +1103,15 @@
|
|
|
1534
1103
|
<span class="cline-any cline-no"> </span>
|
|
1535
1104
|
<span class="cline-any cline-no"> </span>
|
|
1536
1105
|
<span class="cline-any cline-no"> </span>
|
|
1537
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1538
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1539
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1540
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1541
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1542
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1543
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1544
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1545
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1546
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1547
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1548
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1549
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1550
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1551
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1552
1106
|
<span class="cline-any cline-no"> </span>
|
|
1553
1107
|
<span class="cline-any cline-no"> </span>
|
|
1554
1108
|
<span class="cline-any cline-no"> </span>
|
|
1555
1109
|
<span class="cline-any cline-no"> </span>
|
|
1556
1110
|
<span class="cline-any cline-no"> </span>
|
|
1557
1111
|
<span class="cline-any cline-no"> </span>
|
|
1558
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1559
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1560
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1561
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1562
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1563
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1564
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1565
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1566
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1567
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1568
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1569
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1570
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1571
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1572
1112
|
<span class="cline-any cline-no"> </span>
|
|
1573
1113
|
<span class="cline-any cline-no"> </span>
|
|
1574
1114
|
<span class="cline-any cline-no"> </span>
|
|
1575
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1576
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1577
1115
|
<span class="cline-any cline-no"> </span>
|
|
1578
1116
|
<span class="cline-any cline-no"> </span>
|
|
1579
1117
|
<span class="cline-any cline-no"> </span>
|
|
@@ -1600,265 +1138,727 @@
|
|
|
1600
1138
|
<span class="cline-any cline-no"> </span>
|
|
1601
1139
|
<span class="cline-any cline-no"> </span>
|
|
1602
1140
|
<span class="cline-any cline-no"> </span>
|
|
1603
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1604
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1605
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1606
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1607
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1608
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1609
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1610
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1611
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1612
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1613
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1614
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1615
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1616
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1617
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1618
1141
|
<span class="cline-any cline-no"> </span>
|
|
1619
1142
|
<span class="cline-any cline-no"> </span>
|
|
1620
1143
|
<span class="cline-any cline-no"> </span>
|
|
1621
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1622
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1623
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1624
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1625
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1626
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1627
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1628
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1629
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1630
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1631
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1632
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1633
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1634
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1635
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1636
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1637
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1638
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1639
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1640
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1641
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1642
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1643
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1644
1144
|
<span class="cline-any cline-no"> </span>
|
|
1645
1145
|
<span class="cline-any cline-no"> </span>
|
|
1646
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1647
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1648
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1649
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1650
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1651
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1652
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1653
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1654
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1655
1146
|
<span class="cline-any cline-no"> </span>
|
|
1656
1147
|
<span class="cline-any cline-no"> </span>
|
|
1657
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1658
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1659
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1660
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1661
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1662
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1663
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1664
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1665
1148
|
<span class="cline-any cline-no"> </span>
|
|
1666
1149
|
<span class="cline-any cline-no"> </span>
|
|
1667
1150
|
<span class="cline-any cline-no"> </span>
|
|
1668
1151
|
<span class="cline-any cline-no"> </span>
|
|
1669
1152
|
<span class="cline-any cline-no"> </span>
|
|
1670
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1671
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1672
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1673
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1674
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1675
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1676
1153
|
<span class="cline-any cline-no"> </span>
|
|
1677
1154
|
<span class="cline-any cline-no"> </span>
|
|
1678
1155
|
<span class="cline-any cline-no"> </span>
|
|
1679
1156
|
<span class="cline-any cline-no"> </span>
|
|
1680
1157
|
<span class="cline-any cline-no"> </span>
|
|
1681
|
-
<span class="cline-any cline-
|
|
1682
|
-
<span class="cline-any cline-
|
|
1683
|
-
<span class="cline-any cline-
|
|
1684
|
-
<span class="cline-any cline-
|
|
1685
|
-
<span class="cline-any cline-
|
|
1686
|
-
<span class="cline-any cline-
|
|
1687
|
-
<span class="cline-any cline-no"> </span>
|
|
1688
|
-
<span class="cline-any cline-no"> </span>
|
|
1689
|
-
<span class="cline-any cline-
|
|
1690
|
-
<span class="cline-any cline-
|
|
1691
|
-
<span class="cline-any cline-
|
|
1692
|
-
<span class="cline-any cline-
|
|
1693
|
-
<span class="cline-any cline-
|
|
1694
|
-
<span class="cline-any cline-
|
|
1695
|
-
<span class="cline-any cline-
|
|
1696
|
-
<span class="cline-any cline-
|
|
1697
|
-
<span class="cline-any cline-
|
|
1698
|
-
<span class="cline-any cline-no"> </span>
|
|
1699
|
-
<span class="cline-any cline-no"> </span>
|
|
1700
|
-
<span class="cline-any cline-no"> </span>
|
|
1701
|
-
<span class="cline-any cline-no"> </span>
|
|
1702
|
-
<span class="cline-any cline-no"> </span>
|
|
1703
|
-
<span class="cline-any cline-no"> </span>
|
|
1704
|
-
<span class="cline-any cline-no"> </span>
|
|
1705
|
-
<span class="cline-any cline-no"> </span>
|
|
1706
|
-
<span class="cline-any cline-no"> </span>
|
|
1707
|
-
<span class="cline-any cline-
|
|
1708
|
-
<span class="cline-any cline-
|
|
1709
|
-
<span class="cline-any cline-
|
|
1710
|
-
<span class="cline-any cline-
|
|
1711
|
-
<span class="cline-any cline-
|
|
1712
|
-
<span class="cline-any cline-
|
|
1713
|
-
<span class="cline-any cline-
|
|
1714
|
-
<span class="cline-any cline-
|
|
1715
|
-
<span class="cline-any cline-no"> </span>
|
|
1716
|
-
<span class="cline-any cline-no"> </span>
|
|
1717
|
-
<span class="cline-any cline-
|
|
1718
|
-
<span class="cline-any cline-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
<span class="
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-no"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-no"> </span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-no"> </span>
|
|
1282
|
+
<span class="cline-any cline-no"> </span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-no"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-no"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-no"> </span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-no"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-no"> </span>
|
|
1337
|
+
<span class="cline-any cline-no"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-no"> </span>
|
|
1342
|
+
<span class="cline-any cline-no"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-no"> </span>
|
|
1354
|
+
<span class="cline-any cline-no"> </span>
|
|
1355
|
+
<span class="cline-any cline-no"> </span>
|
|
1356
|
+
<span class="cline-any cline-no"> </span>
|
|
1357
|
+
<span class="cline-any cline-no"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </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>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-no"> </span>
|
|
1379
|
+
<span class="cline-any cline-no"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-no"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-no"> </span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-no"> </span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-no"> </span>
|
|
1397
|
+
<span class="cline-any cline-no"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-no"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-no"> </span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-no"> </span>
|
|
1414
|
+
<span class="cline-any cline-no"> </span>
|
|
1415
|
+
<span class="cline-any cline-no"> </span>
|
|
1416
|
+
<span class="cline-any cline-no"> </span>
|
|
1417
|
+
<span class="cline-any cline-no"> </span>
|
|
1418
|
+
<span class="cline-any cline-no"> </span>
|
|
1419
|
+
<span class="cline-any cline-no"> </span>
|
|
1420
|
+
<span class="cline-any cline-no"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-no"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-no"> </span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-no"> </span>
|
|
1429
|
+
<span class="cline-any cline-no"> </span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-no"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-no"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-no"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-no"> </span>
|
|
1445
|
+
<span class="cline-any cline-no"> </span>
|
|
1446
|
+
<span class="cline-any cline-no"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
|
+
<span class="cline-any cline-no"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-no"> </span>
|
|
1452
|
+
<span class="cline-any cline-no"> </span>
|
|
1453
|
+
<span class="cline-any cline-no"> </span>
|
|
1454
|
+
<span class="cline-any cline-no"> </span>
|
|
1455
|
+
<span class="cline-any cline-no"> </span>
|
|
1456
|
+
<span class="cline-any cline-no"> </span>
|
|
1457
|
+
<span class="cline-any cline-no"> </span>
|
|
1458
|
+
<span class="cline-any cline-no"> </span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-no"> </span>
|
|
1461
|
+
<span class="cline-any cline-no"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </span>
|
|
1465
|
+
<span class="cline-any cline-no"> </span>
|
|
1466
|
+
<span class="cline-any cline-no"> </span>
|
|
1467
|
+
<span class="cline-any cline-no"> </span>
|
|
1468
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
|
+
<span class="cline-any cline-no"> </span>
|
|
1470
|
+
<span class="cline-any cline-no"> </span>
|
|
1471
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
|
+
<span class="cline-any cline-no"> </span>
|
|
1473
|
+
<span class="cline-any cline-no"> </span>
|
|
1474
|
+
<span class="cline-any cline-no"> </span>
|
|
1475
|
+
<span class="cline-any cline-no"> </span>
|
|
1476
|
+
<span class="cline-any cline-no"> </span>
|
|
1477
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-no"> </span>
|
|
1481
|
+
<span class="cline-any cline-no"> </span>
|
|
1482
|
+
<span class="cline-any cline-no"> </span>
|
|
1483
|
+
<span class="cline-any cline-no"> </span>
|
|
1484
|
+
<span class="cline-any cline-no"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-no"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-no"> </span>
|
|
1491
|
+
<span class="cline-any cline-no"> </span>
|
|
1492
|
+
<span class="cline-any cline-no"> </span>
|
|
1493
|
+
<span class="cline-any cline-no"> </span>
|
|
1494
|
+
<span class="cline-any cline-no"> </span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-no"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-no"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-no"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-no"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-no"> </span>
|
|
1513
|
+
<span class="cline-any cline-no"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-no"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-no"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-no"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-no"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-no"> </span>
|
|
1555
|
+
<span class="cline-any cline-no"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-no"> </span>
|
|
1558
|
+
<span class="cline-any cline-no"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-no"> </span>
|
|
1567
|
+
<span class="cline-any cline-no"> </span>
|
|
1568
|
+
<span class="cline-any cline-no"> </span>
|
|
1569
|
+
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-no"> </span>
|
|
1575
|
+
<span class="cline-any cline-no"> </span>
|
|
1576
|
+
<span class="cline-any cline-no"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-no"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
1585
|
+
<span class="cline-any cline-no"> </span>
|
|
1586
|
+
<span class="cline-any cline-no"> </span>
|
|
1587
|
+
<span class="cline-any cline-no"> </span>
|
|
1588
|
+
<span class="cline-any cline-no"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-no"> </span>
|
|
1594
|
+
<span class="cline-any cline-no"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-no"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
1602
|
+
<span class="cline-any cline-no"> </span>
|
|
1603
|
+
<span class="cline-any cline-no"> </span>
|
|
1604
|
+
<span class="cline-any cline-no"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-no"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-no"> </span>
|
|
1613
|
+
<span class="cline-any cline-no"> </span>
|
|
1614
|
+
<span class="cline-any cline-no"> </span>
|
|
1615
|
+
<span class="cline-any cline-no"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-no"> </span>
|
|
1618
|
+
<span class="cline-any cline-no"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </span>
|
|
1620
|
+
<span class="cline-any cline-no"> </span>
|
|
1621
|
+
<span class="cline-any cline-no"> </span>
|
|
1622
|
+
<span class="cline-any cline-no"> </span>
|
|
1623
|
+
<span class="cline-any cline-no"> </span>
|
|
1624
|
+
<span class="cline-any cline-no"> </span>
|
|
1625
|
+
<span class="cline-any cline-no"> </span>
|
|
1626
|
+
<span class="cline-any cline-no"> </span>
|
|
1627
|
+
<span class="cline-any cline-no"> </span>
|
|
1628
|
+
<span class="cline-any cline-no"> </span>
|
|
1629
|
+
<span class="cline-any cline-no"> </span>
|
|
1630
|
+
<span class="cline-any cline-no"> </span>
|
|
1631
|
+
<span class="cline-any cline-no"> </span>
|
|
1632
|
+
<span class="cline-any cline-no"> </span>
|
|
1633
|
+
<span class="cline-any cline-no"> </span>
|
|
1634
|
+
<span class="cline-any cline-no"> </span>
|
|
1635
|
+
<span class="cline-any cline-no"> </span>
|
|
1636
|
+
<span class="cline-any cline-no"> </span>
|
|
1637
|
+
<span class="cline-any cline-no"> </span>
|
|
1638
|
+
<span class="cline-any cline-no"> </span>
|
|
1639
|
+
<span class="cline-any cline-no"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-no"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </span>
|
|
1644
|
+
<span class="cline-any cline-no"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-no"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-no"> </span>
|
|
1649
|
+
<span class="cline-any cline-no"> </span>
|
|
1650
|
+
<span class="cline-any cline-no"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-no"> </span>
|
|
1653
|
+
<span class="cline-any cline-no"> </span>
|
|
1654
|
+
<span class="cline-any cline-no"> </span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-no"> </span>
|
|
1658
|
+
<span class="cline-any cline-no"> </span>
|
|
1659
|
+
<span class="cline-any cline-no"> </span>
|
|
1660
|
+
<span class="cline-any cline-no"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-no"> </span>
|
|
1663
|
+
<span class="cline-any cline-no"> </span>
|
|
1664
|
+
<span class="cline-any cline-no"> </span>
|
|
1665
|
+
<span class="cline-any cline-no"> </span>
|
|
1666
|
+
<span class="cline-any cline-no"> </span>
|
|
1667
|
+
<span class="cline-any cline-no"> </span>
|
|
1668
|
+
<span class="cline-any cline-no"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-no"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-no"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-no"> </span>
|
|
1676
|
+
<span class="cline-any cline-no"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-no"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-no"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-no"> </span>
|
|
1683
|
+
<span class="cline-any cline-no"> </span>
|
|
1684
|
+
<span class="cline-any cline-no"> </span>
|
|
1685
|
+
<span class="cline-any cline-no"> </span>
|
|
1686
|
+
<span class="cline-any cline-no"> </span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-no"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-no"> </span>
|
|
1691
|
+
<span class="cline-any cline-no"> </span>
|
|
1692
|
+
<span class="cline-any cline-no"> </span>
|
|
1693
|
+
<span class="cline-any cline-no"> </span>
|
|
1694
|
+
<span class="cline-any cline-no"> </span>
|
|
1695
|
+
<span class="cline-any cline-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-no"> </span>
|
|
1697
|
+
<span class="cline-any cline-no"> </span>
|
|
1698
|
+
<span class="cline-any cline-no"> </span>
|
|
1699
|
+
<span class="cline-any cline-no"> </span>
|
|
1700
|
+
<span class="cline-any cline-no"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-no"> </span>
|
|
1703
|
+
<span class="cline-any cline-no"> </span>
|
|
1704
|
+
<span class="cline-any cline-no"> </span>
|
|
1705
|
+
<span class="cline-any cline-no"> </span>
|
|
1706
|
+
<span class="cline-any cline-no"> </span>
|
|
1707
|
+
<span class="cline-any cline-no"> </span>
|
|
1708
|
+
<span class="cline-any cline-no"> </span>
|
|
1709
|
+
<span class="cline-any cline-no"> </span>
|
|
1710
|
+
<span class="cline-any cline-no"> </span>
|
|
1711
|
+
<span class="cline-any cline-no"> </span>
|
|
1712
|
+
<span class="cline-any cline-no"> </span>
|
|
1713
|
+
<span class="cline-any cline-no"> </span>
|
|
1714
|
+
<span class="cline-any cline-no"> </span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
|
|
1719
|
+
<span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
|
|
1720
|
+
<span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
|
|
1721
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1722
|
+
<span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
|
|
1723
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1724
|
+
<span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
|
|
1725
|
+
<span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
|
|
1726
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1727
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1728
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
1729
|
+
<span class="cstat-no" title="statement not covered" > * @file walletconnect-provider.ts</span>
|
|
1730
|
+
<span class="cstat-no" title="statement not covered" > * @description Refactored WalletConnect v2 provider using Strategy Pattern</span>
|
|
1731
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1732
|
+
<span class="cstat-no" title="statement not covered" > * Multi-chain WalletConnect v2 provider that delegates ledger-specific logic</span>
|
|
1733
|
+
<span class="cstat-no" title="statement not covered" > * to specialized signer implementations.</span>
|
|
1734
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1735
|
+
<span class="cstat-no" title="statement not covered" > * Architecture:</span>
|
|
1736
|
+
<span class="cstat-no" title="statement not covered" > * - Provider: Orchestrates connection, session management, and UI</span>
|
|
1737
|
+
<span class="cstat-no" title="statement not covered" > * - Signers: Handle ledger-specific transaction signing and formatting</span>
|
|
1738
|
+
<span class="cstat-no" title="statement not covered" > * - Encoders: Convert between SDK formats and WalletConnect formats</span>
|
|
1739
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1740
|
+
<span class="cstat-no" title="statement not covered" > * Benefits:</span>
|
|
1741
|
+
<span class="cstat-no" title="statement not covered" > * - Clean separation of concerns</span>
|
|
1742
|
+
<span class="cstat-no" title="statement not covered" > * - Easy to add new ledgers (just implement IWalletConnectSigner)</span>
|
|
1743
|
+
<span class="cstat-no" title="statement not covered" > * - Testable (mock signers for unit tests)</span>
|
|
1744
|
+
<span class="cstat-no" title="statement not covered" > * - Maintainable (ledger logic is isolated)</span>
|
|
1745
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1746
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1747
|
+
<span class="cstat-no" title="statement not covered" >import { Injectable, signal, inject, NgZone } from '@angular/core';</span>
|
|
1748
|
+
<span class="cstat-no" title="statement not covered" >import { getLogger } from '@hsuite/native-connect-sdk';</span>
|
|
1749
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1750
|
+
<span class="cstat-no" title="statement not covered" >import type {</span>
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" > ConnectionStatus,</span>
|
|
1752
|
+
<span class="cstat-no" title="statement not covered" > ProviderMetadata,</span>
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > ConnectionConfig,</span>
|
|
1754
|
+
<span class="cstat-no" title="statement not covered" > WalletConnectV2Config,</span>
|
|
1755
|
+
<span class="cstat-no" title="statement not covered" >} from '../../../models/provider-types';</span>
|
|
1756
|
+
<span class="cstat-no" title="statement not covered" >import type { UnifiedAccount } from '../../../models/unified-account.model';</span>
|
|
1757
|
+
<span class="cstat-no" title="statement not covered" >import { WalletEventBus } from '../../../services/wallet-event-bus.service';</span>
|
|
1758
|
+
<span class="cstat-no" title="statement not covered" >import { BaseWalletProvider } from '../../base-wallet-provider';</span>
|
|
1759
|
+
<span class="cstat-no" title="statement not covered" >import type {</span>
|
|
1760
|
+
<span class="cstat-no" title="statement not covered" > SignTransactionOptions,</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" > SubmitTransactionOptions,</span>
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > SignResult,</span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" > SubmitResult,</span>
|
|
1764
|
+
<span class="cstat-no" title="statement not covered" > SignMessageOptions,</span>
|
|
1765
|
+
<span class="cstat-no" title="statement not covered" > SignMessageResult,</span>
|
|
1766
|
+
<span class="cstat-no" title="statement not covered" >} from '../../base-wallet-provider';</span>
|
|
1767
|
+
<span class="cstat-no" title="statement not covered" >import { SignerFactory } from '../signers/signer-factory';</span>
|
|
1768
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1769
|
+
<span class="cstat-no" title="statement not covered" >import { WalletConnectClientManager } from './walletconnect-client-manager';</span>
|
|
1770
|
+
<span class="cstat-no" title="statement not covered" >import { WalletConnectSessionStore } from './walletconnect-session-store';</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" >import { WalletConnectSigningOrchestrator } from './walletconnect-signing-orchestrator';</span>
|
|
1772
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('WalletConnectV2Provider') ?? getLogger();</span>
|
|
1774
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
1776
|
+
<span class="cstat-no" title="statement not covered" > * Storage key prefix for persisting user's network selection per session topic.</span>
|
|
1777
|
+
<span class="cstat-no" title="statement not covered" > * This is critical for proper session restoration after page reload.</span>
|
|
1778
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" >const NETWORK_SELECTION_STORAGE_KEY = 'wc_user_network_selection_';</span>
|
|
1780
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
1782
|
+
<span class="cstat-no" title="statement not covered" > * WalletConnect v2 provider with multi-chain support.</span>
|
|
1783
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1784
|
+
<span class="cstat-no" title="statement not covered" > * Uses Strategy Pattern to delegate ledger-specific operations to</span>
|
|
1785
|
+
<span class="cstat-no" title="statement not covered" > * specialized signer implementations (HederaSigner, XrplSigner, etc.).</span>
|
|
1786
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1787
|
+
<span class="cstat-no" title="statement not covered" > * Features:</span>
|
|
1788
|
+
<span class="cstat-no" title="statement not covered" > * - Automatic session restoration from IndexedDB</span>
|
|
1789
|
+
<span class="cstat-no" title="statement not covered" > * - QR code modal for wallet connection</span>
|
|
1790
|
+
<span class="cstat-no" title="statement not covered" > * - Support for multiple ledgers (Hedera, XRPL, extensible)</span>
|
|
1791
|
+
<span class="cstat-no" title="statement not covered" > * - Clean separation of orchestration vs ledger logic</span>
|
|
1792
|
+
<span class="cstat-no" title="statement not covered" > * - **Multi-session support**: Connect multiple wallets across different ledgers/networks</span>
|
|
1793
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1794
|
+
<span class="cstat-no" title="statement not covered" >@Injectable({ providedIn: 'root' })</span>
|
|
1795
|
+
<span class="cstat-no" title="statement not covered" >export class WalletConnectV2Provider extends BaseWalletProvider {</span>
|
|
1796
|
+
<span class="cstat-no" title="statement not covered" > override readonly id = 'walletconnect-v2';</span>
|
|
1797
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > override readonly metadata: ProviderMetadata = {</span>
|
|
1799
|
+
<span class="cstat-no" title="statement not covered" > id: 'walletconnect-v2',</span>
|
|
1800
|
+
<span class="cstat-no" title="statement not covered" > name: 'WalletConnect',</span>
|
|
1801
|
+
<span class="cstat-no" title="statement not covered" > type: 'walletconnect-v2',</span>
|
|
1802
|
+
<span class="cstat-no" title="statement not covered" > description: 'Connect via QR code to Hedera, XRPL, and other wallets',</span>
|
|
1803
|
+
<span class="cstat-no" title="statement not covered" > supportsMultipleAccounts: true, // Changed to true for multi-session</span>
|
|
1804
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1805
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1806
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1807
|
+
<span class="cstat-no" title="statement not covered" > * Client manager - handles SignClient lifecycle.</span>
|
|
1808
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1809
|
+
<span class="cstat-no" title="statement not covered" > private readonly clientManager = new WalletConnectClientManager();</span>
|
|
1810
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1811
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1812
|
+
<span class="cstat-no" title="statement not covered" > * Session store - handles session Map and account aggregation.</span>
|
|
1813
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1814
|
+
<span class="cstat-no" title="statement not covered" > private readonly sessionStore = new WalletConnectSessionStore();</span>
|
|
1815
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1816
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1817
|
+
<span class="cstat-no" title="statement not covered" > * Signing orchestrator - handles transaction signing routing.</span>
|
|
1818
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1819
|
+
<span class="cstat-no" title="statement not covered" > private signingOrchestrator!: WalletConnectSigningOrchestrator;</span>
|
|
1820
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1821
|
+
<span class="cstat-no" title="statement not covered" > // Track session_delete listener registration</span>
|
|
1822
|
+
<span class="cstat-no" title="statement not covered" > private sessionDeleteListenerRegistered = false;</span>
|
|
1823
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1824
|
+
<span class="cstat-no" title="statement not covered" > // Reactive state</span>
|
|
1825
|
+
<span class="cstat-no" title="statement not covered" > private _status = signal<ConnectionStatus>('disconnected');</span>
|
|
1826
|
+
<span class="cstat-no" title="statement not covered" > private _error = signal<string | null>(null);</span>
|
|
1827
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1828
|
+
<span class="cstat-no" title="statement not covered" > override readonly status = this._status.asReadonly();</span>
|
|
1829
|
+
<span class="cstat-no" title="statement not covered" > override readonly accounts = this.sessionStore.accounts;</span>
|
|
1830
|
+
<span class="cstat-no" title="statement not covered" > override readonly error = this._error.asReadonly();</span>
|
|
1831
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1832
|
+
<span class="cstat-no" title="statement not covered" > // Event bus for emitting wallet events</span>
|
|
1833
|
+
<span class="cstat-no" title="statement not covered" > private readonly eventBus = inject(WalletEventBus);</span>
|
|
1834
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1835
|
+
<span class="cstat-no" title="statement not covered" > // NgZone for ensuring change detection runs after WalletConnect events</span>
|
|
1836
|
+
<span class="cstat-no" title="statement not covered" > private readonly zone = inject(NgZone);</span>
|
|
1837
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1838
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1839
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1840
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1841
|
+
<span class="cstat-no" title="statement not covered" > constructor() {</span>
|
|
1842
|
+
<span class="cstat-no" title="statement not covered" > super();</span>
|
|
1843
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1844
|
+
<span class="cstat-no" title="statement not covered" > // Initialize signing orchestrator</span>
|
|
1845
|
+
<span class="cstat-no" title="statement not covered" > this.signingOrchestrator = new WalletConnectSigningOrchestrator({</span>
|
|
1846
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
1847
|
+
<span class="cstat-no" title="statement not covered" > sessionStore: this.sessionStore,</span>
|
|
1848
|
+
<span class="cstat-no" title="statement not covered" > clientManager: this.clientManager,</span>
|
|
1849
|
+
<span class="cstat-no" title="statement not covered" > eventBus: this.eventBus,</span>
|
|
1850
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1851
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1852
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Initializing - will attempt session restoration');</span>
|
|
1853
|
+
<span class="cstat-no" title="statement not covered" > void this.restoreSession();</span>
|
|
1854
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1855
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1856
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1857
|
+
<span class="cstat-no" title="statement not covered" > * Ensure that a previously restored WalletConnect session is present in memory.</span>
|
|
1858
|
+
<span class="cstat-no" title="statement not covered" > * Useful for UI flows that want to re-select a session after reload without forcing a new pairing flow.</span>
|
|
1859
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionKey</span>
|
|
1860
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1861
|
+
<span class="cstat-no" title="statement not covered" > async resumeSession(sessionKey: string): Promise<boolean> {</span>
|
|
1862
1862
|
<span class="cstat-no" title="statement not covered" > if (this.sessionStore.hasSession(sessionKey)) {</span>
|
|
1863
1863
|
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
1864
1864
|
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
@@ -1871,27 +1871,27 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
1871
1871
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1872
1872
|
<span class="cstat-no" title="statement not covered" > return exists;</span>
|
|
1873
1873
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
* Restore existing WalletConnect sessions from IndexedDB
|
|
1877
|
-
* Automatically called during provider initialization
|
|
1878
|
-
* Uses clientManager for client lifecycle
|
|
1879
|
-
|
|
1880
|
-
private async restoreSession(): Promise<void> {
|
|
1881
|
-
try {
|
|
1882
|
-
logger.debug('Attempting to restore sessions...')
|
|
1883
|
-
|
|
1884
|
-
// Restore client from stored projectId
|
|
1885
|
-
const client = await this.clientManager.restoreClient({
|
|
1886
|
-
name: 'HSuite Demo'
|
|
1887
|
-
description: 'Multi-chain wallet connection'
|
|
1888
|
-
url: window.location.origin
|
|
1889
|
-
icons: []
|
|
1890
|
-
})
|
|
1891
|
-
|
|
1892
|
-
if (!client) {
|
|
1893
|
-
return
|
|
1894
|
-
<span class="
|
|
1874
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1875
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1876
|
+
<span class="cstat-no" title="statement not covered" > * Restore existing WalletConnect sessions from IndexedDB.</span>
|
|
1877
|
+
<span class="cstat-no" title="statement not covered" > * Automatically called during provider initialization.</span>
|
|
1878
|
+
<span class="cstat-no" title="statement not covered" > * Uses clientManager for client lifecycle.</span>
|
|
1879
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1880
|
+
<span class="cstat-no" title="statement not covered" > private async restoreSession(): Promise<void> {</span>
|
|
1881
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1882
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Attempting to restore sessions...');</span>
|
|
1883
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1884
|
+
<span class="cstat-no" title="statement not covered" > // Restore client from stored projectId</span>
|
|
1885
|
+
<span class="cstat-no" title="statement not covered" > const client = await this.clientManager.restoreClient({</span>
|
|
1886
|
+
<span class="cstat-no" title="statement not covered" > name: 'HSuite Demo',</span>
|
|
1887
|
+
<span class="cstat-no" title="statement not covered" > description: 'Multi-chain wallet connection',</span>
|
|
1888
|
+
<span class="cstat-no" title="statement not covered" > url: window.location.origin,</span>
|
|
1889
|
+
<span class="cstat-no" title="statement not covered" > icons: [],</span>
|
|
1890
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1891
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1892
|
+
<span class="cstat-no" title="statement not covered" > if (!client) {</span>
|
|
1893
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1894
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1895
1895
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
1896
1896
|
<span class="cstat-no" title="statement not covered" > // Register session_delete listener</span>
|
|
1897
1897
|
<span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
|
|
@@ -1923,23 +1923,23 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
1923
1923
|
<span class="cstat-no" title="statement not covered" > this._status.set('connected');</span>
|
|
1924
1924
|
<span class="cstat-no" title="statement not covered" > logger.info('Restored sessions', { count: this.sessionStore.size });</span>
|
|
1925
1925
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1926
|
-
<span class="
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
1927
1927
|
<span class="cstat-no" title="statement not covered" > logger.error('Failed to restore sessions', {</span>
|
|
1928
1928
|
<span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
|
|
1929
1929
|
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1930
1930
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1931
|
-
}
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
* Restore a single WalletConnect session
|
|
1935
|
-
* Internal helper for multi-session restoration
|
|
1936
|
-
|
|
1937
|
-
* IMPORTANT: Reads user's network selection from localStorage to ensure
|
|
1938
|
-
* restored sessions use the correct network the user originally selected
|
|
1939
|
-
|
|
1940
|
-
* @param session - WalletConnect session object from IndexedDB
|
|
1941
|
-
|
|
1942
|
-
<span class="
|
|
1931
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1932
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1933
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1934
|
+
<span class="cstat-no" title="statement not covered" > * Restore a single WalletConnect session.</span>
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" > * Internal helper for multi-session restoration.</span>
|
|
1936
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" > * IMPORTANT: Reads user's network selection from localStorage to ensure</span>
|
|
1938
|
+
<span class="cstat-no" title="statement not covered" > * restored sessions use the correct network the user originally selected.</span>
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1940
|
+
<span class="cstat-no" title="statement not covered" > * @param session - WalletConnect session object from IndexedDB</span>
|
|
1941
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1942
|
+
<span class="cstat-no" title="statement not covered" > private async restoreSingleSession(session: any): Promise<void> {</span>
|
|
1943
1943
|
<span class="cstat-no" title="statement not covered" > logger.debug('Restoring session', { topic: session.topic });</span>
|
|
1944
1944
|
<span class="cstat-no" title="statement not covered" > logger.debug('Session namespaces', { namespaces: Object.keys(session.namespaces) });</span>
|
|
1945
1945
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -2056,35 +2056,35 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2056
2056
|
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2057
2057
|
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2058
2058
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2059
|
-
|
|
2060
|
-
// NOTE: generateSessionKey and updateAggregatedAccounts have been moved to WalletConnectSessionStore
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
* Store user's network selection in localStorage for session restoration
|
|
2064
|
-
* This ensures the user's network choice persists across page reloads
|
|
2065
|
-
|
|
2066
|
-
* @param sessionTopic - WalletConnect session topic
|
|
2067
|
-
* @param networkId - User's selected network (e.g., 'hedera:mainnet')
|
|
2068
|
-
|
|
2069
|
-
private storeUserNetworkSelection(sessionTopic: string, networkId: string): void {
|
|
2070
|
-
try {
|
|
2071
|
-
localStorage.setItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`, networkId)
|
|
2072
|
-
logger.debug('Stored user network selection', {
|
|
2073
|
-
topic: sessionTopic.substring(0, 16)
|
|
2074
|
-
networkId
|
|
2075
|
-
})
|
|
2076
|
-
<span class="
|
|
2059
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2060
|
+
<span class="cstat-no" title="statement not covered" > // NOTE: generateSessionKey and updateAggregatedAccounts have been moved to WalletConnectSessionStore</span>
|
|
2061
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2062
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2063
|
+
<span class="cstat-no" title="statement not covered" > * Store user's network selection in localStorage for session restoration.</span>
|
|
2064
|
+
<span class="cstat-no" title="statement not covered" > * This ensures the user's network choice persists across page reloads.</span>
|
|
2065
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2066
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionTopic - WalletConnect session topic</span>
|
|
2067
|
+
<span class="cstat-no" title="statement not covered" > * @param networkId - User's selected network (e.g., 'hedera:mainnet')</span>
|
|
2068
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2069
|
+
<span class="cstat-no" title="statement not covered" > private storeUserNetworkSelection(sessionTopic: string, networkId: string): void {</span>
|
|
2070
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2071
|
+
<span class="cstat-no" title="statement not covered" > localStorage.setItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`, networkId);</span>
|
|
2072
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Stored user network selection', {</span>
|
|
2073
|
+
<span class="cstat-no" title="statement not covered" > topic: sessionTopic.substring(0, 16),</span>
|
|
2074
|
+
<span class="cstat-no" title="statement not covered" > networkId,</span>
|
|
2075
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2076
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
2077
2077
|
<span class="cstat-no" title="statement not covered" > logger.warn('Failed to store network selection', { error: (e as Error).message });</span>
|
|
2078
2078
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2079
|
-
}
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
* Retrieve user's network selection from localStorage for session restoration
|
|
2083
|
-
|
|
2084
|
-
* @param sessionTopic - WalletConnect session topic
|
|
2085
|
-
* @returns User's selected network, or undefined if not found
|
|
2086
|
-
|
|
2087
|
-
|
|
2079
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2080
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2081
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2082
|
+
<span class="cstat-no" title="statement not covered" > * Retrieve user's network selection from localStorage for session restoration.</span>
|
|
2083
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2084
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionTopic - WalletConnect session topic</span>
|
|
2085
|
+
<span class="cstat-no" title="statement not covered" > * @returns User's selected network, or undefined if not found</span>
|
|
2086
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2087
|
+
<span class="cstat-no" title="statement not covered" > private getUserNetworkSelection(sessionTopic: string): string | undefined {</span>
|
|
2088
2088
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2089
2089
|
<span class="cstat-no" title="statement not covered" > return localStorage.getItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`) || undefined;</span>
|
|
2090
2090
|
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
@@ -2092,122 +2092,122 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2092
2092
|
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
2093
2093
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2094
2094
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
* Clean up stored network selection for a session
|
|
2098
|
-
|
|
2099
|
-
* @param sessionTopic - WalletConnect session topic
|
|
2100
|
-
|
|
2101
|
-
private clearUserNetworkSelection(sessionTopic: string): void {
|
|
2102
|
-
try {
|
|
2103
|
-
localStorage.removeItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`)
|
|
2104
|
-
<span class="
|
|
2095
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2096
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2097
|
+
<span class="cstat-no" title="statement not covered" > * Clean up stored network selection for a session.</span>
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2099
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionTopic - WalletConnect session topic</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2101
|
+
<span class="cstat-no" title="statement not covered" > private clearUserNetworkSelection(sessionTopic: string): void {</span>
|
|
2102
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" > localStorage.removeItem(`${NETWORK_SELECTION_STORAGE_KEY}${sessionTopic}`);</span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > } catch (_e) {</span>
|
|
2105
2105
|
<span class="cstat-no" title="statement not covered" > // Ignore cleanup errors</span>
|
|
2106
2106
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2107
|
-
}
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
* Connect to a wallet via WalletConnect QR code
|
|
2111
|
-
|
|
2112
|
-
* Multi-session support
|
|
2113
|
-
* - Each connect() call creates a NEW session
|
|
2114
|
-
* - Sessions are tracked separately in the sessions Map
|
|
2115
|
-
* - Multiple sessions can coexist for different ledgers/networks
|
|
2116
|
-
|
|
2117
|
-
* Process
|
|
2118
|
-
* 1. Get appropriate signer for the ledger
|
|
2119
|
-
* 2. Initialize WalletConnect client and modal
|
|
2120
|
-
* 3. Build namespace configuration using signer
|
|
2121
|
-
* 4. Generate QR code and wait for wallet approval
|
|
2122
|
-
* 5. Store session and update aggregated accounts
|
|
2123
|
-
|
|
2124
|
-
* @param config - Connection configuration including ledger and network
|
|
2125
|
-
|
|
2126
|
-
async connect(config: ConnectionConfig): Promise<void> {
|
|
2127
|
-
const wcConfig = config as WalletConnectV2Config
|
|
2128
|
-
|
|
2129
|
-
try {
|
|
2130
|
-
this._status.set('connecting')
|
|
2131
|
-
this._error.set(null)
|
|
2132
|
-
|
|
2133
|
-
// Validate configuration
|
|
2134
|
-
const projectId = wcConfig.projectId
|
|
2135
|
-
|
|
2107
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2108
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2109
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2110
|
+
<span class="cstat-no" title="statement not covered" > * Connect to a wallet via WalletConnect QR code.</span>
|
|
2111
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2112
|
+
<span class="cstat-no" title="statement not covered" > * Multi-session support:</span>
|
|
2113
|
+
<span class="cstat-no" title="statement not covered" > * - Each connect() call creates a NEW session</span>
|
|
2114
|
+
<span class="cstat-no" title="statement not covered" > * - Sessions are tracked separately in the sessions Map</span>
|
|
2115
|
+
<span class="cstat-no" title="statement not covered" > * - Multiple sessions can coexist for different ledgers/networks</span>
|
|
2116
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" > * Process:</span>
|
|
2118
|
+
<span class="cstat-no" title="statement not covered" > * 1. Get appropriate signer for the ledger</span>
|
|
2119
|
+
<span class="cstat-no" title="statement not covered" > * 2. Initialize WalletConnect client and modal</span>
|
|
2120
|
+
<span class="cstat-no" title="statement not covered" > * 3. Build namespace configuration using signer</span>
|
|
2121
|
+
<span class="cstat-no" title="statement not covered" > * 4. Generate QR code and wait for wallet approval</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > * 5. Store session and update aggregated accounts</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > * @param config - Connection configuration including ledger and network</span>
|
|
2125
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2126
|
+
<span class="cstat-no" title="statement not covered" > async connect(config: ConnectionConfig): Promise<void> {</span>
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > const wcConfig = config as WalletConnectV2Config;</span>
|
|
2128
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2129
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2130
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('connecting');</span>
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > this._error.set(null);</span>
|
|
2132
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2133
|
+
<span class="cstat-no" title="statement not covered" > // Validate configuration</span>
|
|
2134
|
+
<span class="cstat-no" title="statement not covered" > const projectId = wcConfig.projectId;</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > if (!projectId) {</span>
|
|
2136
2136
|
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2137
2137
|
<span class="cstat-no" title="statement not covered" > 'WalletConnect projectId is required. Get one from https://cloud.walletconnect.com',</span>
|
|
2138
2138
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2139
2139
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2140
|
-
|
|
2141
|
-
// Get the appropriate signer for this ledger (Strategy Pattern)
|
|
2142
|
-
const signer = SignerFactory.getSigner(wcConfig.ledgerId)
|
|
2143
|
-
logger.debug('Using signer for ledger', { ledgerId: wcConfig.ledgerId })
|
|
2144
|
-
|
|
2145
|
-
// Initialize client via manager
|
|
2146
|
-
await this.clientManager.initialize(projectId, {
|
|
2147
|
-
name: wcConfig.appName || 'HSuite Demo'
|
|
2148
|
-
description: wcConfig.appDescription || 'Multi-chain wallet connection'
|
|
2149
|
-
url: window.location.origin
|
|
2150
|
-
|
|
2151
|
-
})
|
|
2152
|
-
this.registerSessionDeleteListener()
|
|
2153
|
-
|
|
2154
|
-
// Create modal for QR code display
|
|
2155
|
-
const modal = this.clientManager.createModal(projectId, [wcConfig.networkId])
|
|
2156
|
-
|
|
2157
|
-
// Build namespace configuration using signer
|
|
2158
|
-
const namespaceConfig = signer.buildNamespace(wcConfig.networkId)
|
|
2159
|
-
const optionalNamespaces = { [wcConfig.ledgerId]: namespaceConfig }
|
|
2160
|
-
logger.debug('Namespace config', { ledgerId: wcConfig.ledgerId })
|
|
2161
|
-
|
|
2162
|
-
// Build session properties to pass user's preferred network to wallet
|
|
2163
|
-
// This tells the wallet which network accounts to show in the picker
|
|
2164
|
-
const sessionProperties = {
|
|
2165
|
-
preferredNetwork: wcConfig.networkId
|
|
2166
|
-
preferredLedger: wcConfig.ledgerId
|
|
2167
|
-
}
|
|
2168
|
-
|
|
2169
|
-
logger.info('Connecting with preferred network', {
|
|
2170
|
-
preferredNetwork: wcConfig.networkId
|
|
2171
|
-
preferredLedger: wcConfig.ledgerId
|
|
2172
|
-
})
|
|
2173
|
-
|
|
2174
|
-
// Connect and show QR code
|
|
2175
|
-
const { uri, approval } = await this.clientManager.connect(
|
|
2176
|
-
optionalNamespaces
|
|
2177
|
-
sessionProperties
|
|
2178
|
-
)
|
|
2179
|
-
|
|
2180
|
-
if (uri) {
|
|
2181
|
-
await modal.openModal({ uri })
|
|
2182
|
-
}
|
|
2183
|
-
|
|
2184
|
-
// Wait for wallet approval
|
|
2185
|
-
logger.info('Waiting for wallet approval...')
|
|
2186
|
-
const session = await approval()
|
|
2187
|
-
this.clientManager.closeModal()
|
|
2188
|
-
|
|
2189
|
-
logger.info('[WC:DAPP:APPROVED] Session approved by wallet', {
|
|
2190
|
-
topic: session.topic.substring(0, 16) + '...'
|
|
2191
|
-
fullTopic: session.topic
|
|
2192
|
-
namespaces: Object.keys(session.namespaces)
|
|
2193
|
-
expiry: session.expiry
|
|
2194
|
-
})
|
|
2195
|
-
|
|
2196
|
-
// Generate session key
|
|
2197
|
-
const sessionKey = this.sessionStore.generateSessionKey(
|
|
2198
|
-
wcConfig.ledgerId
|
|
2199
|
-
wcConfig.networkId
|
|
2200
|
-
session.topic
|
|
2201
|
-
)
|
|
2202
|
-
|
|
2203
|
-
// Parse accounts from session
|
|
2204
|
-
const sessionNamespace = session.namespaces[wcConfig.ledgerId]
|
|
2205
|
-
logger.debug('Session namespace for ledger', {
|
|
2206
|
-
ledgerId: wcConfig.ledgerId
|
|
2207
|
-
accountCount: (sessionNamespace as { accounts?: any[] })?.accounts
|
|
2208
|
-
})
|
|
2209
|
-
|
|
2210
|
-
|
|
2140
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2141
|
+
<span class="cstat-no" title="statement not covered" > // Get the appropriate signer for this ledger (Strategy Pattern)</span>
|
|
2142
|
+
<span class="cstat-no" title="statement not covered" > const signer = SignerFactory.getSigner(wcConfig.ledgerId);</span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Using signer for ledger', { ledgerId: wcConfig.ledgerId });</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2145
|
+
<span class="cstat-no" title="statement not covered" > // Initialize client via manager</span>
|
|
2146
|
+
<span class="cstat-no" title="statement not covered" > await this.clientManager.initialize(projectId, {</span>
|
|
2147
|
+
<span class="cstat-no" title="statement not covered" > name: wcConfig.appName || 'HSuite Demo',</span>
|
|
2148
|
+
<span class="cstat-no" title="statement not covered" > description: wcConfig.appDescription || 'Multi-chain wallet connection',</span>
|
|
2149
|
+
<span class="cstat-no" title="statement not covered" > url: window.location.origin,</span>
|
|
2150
|
+
<span class="cstat-no" title="statement not covered" > icons: wcConfig.appIconUrl ? [wcConfig.appIconUrl] : [],</span>
|
|
2151
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2152
|
+
<span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
|
|
2153
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2154
|
+
<span class="cstat-no" title="statement not covered" > // Create modal for QR code display</span>
|
|
2155
|
+
<span class="cstat-no" title="statement not covered" > const modal = this.clientManager.createModal(projectId, [wcConfig.networkId]);</span>
|
|
2156
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2157
|
+
<span class="cstat-no" title="statement not covered" > // Build namespace configuration using signer</span>
|
|
2158
|
+
<span class="cstat-no" title="statement not covered" > const namespaceConfig = signer.buildNamespace(wcConfig.networkId);</span>
|
|
2159
|
+
<span class="cstat-no" title="statement not covered" > const optionalNamespaces = { [wcConfig.ledgerId]: namespaceConfig };</span>
|
|
2160
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Namespace config', { ledgerId: wcConfig.ledgerId });</span>
|
|
2161
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2162
|
+
<span class="cstat-no" title="statement not covered" > // Build session properties to pass user's preferred network to wallet</span>
|
|
2163
|
+
<span class="cstat-no" title="statement not covered" > // This tells the wallet which network accounts to show in the picker</span>
|
|
2164
|
+
<span class="cstat-no" title="statement not covered" > const sessionProperties = {</span>
|
|
2165
|
+
<span class="cstat-no" title="statement not covered" > preferredNetwork: wcConfig.networkId,</span>
|
|
2166
|
+
<span class="cstat-no" title="statement not covered" > preferredLedger: wcConfig.ledgerId,</span>
|
|
2167
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2168
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2169
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Connecting with preferred network', {</span>
|
|
2170
|
+
<span class="cstat-no" title="statement not covered" > preferredNetwork: wcConfig.networkId,</span>
|
|
2171
|
+
<span class="cstat-no" title="statement not covered" > preferredLedger: wcConfig.ledgerId,</span>
|
|
2172
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2173
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2174
|
+
<span class="cstat-no" title="statement not covered" > // Connect and show QR code</span>
|
|
2175
|
+
<span class="cstat-no" title="statement not covered" > const { uri, approval } = await this.clientManager.connect(</span>
|
|
2176
|
+
<span class="cstat-no" title="statement not covered" > optionalNamespaces,</span>
|
|
2177
|
+
<span class="cstat-no" title="statement not covered" > sessionProperties,</span>
|
|
2178
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2179
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2180
|
+
<span class="cstat-no" title="statement not covered" > if (uri) {</span>
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" > await modal.openModal({ uri });</span>
|
|
2182
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2183
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2184
|
+
<span class="cstat-no" title="statement not covered" > // Wait for wallet approval</span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Waiting for wallet approval...');</span>
|
|
2186
|
+
<span class="cstat-no" title="statement not covered" > const session = await approval();</span>
|
|
2187
|
+
<span class="cstat-no" title="statement not covered" > this.clientManager.closeModal();</span>
|
|
2188
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2189
|
+
<span class="cstat-no" title="statement not covered" > logger.info('[WC:DAPP:APPROVED] Session approved by wallet', {</span>
|
|
2190
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic.substring(0, 16) + '...',</span>
|
|
2191
|
+
<span class="cstat-no" title="statement not covered" > fullTopic: session.topic,</span>
|
|
2192
|
+
<span class="cstat-no" title="statement not covered" > namespaces: Object.keys(session.namespaces),</span>
|
|
2193
|
+
<span class="cstat-no" title="statement not covered" > expiry: session.expiry,</span>
|
|
2194
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2195
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2196
|
+
<span class="cstat-no" title="statement not covered" > // Generate session key</span>
|
|
2197
|
+
<span class="cstat-no" title="statement not covered" > const sessionKey = this.sessionStore.generateSessionKey(</span>
|
|
2198
|
+
<span class="cstat-no" title="statement not covered" > wcConfig.ledgerId,</span>
|
|
2199
|
+
<span class="cstat-no" title="statement not covered" > wcConfig.networkId,</span>
|
|
2200
|
+
<span class="cstat-no" title="statement not covered" > session.topic,</span>
|
|
2201
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2202
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2203
|
+
<span class="cstat-no" title="statement not covered" > // Parse accounts from session</span>
|
|
2204
|
+
<span class="cstat-no" title="statement not covered" > const sessionNamespace = session.namespaces[wcConfig.ledgerId];</span>
|
|
2205
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Session namespace for ledger', {</span>
|
|
2206
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
|
|
2207
|
+
<span class="cstat-no" title="statement not covered" > accountCount: (sessionNamespace as { accounts?: any[] })?.accounts?.length || 0,</span>
|
|
2208
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2209
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2210
|
+
<span class="cstat-no" title="statement not covered" > if (!sessionNamespace) {</span>
|
|
2211
2211
|
<span class="cstat-no" title="statement not covered" > logger.error('No namespace found for ledger', {</span>
|
|
2212
2212
|
<span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
|
|
2213
2213
|
<span class="cstat-no" title="statement not covered" > availableNamespaces: Object.keys(session.namespaces),</span>
|
|
@@ -2216,16 +2216,16 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2216
2216
|
<span class="cstat-no" title="statement not covered" > `Wallet did not approve ${wcConfig.ledgerId} namespace. Available: ${Object.keys(session.namespaces).join(', ')}`,</span>
|
|
2217
2217
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2218
2218
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2219
|
-
|
|
2220
|
-
// Parse accounts from session namespace, filtering by user's selected network
|
|
2221
|
-
// This ensures we only show accounts that match the network the user selected
|
|
2222
|
-
const parsedAccounts = signer.parseAccounts(sessionNamespace, wcConfig.networkId)
|
|
2223
|
-
logger.debug('Parsed accounts', {
|
|
2224
|
-
count: parsedAccounts.length
|
|
2225
|
-
userSelectedNetwork: wcConfig.networkId
|
|
2226
|
-
})
|
|
2227
|
-
|
|
2228
|
-
|
|
2219
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2220
|
+
<span class="cstat-no" title="statement not covered" > // Parse accounts from session namespace, filtering by user's selected network</span>
|
|
2221
|
+
<span class="cstat-no" title="statement not covered" > // This ensures we only show accounts that match the network the user selected</span>
|
|
2222
|
+
<span class="cstat-no" title="statement not covered" > const parsedAccounts = signer.parseAccounts(sessionNamespace, wcConfig.networkId);</span>
|
|
2223
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Parsed accounts', {</span>
|
|
2224
|
+
<span class="cstat-no" title="statement not covered" > count: parsedAccounts.length,</span>
|
|
2225
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId,</span>
|
|
2226
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2227
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2228
|
+
<span class="cstat-no" title="statement not covered" > if (parsedAccounts.length === 0) {</span>
|
|
2229
2229
|
<span class="cstat-no" title="statement not covered" > logger.warn('No accounts returned from wallet - possible causes:', {</span>
|
|
2230
2230
|
<span class="cstat-no" title="statement not covered" > reason1: 'Wallet has no accounts for the requested network',</span>
|
|
2231
2231
|
<span class="cstat-no" title="statement not covered" > reason2: 'Wallet denied account sharing',</span>
|
|
@@ -2233,98 +2233,98 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2233
2233
|
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId,</span>
|
|
2234
2234
|
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2235
2235
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2236
|
-
|
|
2237
|
-
// Create UnifiedAccount objects
|
|
2238
|
-
// IMPORTANT: Use wcConfig.networkId (user's selection) for account networkId
|
|
2239
|
-
// This respects user intent rather than relying on wallet-reported chain
|
|
2240
|
-
const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) => ({
|
|
2241
|
-
id: `${this.id}-${wcConfig.ledgerId}-${acc.address}
|
|
2242
|
-
address: acc.address
|
|
2243
|
-
label: `Account ${index + 1}
|
|
2244
|
-
ledgerId: wcConfig.ledgerId
|
|
2245
|
-
networkId: wcConfig.networkId, // Use user's selected network, not wallet-reported
|
|
2246
|
-
providerId: this.id
|
|
2247
|
-
providerType: 'walletconnect-v2'
|
|
2248
|
-
metadata: {
|
|
2249
|
-
topic: session.topic
|
|
2250
|
-
ledger: wcConfig.ledgerId
|
|
2251
|
-
sessionKey
|
|
2252
|
-
walletReportedChainId: acc.chainId, // Keep original for debugging
|
|
2253
|
-
userSelectedNetwork: wcConfig.networkId, // Store for session restoration
|
|
2254
|
-
}
|
|
2255
|
-
}))
|
|
2256
|
-
|
|
2257
|
-
// Store session data with user's selected network
|
|
2258
|
-
this.sessionStore.setSession(sessionKey, {
|
|
2259
|
-
session
|
|
2260
|
-
ledgerId: wcConfig.ledgerId
|
|
2261
|
-
networkId: wcConfig.networkId
|
|
2262
|
-
userSelectedNetwork: wcConfig.networkId, // Store user's selection for restoration
|
|
2263
|
-
signer
|
|
2264
|
-
accounts
|
|
2265
|
-
})
|
|
2266
|
-
|
|
2267
|
-
// Persist user's network selection for session restoration after page reload
|
|
2268
|
-
this.storeUserNetworkSelection(session.topic, wcConfig.networkId)
|
|
2269
|
-
|
|
2270
|
-
// Verify session exists in WC SDK after storing
|
|
2271
|
-
const sdkSession = this.clientManager.getSession(session.topic)
|
|
2272
|
-
|
|
2273
|
-
logger.info('[WC:DAPP:STORED] Session stored locally', {
|
|
2274
|
-
sessionKey
|
|
2275
|
-
topic: session.topic.substring(0, 16) + '...'
|
|
2276
|
-
fullTopic: session.topic
|
|
2277
|
-
accountCount: accounts.length
|
|
2278
|
-
totalSessions: this.sessionStore.size
|
|
2279
|
-
existsInSdkSession: !!sdkSession
|
|
2280
|
-
})
|
|
2281
|
-
|
|
2282
|
-
// Update aggregated accounts
|
|
2283
|
-
this.sessionStore.updateAggregatedAccounts()
|
|
2284
|
-
this._status.set('connected')
|
|
2285
|
-
|
|
2286
|
-
// Emit session created event
|
|
2287
|
-
this.eventBus.sessionCreated.emit({
|
|
2288
|
-
providerId: this.id
|
|
2289
|
-
sessionKey
|
|
2290
|
-
accounts
|
|
2291
|
-
metadata: {
|
|
2292
|
-
topic: session.topic
|
|
2293
|
-
ledgerId: wcConfig.ledgerId
|
|
2294
|
-
networkId: wcConfig.networkId
|
|
2295
|
-
}
|
|
2296
|
-
timestamp: Date.now()
|
|
2297
|
-
})
|
|
2298
|
-
|
|
2299
|
-
// Register session_delete listener (idempotent)
|
|
2300
|
-
this.registerSessionDeleteListener()
|
|
2301
|
-
} catch (error) {
|
|
2302
|
-
this._status.set('error')
|
|
2303
|
-
|
|
2304
|
-
logger.error('Connection failed', {
|
|
2305
|
-
|
|
2306
|
-
})
|
|
2307
|
-
|
|
2308
|
-
// Emit provider error event
|
|
2309
|
-
this.eventBus.providerError.emit({
|
|
2310
|
-
providerId: this.id
|
|
2311
|
-
|
|
2312
|
-
context: 'connection'
|
|
2313
|
-
timestamp: Date.now()
|
|
2314
|
-
})
|
|
2315
|
-
|
|
2316
|
-
this.clientManager.closeModal()
|
|
2317
|
-
throw error
|
|
2318
|
-
}
|
|
2319
|
-
}
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
* Remove a session by its WalletConnect topic
|
|
2323
|
-
* Internal helper for session_delete event handling
|
|
2324
|
-
|
|
2325
|
-
* @param topic - WalletConnect session topic
|
|
2326
|
-
|
|
2327
|
-
|
|
2236
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2237
|
+
<span class="cstat-no" title="statement not covered" > // Create UnifiedAccount objects</span>
|
|
2238
|
+
<span class="cstat-no" title="statement not covered" > // IMPORTANT: Use wcConfig.networkId (user's selection) for account networkId</span>
|
|
2239
|
+
<span class="cstat-no" title="statement not covered" > // This respects user intent rather than relying on wallet-reported chain</span>
|
|
2240
|
+
<span class="cstat-no" title="statement not covered" > const accounts: UnifiedAccount[] = parsedAccounts.map((acc, index) => ({</span>
|
|
2241
|
+
<span class="cstat-no" title="statement not covered" > id: `${this.id}-${wcConfig.ledgerId}-${acc.address}`,</span>
|
|
2242
|
+
<span class="cstat-no" title="statement not covered" > address: acc.address,</span>
|
|
2243
|
+
<span class="cstat-no" title="statement not covered" > label: `Account ${index + 1}`,</span>
|
|
2244
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
|
|
2245
|
+
<span class="cstat-no" title="statement not covered" > networkId: wcConfig.networkId, // Use user's selected network, not wallet-reported</span>
|
|
2246
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2247
|
+
<span class="cstat-no" title="statement not covered" > providerType: 'walletconnect-v2',</span>
|
|
2248
|
+
<span class="cstat-no" title="statement not covered" > metadata: {</span>
|
|
2249
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
|
|
2250
|
+
<span class="cstat-no" title="statement not covered" > ledger: wcConfig.ledgerId,</span>
|
|
2251
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2252
|
+
<span class="cstat-no" title="statement not covered" > walletReportedChainId: acc.chainId, // Keep original for debugging</span>
|
|
2253
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId, // Store for session restoration</span>
|
|
2254
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2255
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2256
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2257
|
+
<span class="cstat-no" title="statement not covered" > // Store session data with user's selected network</span>
|
|
2258
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.setSession(sessionKey, {</span>
|
|
2259
|
+
<span class="cstat-no" title="statement not covered" > session,</span>
|
|
2260
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
|
|
2261
|
+
<span class="cstat-no" title="statement not covered" > networkId: wcConfig.networkId,</span>
|
|
2262
|
+
<span class="cstat-no" title="statement not covered" > userSelectedNetwork: wcConfig.networkId, // Store user's selection for restoration</span>
|
|
2263
|
+
<span class="cstat-no" title="statement not covered" > signer,</span>
|
|
2264
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2265
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2266
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2267
|
+
<span class="cstat-no" title="statement not covered" > // Persist user's network selection for session restoration after page reload</span>
|
|
2268
|
+
<span class="cstat-no" title="statement not covered" > this.storeUserNetworkSelection(session.topic, wcConfig.networkId);</span>
|
|
2269
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2270
|
+
<span class="cstat-no" title="statement not covered" > // Verify session exists in WC SDK after storing</span>
|
|
2271
|
+
<span class="cstat-no" title="statement not covered" > const sdkSession = this.clientManager.getSession(session.topic);</span>
|
|
2272
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2273
|
+
<span class="cstat-no" title="statement not covered" > logger.info('[WC:DAPP:STORED] Session stored locally', {</span>
|
|
2274
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2275
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic.substring(0, 16) + '...',</span>
|
|
2276
|
+
<span class="cstat-no" title="statement not covered" > fullTopic: session.topic,</span>
|
|
2277
|
+
<span class="cstat-no" title="statement not covered" > accountCount: accounts.length,</span>
|
|
2278
|
+
<span class="cstat-no" title="statement not covered" > totalSessions: this.sessionStore.size,</span>
|
|
2279
|
+
<span class="cstat-no" title="statement not covered" > existsInSdkSession: !!sdkSession,</span>
|
|
2280
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2281
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2282
|
+
<span class="cstat-no" title="statement not covered" > // Update aggregated accounts</span>
|
|
2283
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.updateAggregatedAccounts();</span>
|
|
2284
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('connected');</span>
|
|
2285
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2286
|
+
<span class="cstat-no" title="statement not covered" > // Emit session created event</span>
|
|
2287
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.sessionCreated.emit({</span>
|
|
2288
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2289
|
+
<span class="cstat-no" title="statement not covered" > sessionKey,</span>
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" > accounts,</span>
|
|
2291
|
+
<span class="cstat-no" title="statement not covered" > metadata: {</span>
|
|
2292
|
+
<span class="cstat-no" title="statement not covered" > topic: session.topic,</span>
|
|
2293
|
+
<span class="cstat-no" title="statement not covered" > ledgerId: wcConfig.ledgerId,</span>
|
|
2294
|
+
<span class="cstat-no" title="statement not covered" > networkId: wcConfig.networkId,</span>
|
|
2295
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2297
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2298
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2299
|
+
<span class="cstat-no" title="statement not covered" > // Register session_delete listener (idempotent)</span>
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" > this.registerSessionDeleteListener();</span>
|
|
2301
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
2302
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('error');</span>
|
|
2303
|
+
<span class="cstat-no" title="statement not covered" > this._error.set(error instanceof Error ? error.message : 'Connection failed');</span>
|
|
2304
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Connection failed', {</span>
|
|
2305
|
+
<span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error.message : String(error),</span>
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2307
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2308
|
+
<span class="cstat-no" title="statement not covered" > // Emit provider error event</span>
|
|
2309
|
+
<span class="cstat-no" title="statement not covered" > this.eventBus.providerError.emit({</span>
|
|
2310
|
+
<span class="cstat-no" title="statement not covered" > providerId: this.id,</span>
|
|
2311
|
+
<span class="cstat-no" title="statement not covered" > error: error instanceof Error ? error : String(error),</span>
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > context: 'connection',</span>
|
|
2313
|
+
<span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
|
|
2314
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2315
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2316
|
+
<span class="cstat-no" title="statement not covered" > this.clientManager.closeModal();</span>
|
|
2317
|
+
<span class="cstat-no" title="statement not covered" > throw error;</span>
|
|
2318
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2319
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2320
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2321
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2322
|
+
<span class="cstat-no" title="statement not covered" > * Remove a session by its WalletConnect topic.</span>
|
|
2323
|
+
<span class="cstat-no" title="statement not covered" > * Internal helper for session_delete event handling.</span>
|
|
2324
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2325
|
+
<span class="cstat-no" title="statement not covered" > * @param topic - WalletConnect session topic</span>
|
|
2326
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2327
|
+
<span class="cstat-no" title="statement not covered" > private removeSessionByTopic(topic: string): void {</span>
|
|
2328
2328
|
<span class="cstat-no" title="statement not covered" > // Find and remove the session using session store</span>
|
|
2329
2329
|
<span class="cstat-no" title="statement not covered" > const removed = this.sessionStore.removeSessionByTopic(topic);</span>
|
|
2330
2330
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -2360,46 +2360,46 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2360
2360
|
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2361
2361
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2362
2362
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
* Register session_delete event listener to handle wallet-initiated disconnects
|
|
2366
|
-
* Idempotent - only registers once even if called multiple times
|
|
2367
|
-
|
|
2368
|
-
* @private
|
|
2369
|
-
|
|
2370
|
-
private registerSessionDeleteListener(): void {
|
|
2371
|
-
if (!this.clientManager.isInitialized() || this.sessionDeleteListenerRegistered) {
|
|
2372
|
-
return
|
|
2373
|
-
}
|
|
2374
|
-
|
|
2375
|
-
// ✅ CRITICAL: Run inside NgZone to trigger Angular's change detection
|
|
2376
|
-
// WalletConnect events arrive outside Angular's zone
|
|
2377
|
-
this.clientManager.on('session_delete', (event: any) => {
|
|
2363
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2364
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2365
|
+
<span class="cstat-no" title="statement not covered" > * Register session_delete event listener to handle wallet-initiated disconnects.</span>
|
|
2366
|
+
<span class="cstat-no" title="statement not covered" > * Idempotent - only registers once even if called multiple times.</span>
|
|
2367
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2368
|
+
<span class="cstat-no" title="statement not covered" > * @private</span>
|
|
2369
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2370
|
+
<span class="cstat-no" title="statement not covered" > private registerSessionDeleteListener(): void {</span>
|
|
2371
|
+
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized() || this.sessionDeleteListenerRegistered) {</span>
|
|
2372
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2373
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2374
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2375
|
+
<span class="cstat-no" title="statement not covered" > // ✅ CRITICAL: Run inside NgZone to trigger Angular's change detection</span>
|
|
2376
|
+
<span class="cstat-no" title="statement not covered" > // WalletConnect events arrive outside Angular's zone</span>
|
|
2377
|
+
<span class="cstat-no" title="statement not covered" > this.clientManager.on('session_delete', (event: any) => {</span>
|
|
2378
2378
|
<span class="cstat-no" title="statement not covered" > this.zone.run(() => {</span>
|
|
2379
2379
|
<span class="cstat-no" title="statement not covered" > logger.info('� Session deleted by wallet (session_delete event)', {</span>
|
|
2380
2380
|
<span class="cstat-no" title="statement not covered" > topic: (event as { topic: string }).topic,</span>
|
|
2381
2381
|
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2382
2382
|
<span class="cstat-no" title="statement not covered" > this.removeSessionByTopic((event as { topic: string }).topic);</span>
|
|
2383
2383
|
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2384
|
-
})
|
|
2385
|
-
|
|
2386
|
-
this.sessionDeleteListenerRegistered = true
|
|
2387
|
-
logger.debug('session_delete listener registered')
|
|
2388
|
-
}
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
* Disconnect from WalletConnect sessions
|
|
2392
|
-
* Supports disconnecting all sessions or a specific session
|
|
2393
|
-
|
|
2394
|
-
* @param sessionKey - Optional session key to disconnect specific session
|
|
2395
|
-
|
|
2396
|
-
async disconnect(sessionKey?: string): Promise<void> {
|
|
2397
|
-
|
|
2384
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2385
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2386
|
+
<span class="cstat-no" title="statement not covered" > this.sessionDeleteListenerRegistered = true;</span>
|
|
2387
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('session_delete listener registered');</span>
|
|
2388
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2389
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2390
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2391
|
+
<span class="cstat-no" title="statement not covered" > * Disconnect from WalletConnect sessions.</span>
|
|
2392
|
+
<span class="cstat-no" title="statement not covered" > * Supports disconnecting all sessions or a specific session.</span>
|
|
2393
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2394
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionKey - Optional session key to disconnect specific session</span>
|
|
2395
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2396
|
+
<span class="cstat-no" title="statement not covered" > async disconnect(sessionKey?: string): Promise<void> {</span>
|
|
2397
|
+
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2398
2398
|
<span class="cstat-no" title="statement not covered" > logger.warn('No client to disconnect');</span>
|
|
2399
2399
|
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2400
2400
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2401
|
-
|
|
2402
|
-
|
|
2401
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2402
|
+
<span class="cstat-no" title="statement not covered" > if (sessionKey) {</span>
|
|
2403
2403
|
<span class="cstat-no" title="statement not covered" > // Disconnect specific session</span>
|
|
2404
2404
|
<span class="cstat-no" title="statement not covered" > const sessionData = this.sessionStore.getSession(sessionKey);</span>
|
|
2405
2405
|
<span class="cstat-no" title="statement not covered" > if (sessionData) {</span>
|
|
@@ -2426,101 +2426,101 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2426
2426
|
<span class="cstat-no" title="statement not covered" > this._status.set('disconnected');</span>
|
|
2427
2427
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2428
2428
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2429
|
-
} else {
|
|
2430
|
-
// Disconnect all sessions
|
|
2431
|
-
const disconnectPromises: Promise<void>[] = []
|
|
2432
|
-
|
|
2433
|
-
for (const [_key, sessionData] of this.sessionStore.entries()) {
|
|
2434
|
-
// Clean up stored network selection for each session
|
|
2435
|
-
this.clearUserNetworkSelection(sessionData.session.topic)
|
|
2436
|
-
|
|
2437
|
-
disconnectPromises.push(
|
|
2438
|
-
this.clientManager
|
|
2439
|
-
.disconnect(sessionData.session.topic, {
|
|
2440
|
-
code: 6000
|
|
2441
|
-
message: 'User disconnected all sessions'
|
|
2442
|
-
})
|
|
2443
|
-
.catch((err: Error) =>
|
|
2429
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2430
|
+
<span class="cstat-no" title="statement not covered" > // Disconnect all sessions</span>
|
|
2431
|
+
<span class="cstat-no" title="statement not covered" > const disconnectPromises: Promise<void>[] = [];</span>
|
|
2432
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2433
|
+
<span class="cstat-no" title="statement not covered" > for (const [_key, sessionData] of this.sessionStore.entries()) {</span>
|
|
2434
|
+
<span class="cstat-no" title="statement not covered" > // Clean up stored network selection for each session</span>
|
|
2435
|
+
<span class="cstat-no" title="statement not covered" > this.clearUserNetworkSelection(sessionData.session.topic);</span>
|
|
2436
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2437
|
+
<span class="cstat-no" title="statement not covered" > disconnectPromises.push(</span>
|
|
2438
|
+
<span class="cstat-no" title="statement not covered" > this.clientManager</span>
|
|
2439
|
+
<span class="cstat-no" title="statement not covered" > .disconnect(sessionData.session.topic, {</span>
|
|
2440
|
+
<span class="cstat-no" title="statement not covered" > code: 6000,</span>
|
|
2441
|
+
<span class="cstat-no" title="statement not covered" > message: 'User disconnected all sessions',</span>
|
|
2442
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
2443
|
+
<span class="cstat-no" title="statement not covered" > .catch((err: Error) =></span>
|
|
2444
2444
|
<span class="cstat-no" title="statement not covered" > logger.error('Disconnect error', {</span>
|
|
2445
2445
|
<span class="cstat-no" title="statement not covered" > error: err.message,</span>
|
|
2446
2446
|
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
2447
|
-
)
|
|
2448
|
-
)
|
|
2449
|
-
}
|
|
2450
|
-
|
|
2451
|
-
await Promise.all(disconnectPromises)
|
|
2452
|
-
|
|
2453
|
-
this.sessionStore.clear()
|
|
2454
|
-
this._status.set('disconnected')
|
|
2455
|
-
|
|
2456
|
-
logger.info('Disconnected all sessions')
|
|
2457
|
-
}
|
|
2458
|
-
|
|
2459
|
-
this.clientManager.closeModal()
|
|
2460
|
-
}
|
|
2461
|
-
|
|
2462
|
-
// NOTE: findSessionForAccount and validateSessionInSdk moved to WalletConnectSigningOrchestrator
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
* Sign a transaction without submitting (delegates to SigningOrchestrator)
|
|
2466
|
-
* @param options
|
|
2467
|
-
|
|
2468
|
-
async signTransaction(options: SignTransactionOptions): Promise<SignResult> {
|
|
2469
|
-
|
|
2447
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
2448
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2449
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2450
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2451
|
+
<span class="cstat-no" title="statement not covered" > await Promise.all(disconnectPromises);</span>
|
|
2452
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2453
|
+
<span class="cstat-no" title="statement not covered" > this.sessionStore.clear();</span>
|
|
2454
|
+
<span class="cstat-no" title="statement not covered" > this._status.set('disconnected');</span>
|
|
2455
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2456
|
+
<span class="cstat-no" title="statement not covered" > logger.info('Disconnected all sessions');</span>
|
|
2457
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2458
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2459
|
+
<span class="cstat-no" title="statement not covered" > this.clientManager.closeModal();</span>
|
|
2460
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2461
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2462
|
+
<span class="cstat-no" title="statement not covered" > // NOTE: findSessionForAccount and validateSessionInSdk moved to WalletConnectSigningOrchestrator</span>
|
|
2463
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2464
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2465
|
+
<span class="cstat-no" title="statement not covered" > * Sign a transaction without submitting (delegates to SigningOrchestrator).</span>
|
|
2466
|
+
<span class="cstat-no" title="statement not covered" > * @param options</span>
|
|
2467
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2468
|
+
<span class="cstat-no" title="statement not covered" > async signTransaction(options: SignTransactionOptions): Promise<SignResult> {</span>
|
|
2469
|
+
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2470
2470
|
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2471
2471
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2472
|
-
return this.signingOrchestrator.signTransaction(options)
|
|
2473
|
-
}
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
* Sign and submit a transaction (delegates to SigningOrchestrator)
|
|
2477
|
-
* @param options
|
|
2478
|
-
|
|
2479
|
-
async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {
|
|
2480
|
-
|
|
2472
|
+
<span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signTransaction(options);</span>
|
|
2473
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2474
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2475
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2476
|
+
<span class="cstat-no" title="statement not covered" > * Sign and submit a transaction (delegates to SigningOrchestrator).</span>
|
|
2477
|
+
<span class="cstat-no" title="statement not covered" > * @param options</span>
|
|
2478
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2479
|
+
<span class="cstat-no" title="statement not covered" > async submitTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {</span>
|
|
2480
|
+
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2481
2481
|
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2482
2482
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2483
|
-
return this.signingOrchestrator.submitTransaction(options)
|
|
2484
|
-
}
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
* Sign and execute transaction in one call (delegates to SigningOrchestrator)
|
|
2488
|
-
* @param options
|
|
2489
|
-
|
|
2490
|
-
<span class="
|
|
2483
|
+
<span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.submitTransaction(options);</span>
|
|
2484
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2485
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2486
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2487
|
+
<span class="cstat-no" title="statement not covered" > * Sign and execute transaction in one call (delegates to SigningOrchestrator).</span>
|
|
2488
|
+
<span class="cstat-no" title="statement not covered" > * @param options</span>
|
|
2489
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2490
|
+
<span class="cstat-no" title="statement not covered" > async signAndExecuteTransaction(options: SubmitTransactionOptions): Promise<SubmitResult> {</span>
|
|
2491
2491
|
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2492
2492
|
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2493
2493
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2494
2494
|
<span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signAndExecuteTransaction(options);</span>
|
|
2495
2495
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
* Sign an arbitrary message (delegates to SigningOrchestrator)
|
|
2499
|
-
* @param options
|
|
2500
|
-
|
|
2501
|
-
<span class="
|
|
2496
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2497
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2498
|
+
<span class="cstat-no" title="statement not covered" > * Sign an arbitrary message (delegates to SigningOrchestrator).</span>
|
|
2499
|
+
<span class="cstat-no" title="statement not covered" > * @param options</span>
|
|
2500
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2501
|
+
<span class="cstat-no" title="statement not covered" > async signMessage(options: SignMessageOptions): Promise<SignMessageResult> {</span>
|
|
2502
2502
|
<span class="cstat-no" title="statement not covered" > if (!this.clientManager.isInitialized()) {</span>
|
|
2503
2503
|
<span class="cstat-no" title="statement not covered" > throw new Error('Not connected to WalletConnect');</span>
|
|
2504
2504
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2505
2505
|
<span class="cstat-no" title="statement not covered" > return this.signingOrchestrator.signMessage(options);</span>
|
|
2506
2506
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
* Check if WalletConnect is available
|
|
2510
|
-
* Always returns true as WalletConnect is browser-based
|
|
2511
|
-
|
|
2512
|
-
<span class="
|
|
2507
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2508
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2509
|
+
<span class="cstat-no" title="statement not covered" > * Check if WalletConnect is available.</span>
|
|
2510
|
+
<span class="cstat-no" title="statement not covered" > * Always returns true as WalletConnect is browser-based.</span>
|
|
2511
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2512
|
+
<span class="cstat-no" title="statement not covered" > async isAvailable(): Promise<boolean> {</span>
|
|
2513
2513
|
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
2514
2514
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
* Get all active WalletConnect sessions
|
|
2518
|
-
* Useful for displaying session information in UI and managing multiple connections
|
|
2519
|
-
* Delegates to session store
|
|
2520
|
-
|
|
2521
|
-
* @returns Array of session information objects
|
|
2522
|
-
|
|
2523
|
-
<span class="
|
|
2515
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2516
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2517
|
+
<span class="cstat-no" title="statement not covered" > * Get all active WalletConnect sessions.</span>
|
|
2518
|
+
<span class="cstat-no" title="statement not covered" > * Useful for displaying session information in UI and managing multiple connections.</span>
|
|
2519
|
+
<span class="cstat-no" title="statement not covered" > * Delegates to session store.</span>
|
|
2520
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2521
|
+
<span class="cstat-no" title="statement not covered" > * @returns Array of session information objects</span>
|
|
2522
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2523
|
+
<span class="cstat-no" title="statement not covered" > getActiveSessions(): Array<{</span>
|
|
2524
2524
|
<span class="cstat-no" title="statement not covered" > sessionKey: string;</span>
|
|
2525
2525
|
<span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
|
|
2526
2526
|
<span class="cstat-no" title="statement not covered" > networkId: string;</span>
|
|
@@ -2530,17 +2530,17 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2530
2530
|
<span class="cstat-no" title="statement not covered" > }> {</span>
|
|
2531
2531
|
<span class="cstat-no" title="statement not covered" > return this.sessionStore.getActiveSessions();</span>
|
|
2532
2532
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
* Disconnect a specific session by session key
|
|
2536
|
-
* Public wrapper for the private disconnect method
|
|
2537
|
-
|
|
2538
|
-
* @param sessionKey - The session key to disconnect
|
|
2539
|
-
|
|
2540
|
-
<span class="
|
|
2533
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2534
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2535
|
+
<span class="cstat-no" title="statement not covered" > * Disconnect a specific session by session key.</span>
|
|
2536
|
+
<span class="cstat-no" title="statement not covered" > * Public wrapper for the private disconnect method.</span>
|
|
2537
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2538
|
+
<span class="cstat-no" title="statement not covered" > * @param sessionKey - The session key to disconnect</span>
|
|
2539
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2540
|
+
<span class="cstat-no" title="statement not covered" > async disconnectSession(sessionKey: string): Promise<void> {</span>
|
|
2541
2541
|
<span class="cstat-no" title="statement not covered" > await this.disconnect(sessionKey);</span>
|
|
2542
2542
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2543
|
-
}
|
|
2543
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2544
2544
|
</pre></td></tr></table></pre>
|
|
2545
2545
|
|
|
2546
2546
|
<div class='push'></div><!-- for sticky footer -->
|
|
@@ -2548,7 +2548,7 @@ export class WalletConnectV2Provider extends BaseWalletProvider {
|
|
|
2548
2548
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
2549
2549
|
Code coverage generated by
|
|
2550
2550
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2551
|
-
at 2026-06-
|
|
2551
|
+
at 2026-06-10T09:00:36.812Z
|
|
2552
2552
|
</div>
|
|
2553
2553
|
<script src="../../../../prettify.js"></script>
|
|
2554
2554
|
<script>
|