@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.
Files changed (162) hide show
  1. package/coverage/coverage-summary.json +49 -49
  2. package/coverage/index.html +122 -122
  3. package/coverage/lcov-report/index.html +122 -122
  4. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  5. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +1 -1
  6. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  7. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +1 -1
  8. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  9. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  10. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  11. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +1 -1
  12. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1 -1
  13. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1 -1
  14. package/coverage/lcov-report/lib/components/account-selector/index.html +1 -1
  15. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +1 -1
  16. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  17. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +21 -21
  18. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  19. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +1 -1
  20. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  21. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +1 -1
  22. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  23. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  24. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  25. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +21 -21
  26. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  27. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  28. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  29. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +1 -1
  30. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  31. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +1 -1
  32. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  33. package/coverage/lcov-report/lib/directives/index.html +1 -1
  34. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +1 -1
  35. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +1 -1
  36. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +1 -1
  37. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +1 -1
  38. package/coverage/lcov-report/lib/index.html +1 -1
  39. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +1 -1
  40. package/coverage/lcov-report/lib/models/index.html +1 -1
  41. package/coverage/lcov-report/lib/models/provider-types.ts.html +1 -1
  42. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +20 -20
  43. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  44. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +19 -19
  45. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +1 -1
  46. package/coverage/lcov-report/lib/providers/index.html +18 -18
  47. package/coverage/lcov-report/lib/providers/p2p-native/index.html +20 -20
  48. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  49. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  50. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1 -1
  51. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +65 -65
  52. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  53. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  54. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  55. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  56. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  57. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  58. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +43 -43
  59. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  60. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  61. package/coverage/lcov-report/lib/services/index.html +31 -31
  62. package/coverage/lcov-report/lib/services/logger.service.ts.html +4 -4
  63. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  64. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  65. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  66. package/coverage/lcov-report/lib/services/transaction-builders/index.html +43 -43
  67. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  68. package/coverage/lcov-report/lib/services/transaction.service.ts.html +4 -7
  69. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +7 -10
  70. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +1 -1
  71. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +249 -249
  72. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +4 -7
  73. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +1 -1
  74. package/coverage/lcov-report/lib/transports/index.html +1 -1
  75. package/coverage/lcov-report/lib/utils/index.html +1 -1
  76. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +1 -1
  77. package/coverage/lcov.info +14420 -14977
  78. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +1 -1
  79. package/coverage/lib/components/account-selector/account-actions/index.html +1 -1
  80. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1 -1
  81. package/coverage/lib/components/account-selector/account-filter/index.html +1 -1
  82. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +1 -1
  83. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +1 -1
  84. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1 -1
  85. package/coverage/lib/components/account-selector/account-list/index.html +1 -1
  86. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1 -1
  87. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1 -1
  88. package/coverage/lib/components/account-selector/index.html +1 -1
  89. package/coverage/lib/components/wallet-account-display/index.html +1 -1
  90. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +1 -1
  91. package/coverage/lib/components/wallet-connect-button/index.html +21 -21
  92. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +475 -451
  93. package/coverage/lib/components/wallet-connect-prompt/index.html +1 -1
  94. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +1 -1
  95. package/coverage/lib/components/wallet-connected-guard/index.html +1 -1
  96. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +1 -1
  97. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +148 -148
  98. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +17 -17
  99. package/coverage/lib/components/wallet-connection-modal/index.html +21 -21
  100. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +17 -17
  101. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +838 -838
  102. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +1182 -987
  103. package/coverage/lib/components/wallet-session-display/index.html +1 -1
  104. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +1 -1
  105. package/coverage/lib/components/wallet-transaction-status/index.html +1 -1
  106. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +1 -1
  107. package/coverage/lib/directives/index.html +1 -1
  108. package/coverage/lib/directives/wallet-connected.directive.ts.html +1 -1
  109. package/coverage/lib/directives/wallet-context.directive.ts.html +1 -1
  110. package/coverage/lib/directives/wallet-events.directive.ts.html +1 -1
  111. package/coverage/lib/hsuite-wallet.module.ts.html +1 -1
  112. package/coverage/lib/index.html +1 -1
  113. package/coverage/lib/models/connection-config.model.ts.html +1 -1
  114. package/coverage/lib/models/index.html +1 -1
  115. package/coverage/lib/models/provider-types.ts.html +1 -1
  116. package/coverage/lib/providers/base-wallet-provider.ts.html +20 -20
  117. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +637 -637
  118. package/coverage/lib/providers/hsuite-native/index.html +19 -19
  119. package/coverage/lib/providers/hsuite-native-provider.ts.html +1 -1
  120. package/coverage/lib/providers/index.html +18 -18
  121. package/coverage/lib/providers/p2p-native/index.html +20 -20
  122. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +993 -993
  123. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +1 -1
  124. package/coverage/lib/providers/wallet-error-handler.ts.html +1 -1
  125. package/coverage/lib/providers/walletconnect/core/index.html +65 -65
  126. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +240 -240
  127. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +559 -559
  128. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +1104 -1104
  129. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +493 -493
  130. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +366 -366
  131. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +730 -730
  132. package/coverage/lib/providers/walletconnect/signers/index.html +43 -43
  133. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +234 -234
  134. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +650 -650
  135. package/coverage/lib/services/index.html +31 -31
  136. package/coverage/lib/services/logger.service.ts.html +4 -4
  137. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1 -1
  138. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +155 -155
  139. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +2156 -2156
  140. package/coverage/lib/services/transaction-builders/index.html +43 -43
  141. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +1674 -1674
  142. package/coverage/lib/services/transaction.service.ts.html +4 -7
  143. package/coverage/lib/services/unified-wallet.service.ts.html +7 -10
  144. package/coverage/lib/services/wallet-context.service.ts.html +1 -1
  145. package/coverage/lib/services/wallet-event-bus.service.ts.html +249 -249
  146. package/coverage/lib/services/wallet-providers.service.ts.html +4 -7
  147. package/coverage/lib/transports/chrome-extension-transport.ts.html +1 -1
  148. package/coverage/lib/transports/index.html +1 -1
  149. package/coverage/lib/utils/index.html +1 -1
  150. package/coverage/lib/utils/ledger-icons.util.ts.html +1 -1
  151. package/dist/fesm2022/hsuite-native-connect-angular.mjs +85 -20
  152. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -1
  153. package/dist/index.d.ts +33 -3
  154. package/package.json +4 -4
  155. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.spec.ts +89 -0
  156. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +8 -0
  157. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +1 -6
  158. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.spec.ts +173 -0
  159. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +84 -19
  160. package/src/lib/services/transaction.service.ts +0 -1
  161. package/src/lib/services/unified-wallet.service.ts +0 -1
  162. package/src/lib/services/wallet-providers.service.ts +0 -1
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">56.53% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/734</span>
28
+ <span class='fraction'>415/734</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>0/0</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">56.53% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/734</span>
49
+ <span class='fraction'>415/734</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 low'></div>
64
+ <div class='status-line medium'></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>
@@ -797,247 +797,421 @@
797
797
  <a name='L732'></a><a href='#L732'>732</a>
798
798
  <a name='L733'></a><a href='#L733'>733</a>
799
799
  <a name='L734'></a><a href='#L734'>734</a>
800
- <a name='L735'></a><a href='#L735'>735</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-no">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-no">&nbsp;</span>
804
- <span class="cline-any cline-no">&nbsp;</span>
805
- <span class="cline-any cline-no">&nbsp;</span>
806
- <span class="cline-any cline-no">&nbsp;</span>
807
- <span class="cline-any cline-no">&nbsp;</span>
808
- <span class="cline-any cline-no">&nbsp;</span>
809
- <span class="cline-any cline-no">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-no">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-no">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</span>
817
- <span class="cline-any cline-no">&nbsp;</span>
818
- <span class="cline-any cline-no">&nbsp;</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
- <span class="cline-any cline-no">&nbsp;</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
823
- <span class="cline-any cline-no">&nbsp;</span>
824
- <span class="cline-any cline-no">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-no">&nbsp;</span>
827
- <span class="cline-any cline-no">&nbsp;</span>
828
- <span class="cline-any cline-no">&nbsp;</span>
829
- <span class="cline-any cline-no">&nbsp;</span>
830
- <span class="cline-any cline-no">&nbsp;</span>
831
- <span class="cline-any cline-no">&nbsp;</span>
832
- <span class="cline-any cline-no">&nbsp;</span>
833
- <span class="cline-any cline-no">&nbsp;</span>
834
- <span class="cline-any cline-no">&nbsp;</span>
835
- <span class="cline-any cline-no">&nbsp;</span>
836
- <span class="cline-any cline-no">&nbsp;</span>
837
- <span class="cline-any cline-no">&nbsp;</span>
838
- <span class="cline-any cline-no">&nbsp;</span>
839
- <span class="cline-any cline-no">&nbsp;</span>
840
- <span class="cline-any cline-no">&nbsp;</span>
841
- <span class="cline-any cline-no">&nbsp;</span>
842
- <span class="cline-any cline-no">&nbsp;</span>
843
- <span class="cline-any cline-no">&nbsp;</span>
844
- <span class="cline-any cline-no">&nbsp;</span>
845
- <span class="cline-any cline-no">&nbsp;</span>
846
- <span class="cline-any cline-no">&nbsp;</span>
847
- <span class="cline-any cline-no">&nbsp;</span>
848
- <span class="cline-any cline-no">&nbsp;</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-no">&nbsp;</span>
852
- <span class="cline-any cline-no">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-no">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</span>
864
- <span class="cline-any cline-no">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-no">&nbsp;</span>
867
- <span class="cline-any cline-no">&nbsp;</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-no">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-no">&nbsp;</span>
872
- <span class="cline-any cline-no">&nbsp;</span>
873
- <span class="cline-any cline-no">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-no">&nbsp;</span>
877
- <span class="cline-any cline-no">&nbsp;</span>
878
- <span class="cline-any cline-no">&nbsp;</span>
879
- <span class="cline-any cline-no">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-no">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-no">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-no">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-no">&nbsp;</span>
895
- <span class="cline-any cline-no">&nbsp;</span>
896
- <span class="cline-any cline-no">&nbsp;</span>
897
- <span class="cline-any cline-no">&nbsp;</span>
898
- <span class="cline-any cline-no">&nbsp;</span>
899
- <span class="cline-any cline-no">&nbsp;</span>
900
- <span class="cline-any cline-no">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-no">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-no">&nbsp;</span>
905
- <span class="cline-any cline-no">&nbsp;</span>
906
- <span class="cline-any cline-no">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-no">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-no">&nbsp;</span>
912
- <span class="cline-any cline-no">&nbsp;</span>
913
- <span class="cline-any cline-no">&nbsp;</span>
914
- <span class="cline-any cline-no">&nbsp;</span>
915
- <span class="cline-any cline-no">&nbsp;</span>
916
- <span class="cline-any cline-no">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-no">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-no">&nbsp;</span>
921
- <span class="cline-any cline-no">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
- <span class="cline-any cline-no">&nbsp;</span>
924
- <span class="cline-any cline-no">&nbsp;</span>
925
- <span class="cline-any cline-no">&nbsp;</span>
926
- <span class="cline-any cline-no">&nbsp;</span>
927
- <span class="cline-any cline-no">&nbsp;</span>
928
- <span class="cline-any cline-no">&nbsp;</span>
929
- <span class="cline-any cline-no">&nbsp;</span>
930
- <span class="cline-any cline-no">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-no">&nbsp;</span>
935
- <span class="cline-any cline-no">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-no">&nbsp;</span>
938
- <span class="cline-any cline-no">&nbsp;</span>
939
- <span class="cline-any cline-no">&nbsp;</span>
940
- <span class="cline-any cline-no">&nbsp;</span>
941
- <span class="cline-any cline-no">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-no">&nbsp;</span>
944
- <span class="cline-any cline-no">&nbsp;</span>
945
- <span class="cline-any cline-no">&nbsp;</span>
946
- <span class="cline-any cline-no">&nbsp;</span>
947
- <span class="cline-any cline-no">&nbsp;</span>
948
- <span class="cline-any cline-no">&nbsp;</span>
949
- <span class="cline-any cline-no">&nbsp;</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&nbsp;</span>
956
- <span class="cline-any cline-no">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-no">&nbsp;</span>
960
- <span class="cline-any cline-no">&nbsp;</span>
961
- <span class="cline-any cline-no">&nbsp;</span>
962
- <span class="cline-any cline-no">&nbsp;</span>
963
- <span class="cline-any cline-no">&nbsp;</span>
964
- <span class="cline-any cline-no">&nbsp;</span>
965
- <span class="cline-any cline-no">&nbsp;</span>
966
- <span class="cline-any cline-no">&nbsp;</span>
967
- <span class="cline-any cline-no">&nbsp;</span>
968
- <span class="cline-any cline-no">&nbsp;</span>
969
- <span class="cline-any cline-no">&nbsp;</span>
970
- <span class="cline-any cline-no">&nbsp;</span>
971
- <span class="cline-any cline-no">&nbsp;</span>
972
- <span class="cline-any cline-no">&nbsp;</span>
973
- <span class="cline-any cline-no">&nbsp;</span>
974
- <span class="cline-any cline-no">&nbsp;</span>
975
- <span class="cline-any cline-no">&nbsp;</span>
976
- <span class="cline-any cline-no">&nbsp;</span>
977
- <span class="cline-any cline-no">&nbsp;</span>
978
- <span class="cline-any cline-no">&nbsp;</span>
979
- <span class="cline-any cline-no">&nbsp;</span>
980
- <span class="cline-any cline-no">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-no">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-no">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-no">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-no">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-no">&nbsp;</span>
994
- <span class="cline-any cline-no">&nbsp;</span>
995
- <span class="cline-any cline-no">&nbsp;</span>
996
- <span class="cline-any cline-no">&nbsp;</span>
997
- <span class="cline-any cline-no">&nbsp;</span>
998
- <span class="cline-any cline-no">&nbsp;</span>
999
- <span class="cline-any cline-no">&nbsp;</span>
1000
- <span class="cline-any cline-no">&nbsp;</span>
1001
- <span class="cline-any cline-no">&nbsp;</span>
1002
- <span class="cline-any cline-no">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-no">&nbsp;</span>
1005
- <span class="cline-any cline-no">&nbsp;</span>
1006
- <span class="cline-any cline-no">&nbsp;</span>
1007
- <span class="cline-any cline-no">&nbsp;</span>
1008
- <span class="cline-any cline-no">&nbsp;</span>
1009
- <span class="cline-any cline-no">&nbsp;</span>
1010
- <span class="cline-any cline-no">&nbsp;</span>
1011
- <span class="cline-any cline-no">&nbsp;</span>
1012
- <span class="cline-any cline-no">&nbsp;</span>
1013
- <span class="cline-any cline-no">&nbsp;</span>
1014
- <span class="cline-any cline-no">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-no">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-no">&nbsp;</span>
1019
- <span class="cline-any cline-no">&nbsp;</span>
1020
- <span class="cline-any cline-no">&nbsp;</span>
1021
- <span class="cline-any cline-no">&nbsp;</span>
1022
- <span class="cline-any cline-no">&nbsp;</span>
1023
- <span class="cline-any cline-no">&nbsp;</span>
1024
- <span class="cline-any cline-no">&nbsp;</span>
1025
- <span class="cline-any cline-no">&nbsp;</span>
1026
- <span class="cline-any cline-no">&nbsp;</span>
1027
- <span class="cline-any cline-no">&nbsp;</span>
1028
- <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-no">&nbsp;</span>
1031
- <span class="cline-any cline-no">&nbsp;</span>
1032
- <span class="cline-any cline-no">&nbsp;</span>
1033
- <span class="cline-any cline-no">&nbsp;</span>
1034
- <span class="cline-any cline-no">&nbsp;</span>
1035
- <span class="cline-any cline-no">&nbsp;</span>
1036
- <span class="cline-any cline-no">&nbsp;</span>
1037
- <span class="cline-any cline-no">&nbsp;</span>
1038
- <span class="cline-any cline-no">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-no">&nbsp;</span>
800
+ <a name='L735'></a><a href='#L735'>735</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
801
+ <span class="cline-any cline-yes">1x</span>
802
+ <span class="cline-any cline-yes">1x</span>
803
+ <span class="cline-any cline-yes">1x</span>
804
+ <span class="cline-any cline-yes">1x</span>
805
+ <span class="cline-any cline-yes">1x</span>
806
+ <span class="cline-any cline-yes">1x</span>
807
+ <span class="cline-any cline-yes">1x</span>
808
+ <span class="cline-any cline-yes">1x</span>
809
+ <span class="cline-any cline-yes">1x</span>
810
+ <span class="cline-any cline-yes">1x</span>
811
+ <span class="cline-any cline-yes">1x</span>
812
+ <span class="cline-any cline-yes">1x</span>
813
+ <span class="cline-any cline-yes">1x</span>
814
+ <span class="cline-any cline-yes">1x</span>
815
+ <span class="cline-any cline-yes">1x</span>
816
+ <span class="cline-any cline-yes">1x</span>
817
+ <span class="cline-any cline-yes">1x</span>
818
+ <span class="cline-any cline-yes">1x</span>
819
+ <span class="cline-any cline-yes">1x</span>
820
+ <span class="cline-any cline-yes">1x</span>
821
+ <span class="cline-any cline-yes">1x</span>
822
+ <span class="cline-any cline-yes">1x</span>
823
+ <span class="cline-any cline-yes">1x</span>
824
+ <span class="cline-any cline-yes">1x</span>
825
+ <span class="cline-any cline-yes">1x</span>
826
+ <span class="cline-any cline-yes">1x</span>
827
+ <span class="cline-any cline-yes">1x</span>
828
+ <span class="cline-any cline-yes">1x</span>
829
+ <span class="cline-any cline-yes">1x</span>
830
+ <span class="cline-any cline-yes">1x</span>
831
+ <span class="cline-any cline-yes">1x</span>
832
+ <span class="cline-any cline-yes">1x</span>
833
+ <span class="cline-any cline-yes">1x</span>
834
+ <span class="cline-any cline-yes">1x</span>
835
+ <span class="cline-any cline-yes">1x</span>
836
+ <span class="cline-any cline-yes">1x</span>
837
+ <span class="cline-any cline-yes">1x</span>
838
+ <span class="cline-any cline-yes">1x</span>
839
+ <span class="cline-any cline-yes">1x</span>
840
+ <span class="cline-any cline-yes">1x</span>
841
+ <span class="cline-any cline-yes">1x</span>
842
+ <span class="cline-any cline-yes">1x</span>
843
+ <span class="cline-any cline-yes">1x</span>
844
+ <span class="cline-any cline-yes">1x</span>
845
+ <span class="cline-any cline-yes">1x</span>
846
+ <span class="cline-any cline-yes">1x</span>
847
+ <span class="cline-any cline-yes">1x</span>
848
+ <span class="cline-any cline-yes">1x</span>
849
+ <span class="cline-any cline-yes">1x</span>
850
+ <span class="cline-any cline-yes">1x</span>
851
+ <span class="cline-any cline-yes">1x</span>
852
+ <span class="cline-any cline-yes">1x</span>
853
+ <span class="cline-any cline-yes">1x</span>
854
+ <span class="cline-any cline-yes">1x</span>
855
+ <span class="cline-any cline-yes">1x</span>
856
+ <span class="cline-any cline-yes">1x</span>
857
+ <span class="cline-any cline-yes">1x</span>
858
+ <span class="cline-any cline-yes">1x</span>
859
+ <span class="cline-any cline-yes">1x</span>
860
+ <span class="cline-any cline-yes">1x</span>
861
+ <span class="cline-any cline-yes">1x</span>
862
+ <span class="cline-any cline-yes">1x</span>
863
+ <span class="cline-any cline-yes">1x</span>
864
+ <span class="cline-any cline-yes">1x</span>
865
+ <span class="cline-any cline-yes">1x</span>
866
+ <span class="cline-any cline-yes">1x</span>
867
+ <span class="cline-any cline-yes">1x</span>
868
+ <span class="cline-any cline-yes">1x</span>
869
+ <span class="cline-any cline-yes">1x</span>
870
+ <span class="cline-any cline-yes">1x</span>
871
+ <span class="cline-any cline-yes">1x</span>
872
+ <span class="cline-any cline-yes">1x</span>
873
+ <span class="cline-any cline-yes">1x</span>
874
+ <span class="cline-any cline-yes">1x</span>
875
+ <span class="cline-any cline-yes">1x</span>
876
+ <span class="cline-any cline-yes">1x</span>
877
+ <span class="cline-any cline-yes">1x</span>
878
+ <span class="cline-any cline-yes">1x</span>
879
+ <span class="cline-any cline-yes">1x</span>
880
+ <span class="cline-any cline-yes">1x</span>
881
+ <span class="cline-any cline-yes">1x</span>
882
+ <span class="cline-any cline-yes">1x</span>
883
+ <span class="cline-any cline-yes">1x</span>
884
+ <span class="cline-any cline-yes">1x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">1x</span>
887
+ <span class="cline-any cline-yes">1x</span>
888
+ <span class="cline-any cline-yes">1x</span>
889
+ <span class="cline-any cline-yes">1x</span>
890
+ <span class="cline-any cline-yes">1x</span>
891
+ <span class="cline-any cline-yes">1x</span>
892
+ <span class="cline-any cline-yes">1x</span>
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">1x</span>
971
+ <span class="cline-any cline-yes">1x</span>
972
+ <span class="cline-any cline-yes">1x</span>
973
+ <span class="cline-any cline-yes">1x</span>
974
+ <span class="cline-any cline-yes">1x</span>
975
+ <span class="cline-any cline-yes">1x</span>
976
+ <span class="cline-any cline-yes">1x</span>
977
+ <span class="cline-any cline-yes">1x</span>
978
+ <span class="cline-any cline-yes">1x</span>
979
+ <span class="cline-any cline-yes">1x</span>
980
+ <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-yes">1x</span>
983
+ <span class="cline-any cline-yes">1x</span>
984
+ <span class="cline-any cline-yes">1x</span>
985
+ <span class="cline-any cline-yes">1x</span>
986
+ <span class="cline-any cline-yes">1x</span>
987
+ <span class="cline-any cline-yes">1x</span>
988
+ <span class="cline-any cline-yes">1x</span>
989
+ <span class="cline-any cline-yes">1x</span>
990
+ <span class="cline-any cline-yes">1x</span>
991
+ <span class="cline-any cline-yes">1x</span>
992
+ <span class="cline-any cline-yes">1x</span>
993
+ <span class="cline-any cline-yes">1x</span>
994
+ <span class="cline-any cline-yes">1x</span>
995
+ <span class="cline-any cline-yes">1x</span>
996
+ <span class="cline-any cline-yes">1x</span>
997
+ <span class="cline-any cline-yes">1x</span>
998
+ <span class="cline-any cline-yes">1x</span>
999
+ <span class="cline-any cline-yes">1x</span>
1000
+ <span class="cline-any cline-yes">1x</span>
1001
+ <span class="cline-any cline-yes">1x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-yes">1x</span>
1004
+ <span class="cline-any cline-yes">1x</span>
1005
+ <span class="cline-any cline-yes">1x</span>
1006
+ <span class="cline-any cline-yes">1x</span>
1007
+ <span class="cline-any cline-yes">1x</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-yes">1x</span>
1010
+ <span class="cline-any cline-yes">1x</span>
1011
+ <span class="cline-any cline-yes">1x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-yes">1x</span>
1017
+ <span class="cline-any cline-yes">1x</span>
1018
+ <span class="cline-any cline-yes">1x</span>
1019
+ <span class="cline-any cline-yes">1x</span>
1020
+ <span class="cline-any cline-yes">1x</span>
1021
+ <span class="cline-any cline-yes">1x</span>
1022
+ <span class="cline-any cline-yes">1x</span>
1023
+ <span class="cline-any cline-yes">1x</span>
1024
+ <span class="cline-any cline-yes">1x</span>
1025
+ <span class="cline-any cline-yes">1x</span>
1026
+ <span class="cline-any cline-yes">1x</span>
1027
+ <span class="cline-any cline-yes">1x</span>
1028
+ <span class="cline-any cline-yes">1x</span>
1029
+ <span class="cline-any cline-yes">1x</span>
1030
+ <span class="cline-any cline-yes">1x</span>
1031
+ <span class="cline-any cline-yes">1x</span>
1032
+ <span class="cline-any cline-yes">1x</span>
1033
+ <span class="cline-any cline-yes">1x</span>
1034
+ <span class="cline-any cline-yes">1x</span>
1035
+ <span class="cline-any cline-yes">1x</span>
1036
+ <span class="cline-any cline-yes">1x</span>
1037
+ <span class="cline-any cline-yes">1x</span>
1038
+ <span class="cline-any cline-yes">1x</span>
1039
+ <span class="cline-any cline-yes">1x</span>
1040
+ <span class="cline-any cline-yes">1x</span>
1041
+ <span class="cline-any cline-yes">1x</span>
1042
+ <span class="cline-any cline-yes">1x</span>
1043
+ <span class="cline-any cline-yes">1x</span>
1044
+ <span class="cline-any cline-yes">1x</span>
1045
+ <span class="cline-any cline-yes">1x</span>
1046
+ <span class="cline-any cline-yes">1x</span>
1047
+ <span class="cline-any cline-yes">1x</span>
1048
+ <span class="cline-any cline-yes">1x</span>
1049
+ <span class="cline-any cline-yes">1x</span>
1050
+ <span class="cline-any cline-yes">1x</span>
1051
+ <span class="cline-any cline-yes">1x</span>
1052
+ <span class="cline-any cline-yes">1x</span>
1053
+ <span class="cline-any cline-yes">1x</span>
1054
+ <span class="cline-any cline-yes">1x</span>
1055
+ <span class="cline-any cline-yes">1x</span>
1056
+ <span class="cline-any cline-yes">1x</span>
1057
+ <span class="cline-any cline-yes">1x</span>
1058
+ <span class="cline-any cline-yes">1x</span>
1059
+ <span class="cline-any cline-yes">1x</span>
1060
+ <span class="cline-any cline-yes">1x</span>
1061
+ <span class="cline-any cline-yes">1x</span>
1062
+ <span class="cline-any cline-yes">1x</span>
1063
+ <span class="cline-any cline-yes">1x</span>
1064
+ <span class="cline-any cline-yes">1x</span>
1065
+ <span class="cline-any cline-yes">1x</span>
1066
+ <span class="cline-any cline-yes">1x</span>
1067
+ <span class="cline-any cline-yes">1x</span>
1068
+ <span class="cline-any cline-yes">1x</span>
1069
+ <span class="cline-any cline-yes">1x</span>
1070
+ <span class="cline-any cline-yes">1x</span>
1071
+ <span class="cline-any cline-yes">1x</span>
1072
+ <span class="cline-any cline-yes">1x</span>
1073
+ <span class="cline-any cline-yes">1x</span>
1074
+ <span class="cline-any cline-yes">1x</span>
1075
+ <span class="cline-any cline-yes">1x</span>
1076
+ <span class="cline-any cline-yes">1x</span>
1077
+ <span class="cline-any cline-yes">1x</span>
1078
+ <span class="cline-any cline-yes">1x</span>
1079
+ <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-yes">1x</span>
1082
+ <span class="cline-any cline-yes">1x</span>
1083
+ <span class="cline-any cline-yes">1x</span>
1084
+ <span class="cline-any cline-yes">1x</span>
1085
+ <span class="cline-any cline-yes">1x</span>
1086
+ <span class="cline-any cline-yes">1x</span>
1087
+ <span class="cline-any cline-yes">1x</span>
1088
+ <span class="cline-any cline-yes">1x</span>
1089
+ <span class="cline-any cline-yes">1x</span>
1090
+ <span class="cline-any cline-yes">1x</span>
1091
+ <span class="cline-any cline-yes">1x</span>
1092
+ <span class="cline-any cline-yes">1x</span>
1093
+ <span class="cline-any cline-yes">1x</span>
1094
+ <span class="cline-any cline-yes">1x</span>
1095
+ <span class="cline-any cline-yes">1x</span>
1096
+ <span class="cline-any cline-yes">1x</span>
1097
+ <span class="cline-any cline-yes">1x</span>
1098
+ <span class="cline-any cline-yes">1x</span>
1099
+ <span class="cline-any cline-yes">1x</span>
1100
+ <span class="cline-any cline-yes">1x</span>
1101
+ <span class="cline-any cline-yes">1x</span>
1102
+ <span class="cline-any cline-yes">1x</span>
1103
+ <span class="cline-any cline-yes">1x</span>
1104
+ <span class="cline-any cline-yes">1x</span>
1105
+ <span class="cline-any cline-yes">1x</span>
1106
+ <span class="cline-any cline-yes">1x</span>
1107
+ <span class="cline-any cline-yes">1x</span>
1108
+ <span class="cline-any cline-yes">1x</span>
1109
+ <span class="cline-any cline-yes">1x</span>
1110
+ <span class="cline-any cline-yes">1x</span>
1111
+ <span class="cline-any cline-yes">1x</span>
1112
+ <span class="cline-any cline-yes">1x</span>
1113
+ <span class="cline-any cline-yes">1x</span>
1114
+ <span class="cline-any cline-yes">1x</span>
1115
+ <span class="cline-any cline-yes">1x</span>
1116
+ <span class="cline-any cline-yes">1x</span>
1117
+ <span class="cline-any cline-yes">1x</span>
1118
+ <span class="cline-any cline-yes">1x</span>
1119
+ <span class="cline-any cline-yes">1x</span>
1120
+ <span class="cline-any cline-yes">1x</span>
1121
+ <span class="cline-any cline-yes">1x</span>
1122
+ <span class="cline-any cline-yes">1x</span>
1123
+ <span class="cline-any cline-yes">1x</span>
1124
+ <span class="cline-any cline-yes">1x</span>
1125
+ <span class="cline-any cline-yes">1x</span>
1126
+ <span class="cline-any cline-yes">1x</span>
1127
+ <span class="cline-any cline-yes">1x</span>
1128
+ <span class="cline-any cline-yes">1x</span>
1129
+ <span class="cline-any cline-yes">1x</span>
1130
+ <span class="cline-any cline-yes">1x</span>
1131
+ <span class="cline-any cline-yes">1x</span>
1132
+ <span class="cline-any cline-yes">1x</span>
1133
+ <span class="cline-any cline-yes">1x</span>
1134
+ <span class="cline-any cline-yes">1x</span>
1135
+ <span class="cline-any cline-yes">1x</span>
1136
+ <span class="cline-any cline-yes">1x</span>
1137
+ <span class="cline-any cline-yes">1x</span>
1138
+ <span class="cline-any cline-yes">1x</span>
1139
+ <span class="cline-any cline-yes">1x</span>
1140
+ <span class="cline-any cline-yes">1x</span>
1141
+ <span class="cline-any cline-yes">1x</span>
1142
+ <span class="cline-any cline-yes">1x</span>
1143
+ <span class="cline-any cline-yes">1x</span>
1144
+ <span class="cline-any cline-yes">1x</span>
1145
+ <span class="cline-any cline-yes">1x</span>
1146
+ <span class="cline-any cline-yes">1x</span>
1147
+ <span class="cline-any cline-yes">1x</span>
1148
+ <span class="cline-any cline-yes">1x</span>
1149
+ <span class="cline-any cline-yes">1x</span>
1150
+ <span class="cline-any cline-yes">1x</span>
1151
+ <span class="cline-any cline-yes">1x</span>
1152
+ <span class="cline-any cline-yes">1x</span>
1153
+ <span class="cline-any cline-yes">1x</span>
1154
+ <span class="cline-any cline-yes">1x</span>
1155
+ <span class="cline-any cline-yes">1x</span>
1156
+ <span class="cline-any cline-yes">1x</span>
1157
+ <span class="cline-any cline-yes">1x</span>
1158
+ <span class="cline-any cline-yes">1x</span>
1159
+ <span class="cline-any cline-yes">1x</span>
1160
+ <span class="cline-any cline-yes">1x</span>
1161
+ <span class="cline-any cline-yes">1x</span>
1162
+ <span class="cline-any cline-yes">1x</span>
1163
+ <span class="cline-any cline-yes">1x</span>
1164
+ <span class="cline-any cline-yes">1x</span>
1165
+ <span class="cline-any cline-yes">1x</span>
1166
+ <span class="cline-any cline-yes">1x</span>
1167
+ <span class="cline-any cline-yes">1x</span>
1168
+ <span class="cline-any cline-yes">1x</span>
1169
+ <span class="cline-any cline-yes">1x</span>
1170
+ <span class="cline-any cline-yes">1x</span>
1171
+ <span class="cline-any cline-yes">1x</span>
1172
+ <span class="cline-any cline-yes">1x</span>
1173
+ <span class="cline-any cline-yes">1x</span>
1174
+ <span class="cline-any cline-yes">1x</span>
1175
+ <span class="cline-any cline-yes">1x</span>
1176
+ <span class="cline-any cline-yes">1x</span>
1177
+ <span class="cline-any cline-yes">1x</span>
1178
+ <span class="cline-any cline-yes">1x</span>
1179
+ <span class="cline-any cline-yes">1x</span>
1180
+ <span class="cline-any cline-yes">1x</span>
1181
+ <span class="cline-any cline-yes">1x</span>
1182
+ <span class="cline-any cline-yes">1x</span>
1183
+ <span class="cline-any cline-yes">1x</span>
1184
+ <span class="cline-any cline-yes">1x</span>
1185
+ <span class="cline-any cline-yes">1x</span>
1186
+ <span class="cline-any cline-yes">1x</span>
1187
+ <span class="cline-any cline-yes">1x</span>
1188
+ <span class="cline-any cline-yes">1x</span>
1189
+ <span class="cline-any cline-yes">1x</span>
1190
+ <span class="cline-any cline-yes">1x</span>
1191
+ <span class="cline-any cline-yes">1x</span>
1192
+ <span class="cline-any cline-yes">1x</span>
1193
+ <span class="cline-any cline-yes">1x</span>
1194
+ <span class="cline-any cline-yes">1x</span>
1195
+ <span class="cline-any cline-yes">1x</span>
1196
+ <span class="cline-any cline-yes">1x</span>
1197
+ <span class="cline-any cline-yes">1x</span>
1198
+ <span class="cline-any cline-yes">1x</span>
1199
+ <span class="cline-any cline-yes">1x</span>
1200
+ <span class="cline-any cline-yes">1x</span>
1201
+ <span class="cline-any cline-yes">1x</span>
1202
+ <span class="cline-any cline-yes">1x</span>
1203
+ <span class="cline-any cline-yes">1x</span>
1204
+ <span class="cline-any cline-yes">1x</span>
1205
+ <span class="cline-any cline-yes">1x</span>
1206
+ <span class="cline-any cline-yes">1x</span>
1207
+ <span class="cline-any cline-yes">1x</span>
1208
+ <span class="cline-any cline-yes">1x</span>
1209
+ <span class="cline-any cline-yes">1x</span>
1210
+ <span class="cline-any cline-yes">1x</span>
1211
+ <span class="cline-any cline-yes">1x</span>
1212
+ <span class="cline-any cline-yes">1x</span>
1213
+ <span class="cline-any cline-yes">1x</span>
1214
+ <span class="cline-any cline-yes">1x</span>
1041
1215
  <span class="cline-any cline-no">&nbsp;</span>
1042
1216
  <span class="cline-any cline-no">&nbsp;</span>
1043
1217
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1357,595 +1531,421 @@
1357
1531
  <span class="cline-any cline-no">&nbsp;</span>
1358
1532
  <span class="cline-any cline-no">&nbsp;</span>
1359
1533
  <span class="cline-any cline-no">&nbsp;</span>
1360
- <span class="cline-any cline-no">&nbsp;</span>
1361
- <span class="cline-any cline-no">&nbsp;</span>
1362
- <span class="cline-any cline-no">&nbsp;</span>
1363
- <span class="cline-any cline-no">&nbsp;</span>
1364
- <span class="cline-any cline-no">&nbsp;</span>
1365
- <span class="cline-any cline-no">&nbsp;</span>
1366
- <span class="cline-any cline-no">&nbsp;</span>
1367
- <span class="cline-any cline-no">&nbsp;</span>
1368
- <span class="cline-any cline-no">&nbsp;</span>
1369
- <span class="cline-any cline-no">&nbsp;</span>
1370
- <span class="cline-any cline-no">&nbsp;</span>
1371
- <span class="cline-any cline-no">&nbsp;</span>
1372
- <span class="cline-any cline-no">&nbsp;</span>
1373
- <span class="cline-any cline-no">&nbsp;</span>
1374
- <span class="cline-any cline-no">&nbsp;</span>
1375
- <span class="cline-any cline-no">&nbsp;</span>
1376
- <span class="cline-any cline-no">&nbsp;</span>
1377
- <span class="cline-any cline-no">&nbsp;</span>
1378
- <span class="cline-any cline-no">&nbsp;</span>
1379
- <span class="cline-any cline-no">&nbsp;</span>
1380
- <span class="cline-any cline-no">&nbsp;</span>
1381
- <span class="cline-any cline-no">&nbsp;</span>
1382
- <span class="cline-any cline-no">&nbsp;</span>
1383
- <span class="cline-any cline-no">&nbsp;</span>
1384
- <span class="cline-any cline-no">&nbsp;</span>
1385
- <span class="cline-any cline-no">&nbsp;</span>
1386
- <span class="cline-any cline-no">&nbsp;</span>
1387
- <span class="cline-any cline-no">&nbsp;</span>
1388
- <span class="cline-any cline-no">&nbsp;</span>
1389
- <span class="cline-any cline-no">&nbsp;</span>
1390
- <span class="cline-any cline-no">&nbsp;</span>
1391
- <span class="cline-any cline-no">&nbsp;</span>
1392
- <span class="cline-any cline-no">&nbsp;</span>
1393
- <span class="cline-any cline-no">&nbsp;</span>
1394
- <span class="cline-any cline-no">&nbsp;</span>
1395
- <span class="cline-any cline-no">&nbsp;</span>
1396
- <span class="cline-any cline-no">&nbsp;</span>
1397
- <span class="cline-any cline-no">&nbsp;</span>
1398
- <span class="cline-any cline-no">&nbsp;</span>
1399
- <span class="cline-any cline-no">&nbsp;</span>
1400
- <span class="cline-any cline-no">&nbsp;</span>
1401
- <span class="cline-any cline-no">&nbsp;</span>
1402
- <span class="cline-any cline-no">&nbsp;</span>
1403
- <span class="cline-any cline-no">&nbsp;</span>
1404
- <span class="cline-any cline-no">&nbsp;</span>
1405
- <span class="cline-any cline-no">&nbsp;</span>
1406
- <span class="cline-any cline-no">&nbsp;</span>
1407
- <span class="cline-any cline-no">&nbsp;</span>
1408
- <span class="cline-any cline-no">&nbsp;</span>
1409
- <span class="cline-any cline-no">&nbsp;</span>
1410
- <span class="cline-any cline-no">&nbsp;</span>
1411
- <span class="cline-any cline-no">&nbsp;</span>
1412
- <span class="cline-any cline-no">&nbsp;</span>
1413
- <span class="cline-any cline-no">&nbsp;</span>
1414
- <span class="cline-any cline-no">&nbsp;</span>
1415
- <span class="cline-any cline-no">&nbsp;</span>
1416
- <span class="cline-any cline-no">&nbsp;</span>
1417
- <span class="cline-any cline-no">&nbsp;</span>
1418
- <span class="cline-any cline-no">&nbsp;</span>
1419
- <span class="cline-any cline-no">&nbsp;</span>
1420
- <span class="cline-any cline-no">&nbsp;</span>
1421
- <span class="cline-any cline-no">&nbsp;</span>
1422
- <span class="cline-any cline-no">&nbsp;</span>
1423
- <span class="cline-any cline-no">&nbsp;</span>
1424
- <span class="cline-any cline-no">&nbsp;</span>
1425
- <span class="cline-any cline-no">&nbsp;</span>
1426
- <span class="cline-any cline-no">&nbsp;</span>
1427
- <span class="cline-any cline-no">&nbsp;</span>
1428
- <span class="cline-any cline-no">&nbsp;</span>
1429
- <span class="cline-any cline-no">&nbsp;</span>
1430
- <span class="cline-any cline-no">&nbsp;</span>
1431
- <span class="cline-any cline-no">&nbsp;</span>
1432
- <span class="cline-any cline-no">&nbsp;</span>
1433
- <span class="cline-any cline-no">&nbsp;</span>
1434
- <span class="cline-any cline-no">&nbsp;</span>
1435
- <span class="cline-any cline-no">&nbsp;</span>
1436
- <span class="cline-any cline-no">&nbsp;</span>
1437
- <span class="cline-any cline-no">&nbsp;</span>
1438
- <span class="cline-any cline-no">&nbsp;</span>
1439
- <span class="cline-any cline-no">&nbsp;</span>
1440
- <span class="cline-any cline-no">&nbsp;</span>
1441
- <span class="cline-any cline-no">&nbsp;</span>
1442
- <span class="cline-any cline-no">&nbsp;</span>
1443
- <span class="cline-any cline-no">&nbsp;</span>
1444
- <span class="cline-any cline-no">&nbsp;</span>
1445
- <span class="cline-any cline-no">&nbsp;</span>
1446
- <span class="cline-any cline-no">&nbsp;</span>
1447
- <span class="cline-any cline-no">&nbsp;</span>
1448
- <span class="cline-any cline-no">&nbsp;</span>
1449
- <span class="cline-any cline-no">&nbsp;</span>
1450
- <span class="cline-any cline-no">&nbsp;</span>
1451
- <span class="cline-any cline-no">&nbsp;</span>
1452
- <span class="cline-any cline-no">&nbsp;</span>
1453
- <span class="cline-any cline-no">&nbsp;</span>
1454
- <span class="cline-any cline-no">&nbsp;</span>
1455
- <span class="cline-any cline-no">&nbsp;</span>
1456
- <span class="cline-any cline-no">&nbsp;</span>
1457
- <span class="cline-any cline-no">&nbsp;</span>
1458
- <span class="cline-any cline-no">&nbsp;</span>
1459
- <span class="cline-any cline-no">&nbsp;</span>
1460
- <span class="cline-any cline-no">&nbsp;</span>
1461
- <span class="cline-any cline-no">&nbsp;</span>
1462
- <span class="cline-any cline-no">&nbsp;</span>
1463
- <span class="cline-any cline-no">&nbsp;</span>
1464
- <span class="cline-any cline-no">&nbsp;</span>
1465
- <span class="cline-any cline-no">&nbsp;</span>
1466
- <span class="cline-any cline-no">&nbsp;</span>
1467
- <span class="cline-any cline-no">&nbsp;</span>
1468
- <span class="cline-any cline-no">&nbsp;</span>
1469
- <span class="cline-any cline-no">&nbsp;</span>
1470
- <span class="cline-any cline-no">&nbsp;</span>
1471
- <span class="cline-any cline-no">&nbsp;</span>
1472
- <span class="cline-any cline-no">&nbsp;</span>
1473
- <span class="cline-any cline-no">&nbsp;</span>
1474
- <span class="cline-any cline-no">&nbsp;</span>
1475
- <span class="cline-any cline-no">&nbsp;</span>
1476
- <span class="cline-any cline-no">&nbsp;</span>
1477
- <span class="cline-any cline-no">&nbsp;</span>
1478
- <span class="cline-any cline-no">&nbsp;</span>
1479
- <span class="cline-any cline-no">&nbsp;</span>
1480
- <span class="cline-any cline-no">&nbsp;</span>
1481
- <span class="cline-any cline-no">&nbsp;</span>
1482
- <span class="cline-any cline-no">&nbsp;</span>
1483
- <span class="cline-any cline-no">&nbsp;</span>
1484
- <span class="cline-any cline-no">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1486
- <span class="cline-any cline-no">&nbsp;</span>
1487
- <span class="cline-any cline-no">&nbsp;</span>
1488
- <span class="cline-any cline-no">&nbsp;</span>
1489
- <span class="cline-any cline-no">&nbsp;</span>
1490
- <span class="cline-any cline-no">&nbsp;</span>
1491
- <span class="cline-any cline-no">&nbsp;</span>
1492
- <span class="cline-any cline-no">&nbsp;</span>
1493
- <span class="cline-any cline-no">&nbsp;</span>
1494
- <span class="cline-any cline-no">&nbsp;</span>
1495
- <span class="cline-any cline-no">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1497
- <span class="cline-any cline-no">&nbsp;</span>
1498
- <span class="cline-any cline-no">&nbsp;</span>
1499
- <span class="cline-any cline-no">&nbsp;</span>
1500
- <span class="cline-any cline-no">&nbsp;</span>
1501
- <span class="cline-any cline-no">&nbsp;</span>
1502
- <span class="cline-any cline-no">&nbsp;</span>
1503
- <span class="cline-any cline-no">&nbsp;</span>
1504
- <span class="cline-any cline-no">&nbsp;</span>
1505
- <span class="cline-any cline-no">&nbsp;</span>
1506
- <span class="cline-any cline-no">&nbsp;</span>
1507
- <span class="cline-any cline-no">&nbsp;</span>
1508
- <span class="cline-any cline-no">&nbsp;</span>
1509
- <span class="cline-any cline-no">&nbsp;</span>
1510
- <span class="cline-any cline-no">&nbsp;</span>
1511
- <span class="cline-any cline-no">&nbsp;</span>
1512
- <span class="cline-any cline-no">&nbsp;</span>
1513
- <span class="cline-any cline-no">&nbsp;</span>
1514
- <span class="cline-any cline-no">&nbsp;</span>
1515
- <span class="cline-any cline-no">&nbsp;</span>
1516
- <span class="cline-any cline-no">&nbsp;</span>
1517
- <span class="cline-any cline-no">&nbsp;</span>
1518
- <span class="cline-any cline-no">&nbsp;</span>
1519
- <span class="cline-any cline-no">&nbsp;</span>
1520
- <span class="cline-any cline-no">&nbsp;</span>
1521
- <span class="cline-any cline-no">&nbsp;</span>
1522
- <span class="cline-any cline-no">&nbsp;</span>
1523
- <span class="cline-any cline-no">&nbsp;</span>
1524
- <span class="cline-any cline-no">&nbsp;</span>
1525
- <span class="cline-any cline-no">&nbsp;</span>
1526
- <span class="cline-any cline-no">&nbsp;</span>
1527
- <span class="cline-any cline-no">&nbsp;</span>
1528
- <span class="cline-any cline-no">&nbsp;</span>
1529
- <span class="cline-any cline-no">&nbsp;</span>
1530
- <span class="cline-any cline-no">&nbsp;</span>
1531
- <span class="cline-any cline-no">&nbsp;</span>
1532
- <span class="cline-any cline-no">&nbsp;</span>
1533
- <span class="cline-any cline-no">&nbsp;</span>
1534
- <span class="cline-any cline-neutral">&nbsp;</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>
1535
- <span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
1536
- <span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
1537
- <span class="cstat-no" title="statement not covered" > *</span>
1538
- <span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
1539
- <span class="cstat-no" title="statement not covered" > *</span>
1540
- <span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
1541
- <span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
1542
- <span class="cstat-no" title="statement not covered" > */</span>
1543
- <span class="cstat-no" title="statement not covered" ></span>
1544
- <span class="cstat-no" title="statement not covered" >/**</span>
1545
- <span class="cstat-no" title="statement not covered" > * @file qr-pairing-step.component.ts</span>
1546
- <span class="cstat-no" title="statement not covered" > * @description QR code pairing step for mobile wallet connection</span>
1547
- <span class="cstat-no" title="statement not covered" > *</span>
1548
- <span class="cstat-no" title="statement not covered" > * Implements single-QR Nostr-first pairing flow:</span>
1549
- <span class="cstat-no" title="statement not covered" > * 1. Display compact QR code with session invite</span>
1550
- <span class="cstat-no" title="statement not covered" > * 2. Wait for wallet to scan and connect via Nostr</span>
1551
- <span class="cstat-no" title="statement not covered" > * 3. Wait for user approval in wallet</span>
1552
- <span class="cstat-no" title="statement not covered" > * 4. Connection established (P2P upgrade happens automatically)</span>
1553
- <span class="cstat-no" title="statement not covered" > *</span>
1554
- <span class="cstat-no" title="statement not covered" > * This enables fully decentralized cross-device connections with only</span>
1555
- <span class="cstat-no" title="statement not covered" > * a single QR scan - much simpler than the previous 2-QR WebRTC flow.</span>
1556
- <span class="cstat-no" title="statement not covered" > *</span>
1557
- <span class="cstat-no" title="statement not covered" > * Features:</span>
1558
- <span class="cstat-no" title="statement not covered" > * - Single QR code display (no answer scanning needed)</span>
1559
- <span class="cstat-no" title="statement not covered" > * - QR code with HSuite logo in center</span>
1560
- <span class="cstat-no" title="statement not covered" > * - Countdown timer with expiry handling</span>
1561
- <span class="cstat-no" title="statement not covered" > * - Refresh capability for expired offers</span>
1562
- <span class="cstat-no" title="statement not covered" > * - Waiting for approval state</span>
1563
- <span class="cstat-no" title="statement not covered" > */</span>
1564
- <span class="cstat-no" title="statement not covered" ></span>
1565
- <span class="cstat-no" title="statement not covered" >import { CommonModule } from '@angular/common';</span>
1566
- <span class="cstat-no" title="statement not covered" >import {</span>
1567
- <span class="cstat-no" title="statement not covered" > Component,</span>
1568
- <span class="cstat-no" title="statement not covered" > Input,</span>
1569
- <span class="cstat-no" title="statement not covered" > Output,</span>
1570
- <span class="cstat-no" title="statement not covered" > EventEmitter,</span>
1571
- <span class="cstat-no" title="statement not covered" > ChangeDetectionStrategy,</span>
1572
- <span class="cstat-no" title="statement not covered" > signal,</span>
1573
- <span class="cstat-no" title="statement not covered" > OnChanges,</span>
1574
- <span class="cstat-no" title="statement not covered" > SimpleChanges,</span>
1575
- <span class="cstat-no" title="statement not covered" > OnDestroy,</span>
1576
- <span class="cstat-no" title="statement not covered" > AfterViewInit,</span>
1577
- <span class="cstat-no" title="statement not covered" > ElementRef,</span>
1578
- <span class="cstat-no" title="statement not covered" > ViewChild,</span>
1579
- <span class="cstat-no" title="statement not covered" > inject,</span>
1580
- <span class="cstat-no" title="statement not covered" >} from '@angular/core';</span>
1581
- <span class="cstat-no" title="statement not covered" >import { copyToClipboard } from '@hsuite/native-connect-ui';</span>
1582
- <span class="cstat-no" title="statement not covered" >import { IonIcon, IonSpinner, IonButton } from '@ionic/angular/standalone';</span>
1583
- <span class="cstat-no" title="statement not covered" >import { addIcons } from 'ionicons';</span>
1584
- <span class="cstat-no" title="statement not covered" >import {</span>
1585
- <span class="cstat-no" title="statement not covered" > qrCodeOutline,</span>
1586
- <span class="cstat-no" title="statement not covered" > refreshOutline,</span>
1587
- <span class="cstat-no" title="statement not covered" > checkmarkCircleOutline,</span>
1588
- <span class="cstat-no" title="statement not covered" > closeCircleOutline,</span>
1589
- <span class="cstat-no" title="statement not covered" > phonePortraitOutline,</span>
1590
- <span class="cstat-no" title="statement not covered" > arrowBackOutline,</span>
1591
- <span class="cstat-no" title="statement not covered" > timeOutline,</span>
1592
- <span class="cstat-no" title="statement not covered" > copyOutline,</span>
1593
- <span class="cstat-no" title="statement not covered" > checkmarkOutline,</span>
1594
- <span class="cstat-no" title="statement not covered" >} from 'ionicons/icons';</span>
1595
- <span class="cstat-no" title="statement not covered" >import * as QRCode from 'qrcode'; // qrcode has no default export; use namespace import for toCanvas</span>
1596
- <span class="cstat-no" title="statement not covered" ></span>
1597
- <span class="cstat-no" title="statement not covered" >import { LoggerService } from '../../../services/logger.service';</span>
1598
- <span class="cstat-no" title="statement not covered" ></span>
1599
- <span class="cstat-no" title="statement not covered" >/**</span>
1600
- <span class="cstat-no" title="statement not covered" > * Connection state for the QR pairing step.</span>
1601
- <span class="cstat-no" title="statement not covered" > *</span>
1602
- <span class="cstat-no" title="statement not covered" > * States:</span>
1603
- <span class="cstat-no" title="statement not covered" > * - loading: Generating session invite</span>
1604
- <span class="cstat-no" title="statement not covered" > * - displaying: Showing QR code for wallet to scan</span>
1605
- <span class="cstat-no" title="statement not covered" > * - waiting_wallet: QR scanned, waiting for wallet to connect via Nostr</span>
1606
- <span class="cstat-no" title="statement not covered" > * - waiting_approval: Wallet connected, waiting for user to approve</span>
1607
- <span class="cstat-no" title="statement not covered" > * - connected: Session approved and connected</span>
1608
- <span class="cstat-no" title="statement not covered" > * - expired: QR code expired</span>
1609
- <span class="cstat-no" title="statement not covered" > * - error: An error occurred</span>
1610
- <span class="cstat-no" title="statement not covered" > */</span>
1611
- <span class="cstat-no" title="statement not covered" >export type QrPairingState =</span>
1612
- <span class="cstat-no" title="statement not covered" > | 'loading'</span>
1613
- <span class="cstat-no" title="statement not covered" > | 'displaying'</span>
1614
- <span class="cstat-no" title="statement not covered" > | 'waiting_wallet'</span>
1615
- <span class="cstat-no" title="statement not covered" > | 'waiting_approval'</span>
1616
- <span class="cstat-no" title="statement not covered" > | 'connected'</span>
1617
- <span class="cstat-no" title="statement not covered" > | 'expired'</span>
1618
- <span class="cstat-no" title="statement not covered" > | 'error';</span>
1619
- <span class="cstat-no" title="statement not covered" ></span>
1620
- <span class="cstat-no" title="statement not covered" >/**</span>
1621
- <span class="cstat-no" title="statement not covered" > * QR Pairing Step Component</span>
1622
- <span class="cstat-no" title="statement not covered" > *</span>
1623
- <span class="cstat-no" title="statement not covered" > * Implements single-QR Nostr-first pairing for cross-device P2P connections.</span>
1624
- <span class="cstat-no" title="statement not covered" > * Much simpler than the previous 2-QR WebRTC approach.</span>
1625
- <span class="cstat-no" title="statement not covered" > */</span>
1626
- <span class="cstat-no" title="statement not covered" >@Component({</span>
1627
- <span class="cstat-no" title="statement not covered" > selector: 'hsuite-qr-pairing-step',</span>
1628
- <span class="cstat-no" title="statement not covered" > standalone: true,</span>
1629
- <span class="cstat-no" title="statement not covered" > changeDetection: ChangeDetectionStrategy.OnPush,</span>
1630
- <span class="cstat-no" title="statement not covered" > imports: [CommonModule, IonIcon, IonSpinner, IonButton],</span>
1631
- <span class="cstat-no" title="statement not covered" > template: `</span>
1632
- <span class="cstat-no" title="statement not covered" > &lt;div class="qr-pairing-container"&gt;</span>
1633
- <span class="cstat-no" title="statement not covered" > &lt;!-- Hidden canvas for QR generation - always rendered --&gt;</span>
1634
- <span class="cstat-no" title="statement not covered" > &lt;canvas #qrCanvas width="300" height="300" class="hidden-canvas"&gt;&lt;/canvas&gt;</span>
1635
- <span class="cstat-no" title="statement not covered" ></span>
1636
- <span class="cstat-no" title="statement not covered" > &lt;!-- Loading State --&gt;</span>
1637
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'loading'" class="state-panel loading"&gt;</span>
1638
- <span class="cstat-no" title="statement not covered" > &lt;ion-spinner name="crescent"&gt;&lt;/ion-spinner&gt;</span>
1639
- <span class="cstat-no" title="statement not covered" > &lt;p&gt;Generating secure connection...&lt;/p&gt;</span>
1640
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1641
- <span class="cstat-no" title="statement not covered" ></span>
1642
- <span class="cstat-no" title="statement not covered" > &lt;!-- QR Display State --&gt;</span>
1643
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'displaying'" class="qr-display"&gt;</span>
1644
- <span class="cstat-no" title="statement not covered" > &lt;div class="qr-header"&gt;</span>
1645
- <span class="cstat-no" title="statement not covered" > &lt;h3&gt;Scan with Your Wallet&lt;/h3&gt;</span>
1646
- <span class="cstat-no" title="statement not covered" > &lt;p class="qr-subtitle"&gt;Open HSuite Wallet and scan this QR code&lt;/p&gt;</span>
1647
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1648
- <span class="cstat-no" title="statement not covered" ></span>
1649
- <span class="cstat-no" title="statement not covered" > &lt;div class="qr-wrapper"&gt;</span>
1650
- <span class="cstat-no" title="statement not covered" > &lt;canvas #qrCanvasDisplay width="300" height="300"&gt;&lt;/canvas&gt;</span>
1651
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1652
- <span class="cstat-no" title="statement not covered" ></span>
1653
- <span class="cstat-no" title="statement not covered" > &lt;div class="qr-meta"&gt;</span>
1654
- <span class="cstat-no" title="statement not covered" > &lt;div class="countdown" [class.warning]="countdown() &lt; 30"&gt;</span>
1655
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon name="time-outline"&gt;&lt;/ion-icon&gt;</span>
1656
- <span class="cstat-no" title="statement not covered" > &lt;span&gt;{{ formatCountdown() }}&lt;/span&gt;</span>
1657
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1658
- <span class="cstat-no" title="statement not covered" > &lt;ion-button fill="clear" size="small" (click)="copyUri()"&gt;</span>
1659
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon</span>
1660
- <span class="cstat-no" title="statement not covered" > slot="icon-only"</span>
1661
- <span class="cstat-no" title="statement not covered" > [name]="copied() ? 'checkmark-outline' : 'copy-outline'"</span>
1662
- <span class="cstat-no" title="statement not covered" > &gt;&lt;/ion-icon&gt;</span>
1663
- <span class="cstat-no" title="statement not covered" > &lt;/ion-button&gt;</span>
1664
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1665
- <span class="cstat-no" title="statement not covered" ></span>
1666
- <span class="cstat-no" title="statement not covered" > &lt;div class="instructions"&gt;</span>
1667
- <span class="cstat-no" title="statement not covered" > &lt;ol&gt;</span>
1668
- <span class="cstat-no" title="statement not covered" > &lt;li&gt;Open HSuite Wallet on your phone&lt;/li&gt;</span>
1669
- <span class="cstat-no" title="statement not covered" > &lt;li&gt;Go to Sessions tab&lt;/li&gt;</span>
1670
- <span class="cstat-no" title="statement not covered" > &lt;li&gt;Tap "Scan QR" and scan this code&lt;/li&gt;</span>
1671
- <span class="cstat-no" title="statement not covered" > &lt;/ol&gt;</span>
1672
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1673
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1674
- <span class="cstat-no" title="statement not covered" ></span>
1675
- <span class="cstat-no" title="statement not covered" > &lt;!-- Waiting for Wallet State --&gt;</span>
1676
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'waiting_wallet'" class="state-panel waiting"&gt;</span>
1677
- <span class="cstat-no" title="statement not covered" > &lt;div class="waiting-icon-wrapper"&gt;</span>
1678
- <span class="cstat-no" title="statement not covered" > &lt;ion-spinner name="crescent"&gt;&lt;/ion-spinner&gt;</span>
1679
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1680
- <span class="cstat-no" title="statement not covered" > &lt;h3&gt;Waiting for Wallet&lt;/h3&gt;</span>
1681
- <span class="cstat-no" title="statement not covered" > &lt;p class="waiting-description"&gt;Scan the QR code with your wallet app to connect.&lt;/p&gt;</span>
1682
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1683
- <span class="cstat-no" title="statement not covered" ></span>
1684
- <span class="cstat-no" title="statement not covered" > &lt;!-- Waiting for Approval State --&gt;</span>
1685
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'waiting_approval'" class="state-panel waiting-approval"&gt;</span>
1686
- <span class="cstat-no" title="statement not covered" > &lt;div class="waiting-icon-wrapper"&gt;</span>
1687
- <span class="cstat-no" title="statement not covered" > &lt;ion-spinner name="crescent"&gt;&lt;/ion-spinner&gt;</span>
1688
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1689
- <span class="cstat-no" title="statement not covered" > &lt;h3&gt;Waiting for Wallet Approval&lt;/h3&gt;</span>
1690
- <span class="cstat-no" title="statement not covered" > &lt;p class="waiting-description"&gt;</span>
1691
- <span class="cstat-no" title="statement not covered" > The wallet is connected. Please approve the session in your wallet app.</span>
1692
- <span class="cstat-no" title="statement not covered" > &lt;/p&gt;</span>
1693
- <span class="cstat-no" title="statement not covered" > &lt;div class="waiting-steps"&gt;</span>
1694
- <span class="cstat-no" title="statement not covered" > &lt;div class="waiting-step"&gt;</span>
1695
- <span class="cstat-no" title="statement not covered" > &lt;span class="step-check"&gt;&amp;#10003;&lt;/span&gt;</span>
1696
- <span class="cstat-no" title="statement not covered" > &lt;span&gt;QR code scanned&lt;/span&gt;</span>
1697
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1698
- <span class="cstat-no" title="statement not covered" > &lt;div class="waiting-step"&gt;</span>
1699
- <span class="cstat-no" title="statement not covered" > &lt;span class="step-check"&gt;&amp;#10003;&lt;/span&gt;</span>
1700
- <span class="cstat-no" title="statement not covered" > &lt;span&gt;Wallet connected&lt;/span&gt;</span>
1701
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1702
- <span class="cstat-no" title="statement not covered" > &lt;div class="waiting-step active"&gt;</span>
1703
- <span class="cstat-no" title="statement not covered" > &lt;ion-spinner name="dots"&gt;&lt;/ion-spinner&gt;</span>
1704
- <span class="cstat-no" title="statement not covered" > &lt;span&gt;Awaiting approval in wallet...&lt;/span&gt;</span>
1705
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1706
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1707
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1708
- <span class="cstat-no" title="statement not covered" ></span>
1709
- <span class="cstat-no" title="statement not covered" > &lt;!-- Connected State --&gt;</span>
1710
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'connected'" class="state-panel connected"&gt;</span>
1711
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon name="checkmark-circle-outline" color="success"&gt;&lt;/ion-icon&gt;</span>
1712
- <span class="cstat-no" title="statement not covered" > &lt;p&gt;Connected successfully!&lt;/p&gt;</span>
1713
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1714
- <span class="cstat-no" title="statement not covered" ></span>
1715
- <span class="cstat-no" title="statement not covered" > &lt;!-- Error State --&gt;</span>
1716
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'error'" class="state-panel error"&gt;</span>
1717
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon name="close-circle-outline" color="danger"&gt;&lt;/ion-icon&gt;</span>
1718
- <span class="cstat-no" title="statement not covered" > &lt;p&gt;{{ errorMessage || 'Connection failed' }}&lt;/p&gt;</span>
1719
- <span class="cstat-no" title="statement not covered" > &lt;ion-button fill="outline" (click)="refresh()"&gt;</span>
1720
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon slot="start" name="refresh-outline"&gt;&lt;/ion-icon&gt;</span>
1721
- <span class="cstat-no" title="statement not covered" > Try Again</span>
1722
- <span class="cstat-no" title="statement not covered" > &lt;/ion-button&gt;</span>
1723
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1724
- <span class="cstat-no" title="statement not covered" ></span>
1725
- <span class="cstat-no" title="statement not covered" > &lt;!-- Expired State --&gt;</span>
1726
- <span class="cstat-no" title="statement not covered" > &lt;div *ngIf="pairingState() === 'expired'" class="state-panel expired"&gt;</span>
1727
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon name="time-outline" color="warning"&gt;&lt;/ion-icon&gt;</span>
1728
- <span class="cstat-no" title="statement not covered" > &lt;p&gt;QR code expired&lt;/p&gt;</span>
1729
- <span class="cstat-no" title="statement not covered" > &lt;ion-button fill="outline" (click)="refresh()"&gt;</span>
1730
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon slot="start" name="refresh-outline"&gt;&lt;/ion-icon&gt;</span>
1731
- <span class="cstat-no" title="statement not covered" > Generate New</span>
1732
- <span class="cstat-no" title="statement not covered" > &lt;/ion-button&gt;</span>
1733
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1734
- <span class="cstat-no" title="statement not covered" ></span>
1735
- <span class="cstat-no" title="statement not covered" > &lt;!-- Footer Actions (cancel) - hidden during waiting/connected --&gt;</span>
1736
- <span class="cstat-no" title="statement not covered" > &lt;div</span>
1737
- <span class="cstat-no" title="statement not covered" > class="footer-actions"</span>
1738
- <span class="cstat-no" title="statement not covered" > *ngIf="!['waiting_wallet', 'waiting_approval', 'connected'].includes(pairingState())"</span>
1739
- <span class="cstat-no" title="statement not covered" > &gt;</span>
1740
- <span class="cstat-no" title="statement not covered" > &lt;ion-button fill="clear" (click)="cancel()"&gt;</span>
1741
- <span class="cstat-no" title="statement not covered" > &lt;ion-icon slot="start" name="arrow-back-outline"&gt;&lt;/ion-icon&gt;</span>
1742
- <span class="cstat-no" title="statement not covered" > Cancel</span>
1743
- <span class="cstat-no" title="statement not covered" > &lt;/ion-button&gt;</span>
1744
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1745
- <span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span>
1746
- <span class="cstat-no" title="statement not covered" > `,</span>
1747
- <span class="cstat-no" title="statement not covered" > styles: [</span>
1748
- <span class="cstat-no" title="statement not covered" > `</span>
1749
- <span class="cstat-no" title="statement not covered" > .qr-pairing-container {</span>
1750
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1751
- <span class="cstat-no" title="statement not covered" > flex-direction: column;</span>
1752
- <span class="cstat-no" title="statement not covered" > padding: 1rem;</span>
1753
- <span class="cstat-no" title="statement not covered" > min-height: 400px;</span>
1754
- <span class="cstat-no" title="statement not covered" > }</span>
1755
- <span class="cstat-no" title="statement not covered" ></span>
1756
- <span class="cstat-no" title="statement not covered" > .hidden-canvas {</span>
1757
- <span class="cstat-no" title="statement not covered" > position: absolute;</span>
1758
- <span class="cstat-no" title="statement not covered" > left: -9999px;</span>
1759
- <span class="cstat-no" title="statement not covered" > top: -9999px;</span>
1760
- <span class="cstat-no" title="statement not covered" > visibility: hidden;</span>
1761
- <span class="cstat-no" title="statement not covered" > }</span>
1762
- <span class="cstat-no" title="statement not covered" ></span>
1763
- <span class="cstat-no" title="statement not covered" > .qr-display {</span>
1764
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1765
- <span class="cstat-no" title="statement not covered" > flex-direction: column;</span>
1766
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1767
- <span class="cstat-no" title="statement not covered" > flex: 1;</span>
1768
- <span class="cstat-no" title="statement not covered" > }</span>
1769
- <span class="cstat-no" title="statement not covered" ></span>
1770
- <span class="cstat-no" title="statement not covered" > .qr-header {</span>
1771
- <span class="cstat-no" title="statement not covered" > text-align: center;</span>
1772
- <span class="cstat-no" title="statement not covered" > margin-bottom: 1.5rem;</span>
1773
- <span class="cstat-no" title="statement not covered" > }</span>
1774
- <span class="cstat-no" title="statement not covered" ></span>
1775
- <span class="cstat-no" title="statement not covered" > .qr-header h3 {</span>
1776
- <span class="cstat-no" title="statement not covered" > margin: 0 0 0.5rem 0;</span>
1777
- <span class="cstat-no" title="statement not covered" > font-size: 1.25rem;</span>
1778
- <span class="cstat-no" title="statement not covered" > font-weight: 600;</span>
1779
- <span class="cstat-no" title="statement not covered" > }</span>
1780
- <span class="cstat-no" title="statement not covered" ></span>
1781
- <span class="cstat-no" title="statement not covered" > .qr-subtitle {</span>
1782
- <span class="cstat-no" title="statement not covered" > margin: 0;</span>
1783
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-medium-shade);</span>
1784
- <span class="cstat-no" title="statement not covered" > font-size: 0.875rem;</span>
1785
- <span class="cstat-no" title="statement not covered" > }</span>
1786
- <span class="cstat-no" title="statement not covered" ></span>
1787
- <span class="cstat-no" title="statement not covered" > .qr-wrapper {</span>
1788
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1789
- <span class="cstat-no" title="statement not covered" > justify-content: center;</span>
1790
- <span class="cstat-no" title="statement not covered" > padding: 1rem;</span>
1791
- <span class="cstat-no" title="statement not covered" > background: white;</span>
1792
- <span class="cstat-no" title="statement not covered" > border-radius: 12px;</span>
1793
- <span class="cstat-no" title="statement not covered" > box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);</span>
1794
- <span class="cstat-no" title="statement not covered" > margin-bottom: 1rem;</span>
1795
- <span class="cstat-no" title="statement not covered" > }</span>
1796
- <span class="cstat-no" title="statement not covered" ></span>
1797
- <span class="cstat-no" title="statement not covered" > .qr-meta {</span>
1798
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1799
- <span class="cstat-no" title="statement not covered" > justify-content: center;</span>
1800
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1801
- <span class="cstat-no" title="statement not covered" > gap: 1rem;</span>
1802
- <span class="cstat-no" title="statement not covered" > margin-bottom: 1rem;</span>
1803
- <span class="cstat-no" title="statement not covered" > }</span>
1804
- <span class="cstat-no" title="statement not covered" ></span>
1805
- <span class="cstat-no" title="statement not covered" > .countdown {</span>
1806
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1807
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1808
- <span class="cstat-no" title="statement not covered" > gap: 0.25rem;</span>
1809
- <span class="cstat-no" title="statement not covered" > padding: 0.25rem 0.75rem;</span>
1810
- <span class="cstat-no" title="statement not covered" > background: var(--ion-color-light);</span>
1811
- <span class="cstat-no" title="statement not covered" > border-radius: 1rem;</span>
1812
- <span class="cstat-no" title="statement not covered" > font-size: 0.875rem;</span>
1813
- <span class="cstat-no" title="statement not covered" > }</span>
1814
- <span class="cstat-no" title="statement not covered" ></span>
1815
- <span class="cstat-no" title="statement not covered" > .countdown.warning {</span>
1816
- <span class="cstat-no" title="statement not covered" > background: var(--ion-color-warning-tint);</span>
1817
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-warning-shade);</span>
1818
- <span class="cstat-no" title="statement not covered" > }</span>
1819
- <span class="cstat-no" title="statement not covered" ></span>
1820
- <span class="cstat-no" title="statement not covered" > .instructions {</span>
1821
- <span class="cstat-no" title="statement not covered" > margin-bottom: 1rem;</span>
1822
- <span class="cstat-no" title="statement not covered" > width: 100%;</span>
1823
- <span class="cstat-no" title="statement not covered" > max-width: 300px;</span>
1824
- <span class="cstat-no" title="statement not covered" > }</span>
1825
- <span class="cstat-no" title="statement not covered" ></span>
1826
- <span class="cstat-no" title="statement not covered" > .instructions ol {</span>
1827
- <span class="cstat-no" title="statement not covered" > text-align: left;</span>
1828
- <span class="cstat-no" title="statement not covered" > padding-left: 1.25rem;</span>
1829
- <span class="cstat-no" title="statement not covered" > margin: 0;</span>
1830
- <span class="cstat-no" title="statement not covered" > }</span>
1831
- <span class="cstat-no" title="statement not covered" ></span>
1832
- <span class="cstat-no" title="statement not covered" > .instructions li {</span>
1833
- <span class="cstat-no" title="statement not covered" > margin-bottom: 0.5rem;</span>
1834
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-medium-shade);</span>
1835
- <span class="cstat-no" title="statement not covered" > font-size: 0.875rem;</span>
1836
- <span class="cstat-no" title="statement not covered" > }</span>
1837
- <span class="cstat-no" title="statement not covered" ></span>
1838
- <span class="cstat-no" title="statement not covered" > .state-panel {</span>
1839
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1840
- <span class="cstat-no" title="statement not covered" > flex-direction: column;</span>
1841
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1842
- <span class="cstat-no" title="statement not covered" > justify-content: center;</span>
1843
- <span class="cstat-no" title="statement not covered" > gap: 1rem;</span>
1844
- <span class="cstat-no" title="statement not covered" > flex: 1;</span>
1845
- <span class="cstat-no" title="statement not covered" > text-align: center;</span>
1846
- <span class="cstat-no" title="statement not covered" > }</span>
1847
- <span class="cstat-no" title="statement not covered" ></span>
1848
- <span class="cstat-no" title="statement not covered" > .state-panel ion-spinner {</span>
1849
- <span class="cstat-no" title="statement not covered" > width: 48px;</span>
1850
- <span class="cstat-no" title="statement not covered" > height: 48px;</span>
1851
- <span class="cstat-no" title="statement not covered" > }</span>
1852
- <span class="cstat-no" title="statement not covered" ></span>
1853
- <span class="cstat-no" title="statement not covered" > .state-panel ion-icon {</span>
1854
- <span class="cstat-no" title="statement not covered" > font-size: 64px;</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" > /* Waiting States */</span>
1858
- <span class="cstat-no" title="statement not covered" > .waiting,</span>
1859
- <span class="cstat-no" title="statement not covered" > .waiting-approval {</span>
1860
- <span class="cstat-no" title="statement not covered" > padding: 1.5rem;</span>
1861
- <span class="cstat-no" title="statement not covered" > }</span>
1862
- <span class="cstat-no" title="statement not covered" ></span>
1863
- <span class="cstat-no" title="statement not covered" > .waiting h3,</span>
1864
- <span class="cstat-no" title="statement not covered" > .waiting-approval h3 {</span>
1865
- <span class="cstat-no" title="statement not covered" > margin: 0 0 0.5rem 0;</span>
1866
- <span class="cstat-no" title="statement not covered" > font-size: 1.25rem;</span>
1867
- <span class="cstat-no" title="statement not covered" > font-weight: 600;</span>
1868
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-primary);</span>
1869
- <span class="cstat-no" title="statement not covered" > }</span>
1870
- <span class="cstat-no" title="statement not covered" ></span>
1871
- <span class="cstat-no" title="statement not covered" > .waiting-description {</span>
1872
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-medium-shade);</span>
1873
- <span class="cstat-no" title="statement not covered" > font-size: 0.9rem;</span>
1874
- <span class="cstat-no" title="statement not covered" > margin-bottom: 1.5rem;</span>
1875
- <span class="cstat-no" title="statement not covered" > max-width: 280px;</span>
1876
- <span class="cstat-no" title="statement not covered" > }</span>
1877
- <span class="cstat-no" title="statement not covered" ></span>
1878
- <span class="cstat-no" title="statement not covered" > .waiting-icon-wrapper {</span>
1879
- <span class="cstat-no" title="statement not covered" > width: 80px;</span>
1880
- <span class="cstat-no" title="statement not covered" > height: 80px;</span>
1881
- <span class="cstat-no" title="statement not covered" > border-radius: 50%;</span>
1882
- <span class="cstat-no" title="statement not covered" > background: var(--ion-color-primary-tint);</span>
1883
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1884
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1885
- <span class="cstat-no" title="statement not covered" > justify-content: center;</span>
1886
- <span class="cstat-no" title="statement not covered" > margin-bottom: 1rem;</span>
1887
- <span class="cstat-no" title="statement not covered" > }</span>
1888
- <span class="cstat-no" title="statement not covered" ></span>
1889
- <span class="cstat-no" title="statement not covered" > .waiting-icon-wrapper ion-spinner {</span>
1890
- <span class="cstat-no" title="statement not covered" > width: 40px;</span>
1891
- <span class="cstat-no" title="statement not covered" > height: 40px;</span>
1892
- <span class="cstat-no" title="statement not covered" > --color: var(--ion-color-primary);</span>
1893
- <span class="cstat-no" title="statement not covered" > }</span>
1894
- <span class="cstat-no" title="statement not covered" ></span>
1895
- <span class="cstat-no" title="statement not covered" > .waiting-steps {</span>
1896
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1897
- <span class="cstat-no" title="statement not covered" > flex-direction: column;</span>
1898
- <span class="cstat-no" title="statement not covered" > gap: 0.75rem;</span>
1899
- <span class="cstat-no" title="statement not covered" > padding: 1rem;</span>
1900
- <span class="cstat-no" title="statement not covered" > background: var(--ion-color-light);</span>
1901
- <span class="cstat-no" title="statement not covered" > border-radius: 12px;</span>
1902
- <span class="cstat-no" title="statement not covered" > width: 100%;</span>
1903
- <span class="cstat-no" title="statement not covered" > max-width: 280px;</span>
1904
- <span class="cstat-no" title="statement not covered" > }</span>
1905
- <span class="cstat-no" title="statement not covered" ></span>
1906
- <span class="cstat-no" title="statement not covered" > .waiting-step {</span>
1907
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1908
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1909
- <span class="cstat-no" title="statement not covered" > gap: 0.75rem;</span>
1910
- <span class="cstat-no" title="statement not covered" > font-size: 0.875rem;</span>
1911
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-medium-shade);</span>
1912
- <span class="cstat-no" title="statement not covered" > }</span>
1913
- <span class="cstat-no" title="statement not covered" ></span>
1914
- <span class="cstat-no" title="statement not covered" > .waiting-step .step-check {</span>
1915
- <span class="cstat-no" title="statement not covered" > width: 20px;</span>
1916
- <span class="cstat-no" title="statement not covered" > height: 20px;</span>
1917
- <span class="cstat-no" title="statement not covered" > border-radius: 50%;</span>
1918
- <span class="cstat-no" title="statement not covered" > background: var(--ion-color-success);</span>
1919
- <span class="cstat-no" title="statement not covered" > color: white;</span>
1920
- <span class="cstat-no" title="statement not covered" > font-size: 0.75rem;</span>
1921
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1922
- <span class="cstat-no" title="statement not covered" > align-items: center;</span>
1923
- <span class="cstat-no" title="statement not covered" > justify-content: center;</span>
1924
- <span class="cstat-no" title="statement not covered" > flex-shrink: 0;</span>
1925
- <span class="cstat-no" title="statement not covered" > }</span>
1926
- <span class="cstat-no" title="statement not covered" ></span>
1927
- <span class="cstat-no" title="statement not covered" > .waiting-step.active {</span>
1928
- <span class="cstat-no" title="statement not covered" > color: var(--ion-color-primary);</span>
1929
- <span class="cstat-no" title="statement not covered" > font-weight: 500;</span>
1930
- <span class="cstat-no" title="statement not covered" > }</span>
1931
- <span class="cstat-no" title="statement not covered" ></span>
1932
- <span class="cstat-no" title="statement not covered" > .waiting-step.active ion-spinner {</span>
1933
- <span class="cstat-no" title="statement not covered" > width: 20px;</span>
1934
- <span class="cstat-no" title="statement not covered" > height: 20px;</span>
1935
- <span class="cstat-no" title="statement not covered" > --color: var(--ion-color-primary);</span>
1936
- <span class="cstat-no" title="statement not covered" > }</span>
1937
- <span class="cstat-no" title="statement not covered" ></span>
1938
- <span class="cstat-no" title="statement not covered" > .footer-actions {</span>
1939
- <span class="cstat-no" title="statement not covered" > margin-top: auto;</span>
1940
- <span class="cstat-no" title="statement not covered" > padding-top: 1rem;</span>
1941
- <span class="cstat-no" title="statement not covered" > border-top: 1px solid var(--ion-color-light);</span>
1942
- <span class="cstat-no" title="statement not covered" > display: flex;</span>
1943
- <span class="cstat-no" title="statement not covered" > justify-content: center;</span>
1944
- <span class="cstat-no" title="statement not covered" > }</span>
1945
- <span class="cstat-no" title="statement not covered" > `,</span>
1946
- <span class="cstat-no" title="statement not covered" > ],</span>
1947
- <span class="cstat-no" title="statement not covered" >})</span>
1948
- <span class="cstat-no" title="statement not covered" >export class QrPairingStepComponent implements AfterViewInit, OnChanges, OnDestroy {</span>
1534
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1535
+ * HSuite Native Connect
1536
+ * Copyright 2024-2025 HSuite (https://hsuite.finance)
1537
+ *
1538
+ * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
1539
+ *
1540
+ * This file is part of HSuite Native Connect. For commercial licensing,
1541
+ * visit https://hsuite.finance/licensing
1542
+ */
1543
+ &nbsp;
1544
+ /**
1545
+ * @file qr-pairing-step.component.ts
1546
+ * @description QR code pairing step for mobile wallet connection
1547
+ *
1548
+ * Implements single-QR Nostr-first pairing flow:
1549
+ * 1. Display compact QR code with session invite
1550
+ * 2. Wait for wallet to scan and connect via Nostr
1551
+ * 3. Wait for user approval in wallet
1552
+ * 4. Connection established (P2P upgrade happens automatically)
1553
+ *
1554
+ * This enables fully decentralized cross-device connections with only
1555
+ * a single QR scan - much simpler than the previous 2-QR WebRTC flow.
1556
+ *
1557
+ * Features:
1558
+ * - Single QR code display (no answer scanning needed)
1559
+ * - QR code with HSuite logo in center
1560
+ * - Countdown timer with expiry handling
1561
+ * - Refresh capability for expired offers
1562
+ * - Waiting for approval state
1563
+ */
1564
+ &nbsp;
1565
+ import { CommonModule } from '@angular/common';
1566
+ import {
1567
+ Component,
1568
+ Input,
1569
+ Output,
1570
+ EventEmitter,
1571
+ ChangeDetectionStrategy,
1572
+ signal,
1573
+ OnChanges,
1574
+ SimpleChanges,
1575
+ OnDestroy,
1576
+ AfterViewInit,
1577
+ ElementRef,
1578
+ ViewChild,
1579
+ inject,
1580
+ } from '@angular/core';
1581
+ import { copyToClipboard } from '@hsuite/native-connect-ui';
1582
+ import { IonIcon, IonSpinner, IonButton } from '@ionic/angular/standalone';
1583
+ import { addIcons } from 'ionicons';
1584
+ import {
1585
+ qrCodeOutline,
1586
+ refreshOutline,
1587
+ checkmarkCircleOutline,
1588
+ closeCircleOutline,
1589
+ phonePortraitOutline,
1590
+ arrowBackOutline,
1591
+ timeOutline,
1592
+ copyOutline,
1593
+ checkmarkOutline,
1594
+ } from 'ionicons/icons';
1595
+ import * as QRCode from 'qrcode'; // qrcode has no default export; use namespace import for toCanvas
1596
+ &nbsp;
1597
+ import { LoggerService } from '../../../services/logger.service';
1598
+ &nbsp;
1599
+ /**
1600
+ * Connection state for the QR pairing step.
1601
+ *
1602
+ * States:
1603
+ * - loading: Generating session invite
1604
+ * - displaying: Showing QR code for wallet to scan
1605
+ * - waiting_wallet: QR scanned, waiting for wallet to connect via Nostr
1606
+ * - waiting_approval: Wallet connected, waiting for user to approve
1607
+ * - connected: Session approved and connected
1608
+ * - expired: QR code expired
1609
+ * - error: An error occurred
1610
+ */
1611
+ export type QrPairingState =
1612
+ | 'loading'
1613
+ | 'displaying'
1614
+ | 'waiting_wallet'
1615
+ | 'waiting_approval'
1616
+ | 'connected'
1617
+ | 'expired'
1618
+ | 'error';
1619
+ &nbsp;
1620
+ /**
1621
+ * QR Pairing Step Component
1622
+ *
1623
+ * Implements single-QR Nostr-first pairing for cross-device P2P connections.
1624
+ * Much simpler than the previous 2-QR WebRTC approach.
1625
+ */
1626
+ @Component({
1627
+ selector: 'hsuite-qr-pairing-step',
1628
+ standalone: true,
1629
+ changeDetection: ChangeDetectionStrategy.OnPush,
1630
+ imports: [CommonModule, IonIcon, IonSpinner, IonButton],
1631
+ template: `
1632
+ &lt;div class="qr-pairing-container"&gt;
1633
+ &lt;!-- Hidden canvas for QR generation - always rendered --&gt;
1634
+ &lt;canvas #qrCanvas width="300" height="300" class="hidden-canvas"&gt;&lt;/canvas&gt;
1635
+ &nbsp;
1636
+ &lt;!-- Loading State --&gt;
1637
+ &lt;div *ngIf="pairingState() === 'loading'" class="state-panel loading"&gt;
1638
+ &lt;ion-spinner name="crescent"&gt;&lt;/ion-spinner&gt;
1639
+ &lt;p&gt;Generating secure connection...&lt;/p&gt;
1640
+ &lt;/div&gt;
1641
+ &nbsp;
1642
+ &lt;!-- QR Display State --&gt;
1643
+ &lt;div *ngIf="pairingState() === 'displaying'" class="qr-display"&gt;
1644
+ &lt;div class="qr-header"&gt;
1645
+ &lt;h3&gt;Scan with Your Wallet&lt;/h3&gt;
1646
+ &lt;p class="qr-subtitle"&gt;Open HSuite Wallet and scan this QR code&lt;/p&gt;
1647
+ &lt;/div&gt;
1648
+ &nbsp;
1649
+ &lt;div class="qr-wrapper"&gt;
1650
+ &lt;canvas #qrCanvasDisplay width="300" height="300"&gt;&lt;/canvas&gt;
1651
+ &lt;/div&gt;
1652
+ &nbsp;
1653
+ &lt;div class="qr-meta"&gt;
1654
+ &lt;div class="countdown" [class.warning]="countdown() &lt; 30"&gt;
1655
+ &lt;ion-icon name="time-outline"&gt;&lt;/ion-icon&gt;
1656
+ &lt;span&gt;{{ formatCountdown() }}&lt;/span&gt;
1657
+ &lt;/div&gt;
1658
+ &lt;ion-button fill="clear" size="small" (click)="copyUri()"&gt;
1659
+ &lt;ion-icon
1660
+ slot="icon-only"
1661
+ [name]="copied() ? 'checkmark-outline' : 'copy-outline'"
1662
+ &gt;&lt;/ion-icon&gt;
1663
+ &lt;/ion-button&gt;
1664
+ &lt;/div&gt;
1665
+ &nbsp;
1666
+ &lt;div class="instructions"&gt;
1667
+ &lt;ol&gt;
1668
+ &lt;li&gt;Open HSuite Wallet on your phone&lt;/li&gt;
1669
+ &lt;li&gt;Go to Sessions tab&lt;/li&gt;
1670
+ &lt;li&gt;Tap "Scan QR" and scan this code&lt;/li&gt;
1671
+ &lt;/ol&gt;
1672
+ &lt;/div&gt;
1673
+ &lt;/div&gt;
1674
+ &nbsp;
1675
+ &lt;!-- Waiting for Wallet State --&gt;
1676
+ &lt;div *ngIf="pairingState() === 'waiting_wallet'" class="state-panel waiting"&gt;
1677
+ &lt;div class="waiting-icon-wrapper"&gt;
1678
+ &lt;ion-spinner name="crescent"&gt;&lt;/ion-spinner&gt;
1679
+ &lt;/div&gt;
1680
+ &lt;h3&gt;Waiting for Wallet&lt;/h3&gt;
1681
+ &lt;p class="waiting-description"&gt;Scan the QR code with your wallet app to connect.&lt;/p&gt;
1682
+ &lt;/div&gt;
1683
+ &nbsp;
1684
+ &lt;!-- Waiting for Approval State --&gt;
1685
+ &lt;div *ngIf="pairingState() === 'waiting_approval'" class="state-panel waiting-approval"&gt;
1686
+ &lt;div class="waiting-icon-wrapper"&gt;
1687
+ &lt;ion-spinner name="crescent"&gt;&lt;/ion-spinner&gt;
1688
+ &lt;/div&gt;
1689
+ &lt;h3&gt;Waiting for Wallet Approval&lt;/h3&gt;
1690
+ &lt;p class="waiting-description"&gt;
1691
+ The wallet is connected. Please approve the session in your wallet app.
1692
+ &lt;/p&gt;
1693
+ &lt;div class="waiting-steps"&gt;
1694
+ &lt;div class="waiting-step"&gt;
1695
+ &lt;span class="step-check"&gt;&amp;#10003;&lt;/span&gt;
1696
+ &lt;span&gt;QR code scanned&lt;/span&gt;
1697
+ &lt;/div&gt;
1698
+ &lt;div class="waiting-step"&gt;
1699
+ &lt;span class="step-check"&gt;&amp;#10003;&lt;/span&gt;
1700
+ &lt;span&gt;Wallet connected&lt;/span&gt;
1701
+ &lt;/div&gt;
1702
+ &lt;div class="waiting-step active"&gt;
1703
+ &lt;ion-spinner name="dots"&gt;&lt;/ion-spinner&gt;
1704
+ &lt;span&gt;Awaiting approval in wallet...&lt;/span&gt;
1705
+ &lt;/div&gt;
1706
+ &lt;/div&gt;
1707
+ &lt;/div&gt;
1708
+ &nbsp;
1709
+ &lt;!-- Connected State --&gt;
1710
+ &lt;div *ngIf="pairingState() === 'connected'" class="state-panel connected"&gt;
1711
+ &lt;ion-icon name="checkmark-circle-outline" color="success"&gt;&lt;/ion-icon&gt;
1712
+ &lt;p&gt;Connected successfully!&lt;/p&gt;
1713
+ &lt;/div&gt;
1714
+ &nbsp;
1715
+ &lt;!-- Error State --&gt;
1716
+ &lt;div *ngIf="pairingState() === 'error'" class="state-panel error"&gt;
1717
+ &lt;ion-icon name="close-circle-outline" color="danger"&gt;&lt;/ion-icon&gt;
1718
+ &lt;p&gt;{{ errorMessage || 'Connection failed' }}&lt;/p&gt;
1719
+ &lt;ion-button fill="outline" (click)="refresh()"&gt;
1720
+ &lt;ion-icon slot="start" name="refresh-outline"&gt;&lt;/ion-icon&gt;
1721
+ Try Again
1722
+ &lt;/ion-button&gt;
1723
+ &lt;/div&gt;
1724
+ &nbsp;
1725
+ &lt;!-- Expired State --&gt;
1726
+ &lt;div *ngIf="pairingState() === 'expired'" class="state-panel expired"&gt;
1727
+ &lt;ion-icon name="time-outline" color="warning"&gt;&lt;/ion-icon&gt;
1728
+ &lt;p&gt;QR code expired&lt;/p&gt;
1729
+ &lt;ion-button fill="outline" (click)="refresh()"&gt;
1730
+ &lt;ion-icon slot="start" name="refresh-outline"&gt;&lt;/ion-icon&gt;
1731
+ Generate New
1732
+ &lt;/ion-button&gt;
1733
+ &lt;/div&gt;
1734
+ &nbsp;
1735
+ &lt;!-- Footer Actions (cancel) - hidden during waiting/connected --&gt;
1736
+ &lt;div
1737
+ class="footer-actions"
1738
+ *ngIf="!['waiting_wallet', 'waiting_approval', 'connected'].includes(pairingState())"
1739
+ &gt;
1740
+ &lt;ion-button fill="clear" (click)="cancel()"&gt;
1741
+ &lt;ion-icon slot="start" name="arrow-back-outline"&gt;&lt;/ion-icon&gt;
1742
+ Cancel
1743
+ &lt;/ion-button&gt;
1744
+ &lt;/div&gt;
1745
+ &lt;/div&gt;
1746
+ `,
1747
+ styles: [
1748
+ `
1749
+ .qr-pairing-container {
1750
+ display: flex;
1751
+ flex-direction: column;
1752
+ padding: 1rem;
1753
+ min-height: 400px;
1754
+ }
1755
+ &nbsp;
1756
+ .hidden-canvas {
1757
+ position: absolute;
1758
+ left: -9999px;
1759
+ top: -9999px;
1760
+ visibility: hidden;
1761
+ }
1762
+ &nbsp;
1763
+ .qr-display {
1764
+ display: flex;
1765
+ flex-direction: column;
1766
+ align-items: center;
1767
+ flex: 1;
1768
+ }
1769
+ &nbsp;
1770
+ .qr-header {
1771
+ text-align: center;
1772
+ margin-bottom: 1.5rem;
1773
+ }
1774
+ &nbsp;
1775
+ .qr-header h3 {
1776
+ margin: 0 0 0.5rem 0;
1777
+ font-size: 1.25rem;
1778
+ font-weight: 600;
1779
+ }
1780
+ &nbsp;
1781
+ .qr-subtitle {
1782
+ margin: 0;
1783
+ color: var(--ion-color-medium-shade);
1784
+ font-size: 0.875rem;
1785
+ }
1786
+ &nbsp;
1787
+ .qr-wrapper {
1788
+ display: flex;
1789
+ justify-content: center;
1790
+ padding: 1rem;
1791
+ background: white;
1792
+ border-radius: 12px;
1793
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1794
+ margin-bottom: 1rem;
1795
+ }
1796
+ &nbsp;
1797
+ .qr-meta {
1798
+ display: flex;
1799
+ justify-content: center;
1800
+ align-items: center;
1801
+ gap: 1rem;
1802
+ margin-bottom: 1rem;
1803
+ }
1804
+ &nbsp;
1805
+ .countdown {
1806
+ display: flex;
1807
+ align-items: center;
1808
+ gap: 0.25rem;
1809
+ padding: 0.25rem 0.75rem;
1810
+ background: var(--ion-color-light);
1811
+ border-radius: 1rem;
1812
+ font-size: 0.875rem;
1813
+ }
1814
+ &nbsp;
1815
+ .countdown.warning {
1816
+ background: var(--ion-color-warning-tint);
1817
+ color: var(--ion-color-warning-shade);
1818
+ }
1819
+ &nbsp;
1820
+ .instructions {
1821
+ margin-bottom: 1rem;
1822
+ width: 100%;
1823
+ max-width: 300px;
1824
+ }
1825
+ &nbsp;
1826
+ .instructions ol {
1827
+ text-align: left;
1828
+ padding-left: 1.25rem;
1829
+ margin: 0;
1830
+ }
1831
+ &nbsp;
1832
+ .instructions li {
1833
+ margin-bottom: 0.5rem;
1834
+ color: var(--ion-color-medium-shade);
1835
+ font-size: 0.875rem;
1836
+ }
1837
+ &nbsp;
1838
+ .state-panel {
1839
+ display: flex;
1840
+ flex-direction: column;
1841
+ align-items: center;
1842
+ justify-content: center;
1843
+ gap: 1rem;
1844
+ flex: 1;
1845
+ text-align: center;
1846
+ }
1847
+ &nbsp;
1848
+ .state-panel ion-spinner {
1849
+ width: 48px;
1850
+ height: 48px;
1851
+ }
1852
+ &nbsp;
1853
+ .state-panel ion-icon {
1854
+ font-size: 64px;
1855
+ }
1856
+ &nbsp;
1857
+ /* Waiting States */
1858
+ .waiting,
1859
+ .waiting-approval {
1860
+ padding: 1.5rem;
1861
+ }
1862
+ &nbsp;
1863
+ .waiting h3,
1864
+ .waiting-approval h3 {
1865
+ margin: 0 0 0.5rem 0;
1866
+ font-size: 1.25rem;
1867
+ font-weight: 600;
1868
+ color: var(--ion-color-primary);
1869
+ }
1870
+ &nbsp;
1871
+ .waiting-description {
1872
+ color: var(--ion-color-medium-shade);
1873
+ font-size: 0.9rem;
1874
+ margin-bottom: 1.5rem;
1875
+ max-width: 280px;
1876
+ }
1877
+ &nbsp;
1878
+ .waiting-icon-wrapper {
1879
+ width: 80px;
1880
+ height: 80px;
1881
+ border-radius: 50%;
1882
+ background: var(--ion-color-primary-tint);
1883
+ display: flex;
1884
+ align-items: center;
1885
+ justify-content: center;
1886
+ margin-bottom: 1rem;
1887
+ }
1888
+ &nbsp;
1889
+ .waiting-icon-wrapper ion-spinner {
1890
+ width: 40px;
1891
+ height: 40px;
1892
+ --color: var(--ion-color-primary);
1893
+ }
1894
+ &nbsp;
1895
+ .waiting-steps {
1896
+ display: flex;
1897
+ flex-direction: column;
1898
+ gap: 0.75rem;
1899
+ padding: 1rem;
1900
+ background: var(--ion-color-light);
1901
+ border-radius: 12px;
1902
+ width: 100%;
1903
+ max-width: 280px;
1904
+ }
1905
+ &nbsp;
1906
+ .waiting-step {
1907
+ display: flex;
1908
+ align-items: center;
1909
+ gap: 0.75rem;
1910
+ font-size: 0.875rem;
1911
+ color: var(--ion-color-medium-shade);
1912
+ }
1913
+ &nbsp;
1914
+ .waiting-step .step-check {
1915
+ width: 20px;
1916
+ height: 20px;
1917
+ border-radius: 50%;
1918
+ background: var(--ion-color-success);
1919
+ color: white;
1920
+ font-size: 0.75rem;
1921
+ display: flex;
1922
+ align-items: center;
1923
+ justify-content: center;
1924
+ flex-shrink: 0;
1925
+ }
1926
+ &nbsp;
1927
+ .waiting-step.active {
1928
+ color: var(--ion-color-primary);
1929
+ font-weight: 500;
1930
+ }
1931
+ &nbsp;
1932
+ .waiting-step.active ion-spinner {
1933
+ width: 20px;
1934
+ height: 20px;
1935
+ --color: var(--ion-color-primary);
1936
+ }
1937
+ &nbsp;
1938
+ .footer-actions {
1939
+ margin-top: auto;
1940
+ padding-top: 1rem;
1941
+ border-top: 1px solid var(--ion-color-light);
1942
+ display: flex;
1943
+ justify-content: center;
1944
+ }
1945
+ `,
1946
+ ],
1947
+ })
1948
+ export class QrPairingStepComponent implements AfterViewInit, OnChanges, OnDestroy <span class="fstat-no" title="function not covered" >{</span>
1949
1949
  <span class="cstat-no" title="statement not covered" > private readonly logger = inject(LoggerService).scoped('QrPairingStep');</span>
1950
1950
  <span class="cstat-no" title="statement not covered" ></span>
1951
1951
  <span class="cstat-no" title="statement not covered" > /**</span>
@@ -2272,7 +2272,7 @@
2272
2272
  <div class='footer quiet pad2 space-top1 center small'>
2273
2273
  Code coverage generated by
2274
2274
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2275
- at 2026-06-02T14:30:38.257Z
2275
+ at 2026-06-10T09:00:36.727Z
2276
2276
  </div>
2277
2277
  <script src="../../../../prettify.js"></script>
2278
2278
  <script>