@hsuite/native-connect-angular 1.0.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 (276) hide show
  1. package/README.md +48 -0
  2. package/USAGE_EXAMPLES.md +476 -0
  3. package/assets/wallets/extension.svg +7 -0
  4. package/assets/wallets/hashpack.svg +6 -0
  5. package/assets/wallets/hsuite.svg +11 -0
  6. package/assets/wallets/kabila.svg +11 -0
  7. package/assets/wallets/walletconnect.svg +13 -0
  8. package/coverage/base.css +224 -0
  9. package/coverage/block-navigation.js +87 -0
  10. package/coverage/coverage-summary.json +50 -0
  11. package/coverage/favicon.png +0 -0
  12. package/coverage/index.html +476 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +476 -0
  17. package/coverage/lcov-report/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  18. package/coverage/lcov-report/lib/components/account-selector/account-actions/index.html +116 -0
  19. package/coverage/lcov-report/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  20. package/coverage/lcov-report/lib/components/account-selector/account-filter/index.html +116 -0
  21. package/coverage/lcov-report/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  22. package/coverage/lcov-report/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  23. package/coverage/lcov-report/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  24. package/coverage/lcov-report/lib/components/account-selector/account-list/index.html +116 -0
  25. package/coverage/lcov-report/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  26. package/coverage/lcov-report/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  27. package/coverage/lcov-report/lib/components/account-selector/index.html +161 -0
  28. package/coverage/lcov-report/lib/components/wallet-account-display/index.html +116 -0
  29. package/coverage/lcov-report/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  30. package/coverage/lcov-report/lib/components/wallet-connect-button/index.html +116 -0
  31. package/coverage/lcov-report/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  32. package/coverage/lcov-report/lib/components/wallet-connect-prompt/index.html +116 -0
  33. package/coverage/lcov-report/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  34. package/coverage/lcov-report/lib/components/wallet-connected-guard/index.html +116 -0
  35. package/coverage/lcov-report/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  36. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  37. package/coverage/lcov-report/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  38. package/coverage/lcov-report/lib/components/wallet-connection-modal/index.html +116 -0
  39. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  40. package/coverage/lcov-report/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  41. package/coverage/lcov-report/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  42. package/coverage/lcov-report/lib/components/wallet-session-display/index.html +116 -0
  43. package/coverage/lcov-report/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  44. package/coverage/lcov-report/lib/components/wallet-transaction-status/index.html +116 -0
  45. package/coverage/lcov-report/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  46. package/coverage/lcov-report/lib/directives/index.html +146 -0
  47. package/coverage/lcov-report/lib/directives/wallet-connected.directive.ts.html +670 -0
  48. package/coverage/lcov-report/lib/directives/wallet-context.directive.ts.html +547 -0
  49. package/coverage/lcov-report/lib/directives/wallet-events.directive.ts.html +781 -0
  50. package/coverage/lcov-report/lib/hsuite-wallet.module.ts.html +715 -0
  51. package/coverage/lcov-report/lib/index.html +116 -0
  52. package/coverage/lcov-report/lib/models/connection-config.model.ts.html +280 -0
  53. package/coverage/lcov-report/lib/models/index.html +131 -0
  54. package/coverage/lcov-report/lib/models/provider-types.ts.html +577 -0
  55. package/coverage/lcov-report/lib/providers/base-wallet-provider.ts.html +1138 -0
  56. package/coverage/lcov-report/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  57. package/coverage/lcov-report/lib/providers/hsuite-native/index.html +116 -0
  58. package/coverage/lcov-report/lib/providers/hsuite-native-provider.ts.html +2347 -0
  59. package/coverage/lcov-report/lib/providers/index.html +146 -0
  60. package/coverage/lcov-report/lib/providers/p2p-native/index.html +131 -0
  61. package/coverage/lcov-report/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  62. package/coverage/lcov-report/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  63. package/coverage/lcov-report/lib/providers/wallet-error-handler.ts.html +1132 -0
  64. package/coverage/lcov-report/lib/providers/walletconnect/core/index.html +176 -0
  65. package/coverage/lcov-report/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  66. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  67. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  68. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  69. package/coverage/lcov-report/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  70. package/coverage/lcov-report/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  71. package/coverage/lcov-report/lib/providers/walletconnect/signers/index.html +146 -0
  72. package/coverage/lcov-report/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  73. package/coverage/lcov-report/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  74. package/coverage/lcov-report/lib/services/index.html +191 -0
  75. package/coverage/lcov-report/lib/services/logger.service.ts.html +463 -0
  76. package/coverage/lcov-report/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  77. package/coverage/lcov-report/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  78. package/coverage/lcov-report/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  79. package/coverage/lcov-report/lib/services/transaction-builders/index.html +161 -0
  80. package/coverage/lcov-report/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  81. package/coverage/lcov-report/lib/services/transaction.service.ts.html +1123 -0
  82. package/coverage/lcov-report/lib/services/unified-wallet.service.ts.html +2641 -0
  83. package/coverage/lcov-report/lib/services/wallet-context.service.ts.html +637 -0
  84. package/coverage/lcov-report/lib/services/wallet-event-bus.service.ts.html +643 -0
  85. package/coverage/lcov-report/lib/services/wallet-providers.service.ts.html +496 -0
  86. package/coverage/lcov-report/lib/transports/chrome-extension-transport.ts.html +823 -0
  87. package/coverage/lcov-report/lib/transports/index.html +116 -0
  88. package/coverage/lcov-report/lib/utils/index.html +116 -0
  89. package/coverage/lcov-report/lib/utils/ledger-icons.util.ts.html +319 -0
  90. package/coverage/lcov-report/prettify.css +1 -0
  91. package/coverage/lcov-report/prettify.js +2 -0
  92. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  93. package/coverage/lcov-report/sorter.js +210 -0
  94. package/coverage/lcov.info +19252 -0
  95. package/coverage/lib/components/account-selector/account-actions/account-actions.component.ts.html +868 -0
  96. package/coverage/lib/components/account-selector/account-actions/index.html +116 -0
  97. package/coverage/lib/components/account-selector/account-filter/account-filter.component.ts.html +1288 -0
  98. package/coverage/lib/components/account-selector/account-filter/index.html +116 -0
  99. package/coverage/lib/components/account-selector/account-formatting.service.ts.html +685 -0
  100. package/coverage/lib/components/account-selector/account-grouping.service.ts.html +766 -0
  101. package/coverage/lib/components/account-selector/account-list/account-list.component.ts.html +1495 -0
  102. package/coverage/lib/components/account-selector/account-list/index.html +116 -0
  103. package/coverage/lib/components/account-selector/account-selector.component.ts.html +1495 -0
  104. package/coverage/lib/components/account-selector/account-selector.service.ts.html +1588 -0
  105. package/coverage/lib/components/account-selector/index.html +161 -0
  106. package/coverage/lib/components/wallet-account-display/index.html +116 -0
  107. package/coverage/lib/components/wallet-account-display/wallet-account-display.component.ts.html +505 -0
  108. package/coverage/lib/components/wallet-connect-button/index.html +116 -0
  109. package/coverage/lib/components/wallet-connect-button/wallet-connect-button.component.ts.html +805 -0
  110. package/coverage/lib/components/wallet-connect-prompt/index.html +116 -0
  111. package/coverage/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts.html +409 -0
  112. package/coverage/lib/components/wallet-connected-guard/index.html +116 -0
  113. package/coverage/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts.html +304 -0
  114. package/coverage/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts.html +436 -0
  115. package/coverage/lib/components/wallet-connection-modal/connection-method-step/index.html +116 -0
  116. package/coverage/lib/components/wallet-connection-modal/index.html +116 -0
  117. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/index.html +116 -0
  118. package/coverage/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts.html +2287 -0
  119. package/coverage/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts.html +2275 -0
  120. package/coverage/lib/components/wallet-session-display/index.html +116 -0
  121. package/coverage/lib/components/wallet-session-display/wallet-session-display.component.ts.html +676 -0
  122. package/coverage/lib/components/wallet-transaction-status/index.html +116 -0
  123. package/coverage/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts.html +703 -0
  124. package/coverage/lib/directives/index.html +146 -0
  125. package/coverage/lib/directives/wallet-connected.directive.ts.html +670 -0
  126. package/coverage/lib/directives/wallet-context.directive.ts.html +547 -0
  127. package/coverage/lib/directives/wallet-events.directive.ts.html +781 -0
  128. package/coverage/lib/hsuite-wallet.module.ts.html +715 -0
  129. package/coverage/lib/index.html +116 -0
  130. package/coverage/lib/models/connection-config.model.ts.html +280 -0
  131. package/coverage/lib/models/index.html +131 -0
  132. package/coverage/lib/models/provider-types.ts.html +577 -0
  133. package/coverage/lib/providers/base-wallet-provider.ts.html +1138 -0
  134. package/coverage/lib/providers/hsuite-native/channel-client.service.ts.html +2671 -0
  135. package/coverage/lib/providers/hsuite-native/index.html +116 -0
  136. package/coverage/lib/providers/hsuite-native-provider.ts.html +2347 -0
  137. package/coverage/lib/providers/index.html +146 -0
  138. package/coverage/lib/providers/p2p-native/index.html +131 -0
  139. package/coverage/lib/providers/p2p-native/p2p-native.provider.ts.html +2254 -0
  140. package/coverage/lib/providers/p2p-native/p2p-session-manager.ts.html +2170 -0
  141. package/coverage/lib/providers/wallet-error-handler.ts.html +1132 -0
  142. package/coverage/lib/providers/walletconnect/core/index.html +176 -0
  143. package/coverage/lib/providers/walletconnect/core/session-health.ts.html +673 -0
  144. package/coverage/lib/providers/walletconnect/core/walletconnect-client-manager.ts.html +1177 -0
  145. package/coverage/lib/providers/walletconnect/core/walletconnect-provider.ts.html +2563 -0
  146. package/coverage/lib/providers/walletconnect/core/walletconnect-session-store.ts.html +904 -0
  147. package/coverage/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts.html +982 -0
  148. package/coverage/lib/providers/walletconnect/signers/hedera-signer.ts.html +1915 -0
  149. package/coverage/lib/providers/walletconnect/signers/index.html +146 -0
  150. package/coverage/lib/providers/walletconnect/signers/signer-factory.ts.html +445 -0
  151. package/coverage/lib/providers/walletconnect/signers/xrpl-signer.ts.html +1519 -0
  152. package/coverage/lib/services/index.html +191 -0
  153. package/coverage/lib/services/logger.service.ts.html +463 -0
  154. package/coverage/lib/services/transaction-builders/base-transaction-builder.service.ts.html +1840 -0
  155. package/coverage/lib/services/transaction-builders/hedera-amount-utils.ts.html +337 -0
  156. package/coverage/lib/services/transaction-builders/hedera-transaction-builder.service.ts.html +3940 -0
  157. package/coverage/lib/services/transaction-builders/index.html +161 -0
  158. package/coverage/lib/services/transaction-builders/xrpl-transaction-builder.service.ts.html +2581 -0
  159. package/coverage/lib/services/transaction.service.ts.html +1123 -0
  160. package/coverage/lib/services/unified-wallet.service.ts.html +2641 -0
  161. package/coverage/lib/services/wallet-context.service.ts.html +637 -0
  162. package/coverage/lib/services/wallet-event-bus.service.ts.html +643 -0
  163. package/coverage/lib/services/wallet-providers.service.ts.html +496 -0
  164. package/coverage/lib/transports/chrome-extension-transport.ts.html +823 -0
  165. package/coverage/lib/transports/index.html +116 -0
  166. package/coverage/lib/utils/index.html +116 -0
  167. package/coverage/lib/utils/ledger-icons.util.ts.html +319 -0
  168. package/coverage/prettify.css +1 -0
  169. package/coverage/prettify.js +2 -0
  170. package/coverage/sort-arrow-sprite.png +0 -0
  171. package/coverage/sorter.js +210 -0
  172. package/dist/README.md +48 -0
  173. package/dist/fesm2022/hsuite-native-connect-angular.mjs +14592 -0
  174. package/dist/fesm2022/hsuite-native-connect-angular.mjs.map +1 -0
  175. package/dist/index.d.ts +6949 -0
  176. package/examples/minimal-connect.ts +178 -0
  177. package/examples/multi-protocol.ts +495 -0
  178. package/examples/transaction-signing.ts +361 -0
  179. package/jest.config.json +45 -0
  180. package/karma.conf.js +42 -0
  181. package/ng-package.json +20 -0
  182. package/package.json +60 -0
  183. package/src/index.ts +203 -0
  184. package/src/lib/components/account-selector/account-actions/account-actions.component.ts +261 -0
  185. package/src/lib/components/account-selector/account-filter/account-filter.component.ts +401 -0
  186. package/src/lib/components/account-selector/account-formatting.service.ts +200 -0
  187. package/src/lib/components/account-selector/account-grouping.service.ts +227 -0
  188. package/src/lib/components/account-selector/account-list/account-list.component.ts +470 -0
  189. package/src/lib/components/account-selector/account-selector.component.html +135 -0
  190. package/src/lib/components/account-selector/account-selector.component.scss +2039 -0
  191. package/src/lib/components/account-selector/account-selector.component.ts +470 -0
  192. package/src/lib/components/account-selector/account-selector.service.ts +501 -0
  193. package/src/lib/components/wallet-account-display/wallet-account-display.component.html +34 -0
  194. package/src/lib/components/wallet-account-display/wallet-account-display.component.scss +99 -0
  195. package/src/lib/components/wallet-account-display/wallet-account-display.component.ts +140 -0
  196. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.html +14 -0
  197. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.scss +272 -0
  198. package/src/lib/components/wallet-connect-button/wallet-connect-button.component.ts +240 -0
  199. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.html +24 -0
  200. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.scss +50 -0
  201. package/src/lib/components/wallet-connect-prompt/wallet-connect-prompt.component.ts +108 -0
  202. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.html +24 -0
  203. package/src/lib/components/wallet-connected-guard/wallet-connected-guard.component.ts +73 -0
  204. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.html +56 -0
  205. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.scss +218 -0
  206. package/src/lib/components/wallet-connection-modal/connection-method-step/connection-method-step.component.ts +117 -0
  207. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.html +94 -0
  208. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.scss +272 -0
  209. package/src/lib/components/wallet-connection-modal/qr-pairing-step/qr-pairing-step.component.ts +734 -0
  210. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.html +197 -0
  211. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.scss +678 -0
  212. package/src/lib/components/wallet-connection-modal/wallet-connection-modal.component.ts +730 -0
  213. package/src/lib/components/wallet-session-display/wallet-session-display.component.html +110 -0
  214. package/src/lib/components/wallet-session-display/wallet-session-display.component.scss +179 -0
  215. package/src/lib/components/wallet-session-display/wallet-session-display.component.ts +197 -0
  216. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.html +65 -0
  217. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.scss +254 -0
  218. package/src/lib/components/wallet-transaction-status/wallet-transaction-status.component.ts +206 -0
  219. package/src/lib/directives/wallet-connected.directive.ts +195 -0
  220. package/src/lib/directives/wallet-context.directive.ts +154 -0
  221. package/src/lib/directives/wallet-events.directive.ts +232 -0
  222. package/src/lib/hsuite-wallet.module.ts +210 -0
  223. package/src/lib/models/connection-config.model.ts +65 -0
  224. package/src/lib/models/provider-types.ts +164 -0
  225. package/src/lib/models/unified-account.model.ts +76 -0
  226. package/src/lib/models/wallet-context.model.ts +121 -0
  227. package/src/lib/models/wallet-events.model.ts +158 -0
  228. package/src/lib/providers/base-wallet-provider.ts +351 -0
  229. package/src/lib/providers/hsuite-native/channel-client.service.spec.ts +73 -0
  230. package/src/lib/providers/hsuite-native/channel-client.service.ts +862 -0
  231. package/src/lib/providers/hsuite-native/index.ts +8 -0
  232. package/src/lib/providers/hsuite-native-provider.ts +754 -0
  233. package/src/lib/providers/mobile-native/mobile-native.provider.spec.ts +19 -0
  234. package/src/lib/providers/p2p-native/index.ts +30 -0
  235. package/src/lib/providers/p2p-native/p2p-native.provider.spec.ts +523 -0
  236. package/src/lib/providers/p2p-native/p2p-native.provider.ts +723 -0
  237. package/src/lib/providers/p2p-native/p2p-session-manager.ts +695 -0
  238. package/src/lib/providers/wallet-error-handler.ts +349 -0
  239. package/src/lib/providers/walletconnect/core/base-signer.interface.ts +122 -0
  240. package/src/lib/providers/walletconnect/core/session-health.ts +196 -0
  241. package/src/lib/providers/walletconnect/core/walletconnect-client-manager.ts +364 -0
  242. package/src/lib/providers/walletconnect/core/walletconnect-provider.integration.spec.ts +348 -0
  243. package/src/lib/providers/walletconnect/core/walletconnect-provider.ts +826 -0
  244. package/src/lib/providers/walletconnect/core/walletconnect-session-store.ts +273 -0
  245. package/src/lib/providers/walletconnect/core/walletconnect-signing-orchestrator.ts +299 -0
  246. package/src/lib/providers/walletconnect/core/walletconnect-types.ts +48 -0
  247. package/src/lib/providers/walletconnect/index.ts +33 -0
  248. package/src/lib/providers/walletconnect/signers/hedera-signer.spec.ts +367 -0
  249. package/src/lib/providers/walletconnect/signers/hedera-signer.ts +610 -0
  250. package/src/lib/providers/walletconnect/signers/signer-factory.spec.ts +62 -0
  251. package/src/lib/providers/walletconnect/signers/signer-factory.ts +120 -0
  252. package/src/lib/providers/walletconnect/signers/xrpl-signer.spec.ts +296 -0
  253. package/src/lib/providers/walletconnect/signers/xrpl-signer.ts +478 -0
  254. package/src/lib/services/logger.service.ts +126 -0
  255. package/src/lib/services/transaction-builders/base-transaction-builder.service.ts +585 -0
  256. package/src/lib/services/transaction-builders/hedera-amount-utils.ts +84 -0
  257. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.spec.ts +741 -0
  258. package/src/lib/services/transaction-builders/hedera-transaction-builder.service.ts +1285 -0
  259. package/src/lib/services/transaction-builders/index.ts +54 -0
  260. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.spec.ts +937 -0
  261. package/src/lib/services/transaction-builders/xrpl-transaction-builder.service.ts +832 -0
  262. package/src/lib/services/transaction.service.ts +346 -0
  263. package/src/lib/services/unified-wallet.service.spec.ts +1382 -0
  264. package/src/lib/services/unified-wallet.service.ts +852 -0
  265. package/src/lib/services/wallet-context.service.ts +184 -0
  266. package/src/lib/services/wallet-event-bus.service.ts +186 -0
  267. package/src/lib/services/wallet-providers.service.ts +137 -0
  268. package/src/lib/transports/chrome-extension-transport.ts +246 -0
  269. package/src/lib/utils/index.ts +14 -0
  270. package/src/lib/utils/ledger-icons.util.ts +78 -0
  271. package/test/test-setup.ts +21 -0
  272. package/test-setup.ts +63 -0
  273. package/tsconfig.build.json +11 -0
  274. package/tsconfig.json +29 -0
  275. package/tsconfig.spec.json +15 -0
  276. package/vitest.config.ts +48 -0
@@ -0,0 +1,2170 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for lib/providers/p2p-native/p2p-session-manager.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">lib/providers/p2p-native</a> p2p-session-manager.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/695</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/695</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-no">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-no">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-no">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&nbsp;</span>
795
+ <span class="cline-any cline-no">&nbsp;</span>
796
+ <span class="cline-any cline-no">&nbsp;</span>
797
+ <span class="cline-any cline-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <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>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-no">&nbsp;</span>
1121
+ <span class="cline-any cline-no">&nbsp;</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-no">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-no">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-no">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-no">&nbsp;</span>
1314
+ <span class="cline-any cline-no">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
1318
+ <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-no">&nbsp;</span>
1323
+ <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-no">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-no">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
1335
+ <span class="cline-any cline-no">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-no">&nbsp;</span>
1343
+ <span class="cline-any cline-no">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-no">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-no">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-no">&nbsp;</span>
1355
+ <span class="cline-any cline-no">&nbsp;</span>
1356
+ <span class="cline-any cline-no">&nbsp;</span>
1357
+ <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-no">&nbsp;</span>
1359
+ <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-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>
1457
+ <span class="cstat-no" title="statement not covered" > * HSuite Native Connect</span>
1458
+ <span class="cstat-no" title="statement not covered" > * Copyright 2024-2025 HSuite (https://hsuite.finance)</span>
1459
+ <span class="cstat-no" title="statement not covered" > *</span>
1460
+ <span class="cstat-no" title="statement not covered" > * SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0</span>
1461
+ <span class="cstat-no" title="statement not covered" > *</span>
1462
+ <span class="cstat-no" title="statement not covered" > * This file is part of HSuite Native Connect. For commercial licensing,</span>
1463
+ <span class="cstat-no" title="statement not covered" > * visit https://hsuite.finance/licensing</span>
1464
+ <span class="cstat-no" title="statement not covered" > */</span>
1465
+ <span class="cstat-no" title="statement not covered" ></span>
1466
+ <span class="cstat-no" title="statement not covered" >/**</span>
1467
+ <span class="cstat-no" title="statement not covered" > * @file p2p-session-manager.ts</span>
1468
+ <span class="cstat-no" title="statement not covered" > * @description Session management for P2P Native connections (dApp-side)</span>
1469
+ <span class="cstat-no" title="statement not covered" > *</span>
1470
+ <span class="cstat-no" title="statement not covered" > * Manages Nostr-first P2P connections for wallet pairing (both mobile and desktop).</span>
1471
+ <span class="cstat-no" title="statement not covered" > * The dApp creates a session invite QR code that the wallet scans.</span>
1472
+ <span class="cstat-no" title="statement not covered" > * Communication starts via Nostr relays and upgrades to WebRTC P2P when possible.</span>
1473
+ <span class="cstat-no" title="statement not covered" > *</span>
1474
+ <span class="cstat-no" title="statement not covered" > * **Architecture Notes:**</span>
1475
+ <span class="cstat-no" title="statement not covered" > * - Uses the unified ChannelClient for Nostr/P2P communication</span>
1476
+ <span class="cstat-no" title="statement not covered" > * - Single QR code scanning (no 2-phase exchange)</span>
1477
+ <span class="cstat-no" title="statement not covered" > * - Session negotiation via Nostr, then P2P upgrade</span>
1478
+ <span class="cstat-no" title="statement not covered" > * - RPC communication over best available transport</span>
1479
+ <span class="cstat-no" title="statement not covered" > * - Session ownership remains with the wallet</span>
1480
+ <span class="cstat-no" title="statement not covered" > */</span>
1481
+ <span class="cstat-no" title="statement not covered" ></span>
1482
+ <span class="cstat-no" title="statement not covered" >import { Injectable, signal, type Signal, NgZone } from '@angular/core';</span>
1483
+ <span class="cstat-no" title="statement not covered" >import {</span>
1484
+ <span class="cstat-no" title="statement not covered" > ChannelClient,</span>
1485
+ <span class="cstat-no" title="statement not covered" > type ChannelInvite,</span>
1486
+ <span class="cstat-no" title="statement not covered" > type ChannelState,</span>
1487
+ <span class="cstat-no" title="statement not covered" > type TransportState,</span>
1488
+ <span class="cstat-no" title="statement not covered" > type ChannelAccount,</span>
1489
+ <span class="cstat-no" title="statement not covered" > encodeChannelInvite,</span>
1490
+ <span class="cstat-no" title="statement not covered" > getLogger,</span>
1491
+ <span class="cstat-no" title="statement not covered" >} from '@hsuite/native-connect-sdk';</span>
1492
+ <span class="cstat-no" title="statement not covered" ></span>
1493
+ <span class="cstat-no" title="statement not covered" >import type { UnifiedAccount } from '../../models/unified-account.model';</span>
1494
+ <span class="cstat-no" title="statement not covered" ></span>
1495
+ <span class="cstat-no" title="statement not covered" >const logger = getLogger().scoped?.('P2PSessionManager') ?? getLogger();</span>
1496
+ <span class="cstat-no" title="statement not covered" ></span>
1497
+ <span class="cstat-no" title="statement not covered" >/**</span>
1498
+ <span class="cstat-no" title="statement not covered" > * Connection state for P2P native sessions.</span>
1499
+ <span class="cstat-no" title="statement not covered" > *</span>
1500
+ <span class="cstat-no" title="statement not covered" > * States:</span>
1501
+ <span class="cstat-no" title="statement not covered" > * - idle: No connection attempt in progress</span>
1502
+ <span class="cstat-no" title="statement not covered" > * - creating_offer: Generating session invite for QR code</span>
1503
+ <span class="cstat-no" title="statement not covered" > * - awaiting_connection: QR displayed, waiting for wallet to scan and connect</span>
1504
+ <span class="cstat-no" title="statement not covered" > * - pending_approval: Wallet connected, waiting for user to approve session</span>
1505
+ <span class="cstat-no" title="statement not covered" > * - connected: Session approved and fully connected</span>
1506
+ <span class="cstat-no" title="statement not covered" > * - disconnected: Previously connected, now disconnected</span>
1507
+ <span class="cstat-no" title="statement not covered" > * - error: Connection or handshake error occurred</span>
1508
+ <span class="cstat-no" title="statement not covered" > */</span>
1509
+ <span class="cstat-no" title="statement not covered" >export type P2PConnectionState =</span>
1510
+ <span class="cstat-no" title="statement not covered" > | 'idle'</span>
1511
+ <span class="cstat-no" title="statement not covered" > | 'creating_offer'</span>
1512
+ <span class="cstat-no" title="statement not covered" > | 'awaiting_connection'</span>
1513
+ <span class="cstat-no" title="statement not covered" > | 'pending_approval'</span>
1514
+ <span class="cstat-no" title="statement not covered" > | 'connected'</span>
1515
+ <span class="cstat-no" title="statement not covered" > | 'disconnected'</span>
1516
+ <span class="cstat-no" title="statement not covered" > | 'error';</span>
1517
+ <span class="cstat-no" title="statement not covered" ></span>
1518
+ <span class="cstat-no" title="statement not covered" >/**</span>
1519
+ <span class="cstat-no" title="statement not covered" > * Options for creating a pairing offer</span>
1520
+ <span class="cstat-no" title="statement not covered" > */</span>
1521
+ <span class="cstat-no" title="statement not covered" >export interface CreateOfferOptions {</span>
1522
+ <span class="cstat-no" title="statement not covered" > appId: string;</span>
1523
+ <span class="cstat-no" title="statement not covered" > appName: string;</span>
1524
+ <span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
1525
+ <span class="cstat-no" title="statement not covered" > networkId: string;</span>
1526
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1527
+ <span class="cstat-no" title="statement not covered" >}</span>
1528
+ <span class="cstat-no" title="statement not covered" ></span>
1529
+ <span class="cstat-no" title="statement not covered" >/**</span>
1530
+ <span class="cstat-no" title="statement not covered" > * Result of creating a pairing offer</span>
1531
+ <span class="cstat-no" title="statement not covered" > */</span>
1532
+ <span class="cstat-no" title="statement not covered" >export interface CreateOfferResult {</span>
1533
+ <span class="cstat-no" title="statement not covered" > /** Encoded QR data (nostr+p2p://...) */</span>
1534
+ <span class="cstat-no" title="statement not covered" > qrData: string;</span>
1535
+ <span class="cstat-no" title="statement not covered" > /** Channel ID for this connection attempt */</span>
1536
+ <span class="cstat-no" title="statement not covered" > sessionId: string;</span>
1537
+ <span class="cstat-no" title="statement not covered" >}</span>
1538
+ <span class="cstat-no" title="statement not covered" ></span>
1539
+ <span class="cstat-no" title="statement not covered" >/**</span>
1540
+ <span class="cstat-no" title="statement not covered" > * Managed session data</span>
1541
+ <span class="cstat-no" title="statement not covered" > */</span>
1542
+ <span class="cstat-no" title="statement not covered" >export interface P2PSession {</span>
1543
+ <span class="cstat-no" title="statement not covered" > id: string;</span>
1544
+ <span class="cstat-no" title="statement not covered" > sessionId: string;</span>
1545
+ <span class="cstat-no" title="statement not covered" > appId: string;</span>
1546
+ <span class="cstat-no" title="statement not covered" > appName: string;</span>
1547
+ <span class="cstat-no" title="statement not covered" > ledgerId: string;</span>
1548
+ <span class="cstat-no" title="statement not covered" > networkId: string;</span>
1549
+ <span class="cstat-no" title="statement not covered" > accounts: UnifiedAccount[];</span>
1550
+ <span class="cstat-no" title="statement not covered" > permissions: string[];</span>
1551
+ <span class="cstat-no" title="statement not covered" > connectedAt: number;</span>
1552
+ <span class="cstat-no" title="statement not covered" >}</span>
1553
+ <span class="cstat-no" title="statement not covered" ></span>
1554
+ <span class="cstat-no" title="statement not covered" >/**</span>
1555
+ <span class="cstat-no" title="statement not covered" > * Transaction options for RPC calls</span>
1556
+ <span class="cstat-no" title="statement not covered" > */</span>
1557
+ <span class="cstat-no" title="statement not covered" >export interface TransactionOptions {</span>
1558
+ <span class="cstat-no" title="statement not covered" > accountAddress: string;</span>
1559
+ <span class="cstat-no" title="statement not covered" > payload: string;</span>
1560
+ <span class="cstat-no" title="statement not covered" > ledgerId?: string;</span>
1561
+ <span class="cstat-no" title="statement not covered" > networkId?: string;</span>
1562
+ <span class="cstat-no" title="statement not covered" > isBatch?: boolean;</span>
1563
+ <span class="cstat-no" title="statement not covered" > batchKey?: string;</span>
1564
+ <span class="cstat-no" title="statement not covered" > innerTransactions?: Array&lt;{ payload: string; description?: string }&gt;;</span>
1565
+ <span class="cstat-no" title="statement not covered" >}</span>
1566
+ <span class="cstat-no" title="statement not covered" ></span>
1567
+ <span class="cstat-no" title="statement not covered" >/**</span>
1568
+ <span class="cstat-no" title="statement not covered" > * Message signing options</span>
1569
+ <span class="cstat-no" title="statement not covered" > */</span>
1570
+ <span class="cstat-no" title="statement not covered" >export interface MessageSigningOptions {</span>
1571
+ <span class="cstat-no" title="statement not covered" > accountAddress: string;</span>
1572
+ <span class="cstat-no" title="statement not covered" > message: string;</span>
1573
+ <span class="cstat-no" title="statement not covered" > encoding?: 'utf-8' | 'base64';</span>
1574
+ <span class="cstat-no" title="statement not covered" > ledgerId?: string;</span>
1575
+ <span class="cstat-no" title="statement not covered" > networkId?: string;</span>
1576
+ <span class="cstat-no" title="statement not covered" >}</span>
1577
+ <span class="cstat-no" title="statement not covered" ></span>
1578
+ <span class="cstat-no" title="statement not covered" >/**</span>
1579
+ <span class="cstat-no" title="statement not covered" > * Mobile Native Session Manager</span>
1580
+ <span class="cstat-no" title="statement not covered" > *</span>
1581
+ <span class="cstat-no" title="statement not covered" > * Manages Nostr-first P2P connections for mobile wallet pairing.</span>
1582
+ <span class="cstat-no" title="statement not covered" > * Creates and displays QR codes that mobile wallets can scan</span>
1583
+ <span class="cstat-no" title="statement not covered" > * to establish a direct, end-to-end encrypted connection.</span>
1584
+ <span class="cstat-no" title="statement not covered" > *</span>
1585
+ <span class="cstat-no" title="statement not covered" > * Uses single QR code scanning with Nostr for initial signaling</span>
1586
+ <span class="cstat-no" title="statement not covered" > * and automatic P2P upgrade when possible.</span>
1587
+ <span class="cstat-no" title="statement not covered" > *</span>
1588
+ <span class="cstat-no" title="statement not covered" > * This implementation uses the unified ChannelClient from the new channel protocol.</span>
1589
+ <span class="cstat-no" title="statement not covered" > */</span>
1590
+ <span class="cstat-no" title="statement not covered" >@Injectable({ providedIn: 'root' })</span>
1591
+ <span class="cstat-no" title="statement not covered" >export class P2PSessionManager {</span>
1592
+ <span class="cstat-no" title="statement not covered" > // Private state</span>
1593
+ <span class="cstat-no" title="statement not covered" > private readonly _connectionState = signal&lt;P2PConnectionState&gt;('idle');</span>
1594
+ <span class="cstat-no" title="statement not covered" > private readonly _currentSession = signal&lt;P2PSession | null&gt;(null);</span>
1595
+ <span class="cstat-no" title="statement not covered" > private readonly _p2pState = signal&lt;TransportState&gt;('nostr-only');</span>
1596
+ <span class="cstat-no" title="statement not covered" ></span>
1597
+ <span class="cstat-no" title="statement not covered" > // Channel client</span>
1598
+ <span class="cstat-no" title="statement not covered" > private client?: ChannelClient;</span>
1599
+ <span class="cstat-no" title="statement not covered" > private currentInvite?: ChannelInvite;</span>
1600
+ <span class="cstat-no" title="statement not covered" ></span>
1601
+ <span class="cstat-no" title="statement not covered" > // Callbacks</span>
1602
+ <span class="cstat-no" title="statement not covered" > private connectedCallbacks: Array&lt;(session: P2PSession) =&gt; void&gt; = [];</span>
1603
+ <span class="cstat-no" title="statement not covered" > private disconnectedCallbacks: Array&lt;() =&gt; void&gt; = [];</span>
1604
+ <span class="cstat-no" title="statement not covered" > private errorCallbacks: Array&lt;(error: Error) =&gt; void&gt; = [];</span>
1605
+ <span class="cstat-no" title="statement not covered" > private accountsChangedCallbacks: Array&lt;(accounts: UnifiedAccount[]) =&gt; void&gt; = [];</span>
1606
+ <span class="cstat-no" title="statement not covered" ></span>
1607
+ <span class="cstat-no" title="statement not covered" > // NgZone for change detection</span>
1608
+ <span class="cstat-no" title="statement not covered" > private zone?: NgZone;</span>
1609
+ <span class="cstat-no" title="statement not covered" ></span>
1610
+ <span class="cstat-no" title="statement not covered" > // Session negotiation state</span>
1611
+ <span class="cstat-no" title="statement not covered" > private sessionApprovalPromise?: {</span>
1612
+ <span class="cstat-no" title="statement not covered" > resolve: (session: P2PSession) =&gt; void;</span>
1613
+ <span class="cstat-no" title="statement not covered" > reject: (error: Error) =&gt; void;</span>
1614
+ <span class="cstat-no" title="statement not covered" > };</span>
1615
+ <span class="cstat-no" title="statement not covered" ></span>
1616
+ <span class="cstat-no" title="statement not covered" > /**</span>
1617
+ <span class="cstat-no" title="statement not covered" > *</span>
1618
+ <span class="cstat-no" title="statement not covered" > */</span>
1619
+ <span class="cstat-no" title="statement not covered" > constructor() {}</span>
1620
+ <span class="cstat-no" title="statement not covered" ></span>
1621
+ <span class="cstat-no" title="statement not covered" > /**</span>
1622
+ <span class="cstat-no" title="statement not covered" > * Set NgZone for Angular change detection</span>
1623
+ <span class="cstat-no" title="statement not covered" > * @param zone</span>
1624
+ <span class="cstat-no" title="statement not covered" > */</span>
1625
+ <span class="cstat-no" title="statement not covered" > setNgZone(zone: NgZone): void {</span>
1626
+ <span class="cstat-no" title="statement not covered" > this.zone = zone;</span>
1627
+ <span class="cstat-no" title="statement not covered" > }</span>
1628
+ <span class="cstat-no" title="statement not covered" ></span>
1629
+ <span class="cstat-no" title="statement not covered" > /**</span>
1630
+ <span class="cstat-no" title="statement not covered" > * Current connection state</span>
1631
+ <span class="cstat-no" title="statement not covered" > */</span>
1632
+ <span class="cstat-no" title="statement not covered" > get connectionState(): Signal&lt;P2PConnectionState&gt; {</span>
1633
+ <span class="cstat-no" title="statement not covered" > return this._connectionState.asReadonly();</span>
1634
+ <span class="cstat-no" title="statement not covered" > }</span>
1635
+ <span class="cstat-no" title="statement not covered" ></span>
1636
+ <span class="cstat-no" title="statement not covered" > /**</span>
1637
+ <span class="cstat-no" title="statement not covered" > * Current session</span>
1638
+ <span class="cstat-no" title="statement not covered" > */</span>
1639
+ <span class="cstat-no" title="statement not covered" > get currentSession(): Signal&lt;P2PSession | null&gt; {</span>
1640
+ <span class="cstat-no" title="statement not covered" > return this._currentSession.asReadonly();</span>
1641
+ <span class="cstat-no" title="statement not covered" > }</span>
1642
+ <span class="cstat-no" title="statement not covered" ></span>
1643
+ <span class="cstat-no" title="statement not covered" > /**</span>
1644
+ <span class="cstat-no" title="statement not covered" > * Current P2P upgrade state</span>
1645
+ <span class="cstat-no" title="statement not covered" > */</span>
1646
+ <span class="cstat-no" title="statement not covered" > get p2pState(): Signal&lt;TransportState&gt; {</span>
1647
+ <span class="cstat-no" title="statement not covered" > return this._p2pState.asReadonly();</span>
1648
+ <span class="cstat-no" title="statement not covered" > }</span>
1649
+ <span class="cstat-no" title="statement not covered" ></span>
1650
+ <span class="cstat-no" title="statement not covered" > /**</span>
1651
+ <span class="cstat-no" title="statement not covered" > * Create a pairing offer for QR code display.</span>
1652
+ <span class="cstat-no" title="statement not covered" > *</span>
1653
+ <span class="cstat-no" title="statement not covered" > * Generates a compact session invite encoded for QR code display.</span>
1654
+ <span class="cstat-no" title="statement not covered" > * The invite contains the channel ID, encryption key, and Nostr relays.</span>
1655
+ <span class="cstat-no" title="statement not covered" > *</span>
1656
+ <span class="cstat-no" title="statement not covered" > * @param options - Offer creation options</span>
1657
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to offer result with QR data</span>
1658
+ <span class="cstat-no" title="statement not covered" > */</span>
1659
+ <span class="cstat-no" title="statement not covered" > async createPairingOffer(options: CreateOfferOptions): Promise&lt;CreateOfferResult&gt; {</span>
1660
+ <span class="cstat-no" title="statement not covered" > logger.info('Creating pairing offer (Nostr-first)', { options });</span>
1661
+ <span class="cstat-no" title="statement not covered" ></span>
1662
+ <span class="cstat-no" title="statement not covered" > try {</span>
1663
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._connectionState.set('creating_offer'));</span>
1664
+ <span class="cstat-no" title="statement not covered" ></span>
1665
+ <span class="cstat-no" title="statement not covered" > // Clean up any existing client</span>
1666
+ <span class="cstat-no" title="statement not covered" > await this.cleanup(false);</span>
1667
+ <span class="cstat-no" title="statement not covered" ></span>
1668
+ <span class="cstat-no" title="statement not covered" > // Create new channel client with state/account callbacks.</span>
1669
+ <span class="cstat-no" title="statement not covered" > // The polling in startStateSync() also reads client.state, but these</span>
1670
+ <span class="cstat-no" title="statement not covered" > // callbacks ensure immediate handling of state transitions — critical</span>
1671
+ <span class="cstat-no" title="statement not covered" > // when the wallet approves via Nostr and the approval event arrives</span>
1672
+ <span class="cstat-no" title="statement not covered" > // between poll ticks.</span>
1673
+ <span class="cstat-no" title="statement not covered" > this.client = new ChannelClient({</span>
1674
+ <span class="cstat-no" title="statement not covered" > p2p: { enabled: true },</span>
1675
+ <span class="cstat-no" title="statement not covered" > onStateChange: (state: ChannelState) =&gt; {</span>
1676
+ <span class="cstat-no" title="statement not covered" > logger.debug('ChannelClient state callback', { state });</span>
1677
+ <span class="cstat-no" title="statement not covered" > const accounts = this.client?.accounts ?? [];</span>
1678
+ <span class="cstat-no" title="statement not covered" > this.handleStateChange(state, accounts);</span>
1679
+ <span class="cstat-no" title="statement not covered" > },</span>
1680
+ <span class="cstat-no" title="statement not covered" > onAccountsChange: (accounts: ChannelAccount[]) =&gt; {</span>
1681
+ <span class="cstat-no" title="statement not covered" > logger.debug('ChannelClient accounts callback', { count: accounts.length });</span>
1682
+ <span class="cstat-no" title="statement not covered" > const state = this.client?.state ?? 'idle';</span>
1683
+ <span class="cstat-no" title="statement not covered" > this.handleStateChange(state, accounts);</span>
1684
+ <span class="cstat-no" title="statement not covered" > },</span>
1685
+ <span class="cstat-no" title="statement not covered" > });</span>
1686
+ <span class="cstat-no" title="statement not covered" ></span>
1687
+ <span class="cstat-no" title="statement not covered" > // Connect and get invite. Always include the dApp's origin so the</span>
1688
+ <span class="cstat-no" title="statement not covered" > // wallet can show the user where the request is coming from.</span>
1689
+ <span class="cstat-no" title="statement not covered" > const resolvedOrigin =</span>
1690
+ <span class="cstat-no" title="statement not covered" > typeof window !== 'undefined' &amp;&amp; window.location ? window.location.origin : undefined;</span>
1691
+ <span class="cstat-no" title="statement not covered" ></span>
1692
+ <span class="cstat-no" title="statement not covered" > const invite = await this.client.connect({</span>
1693
+ <span class="cstat-no" title="statement not covered" > type: 'session',</span>
1694
+ <span class="cstat-no" title="statement not covered" > app: {</span>
1695
+ <span class="cstat-no" title="statement not covered" > id: options.appId,</span>
1696
+ <span class="cstat-no" title="statement not covered" > name: options.appName,</span>
1697
+ <span class="cstat-no" title="statement not covered" > origin: resolvedOrigin,</span>
1698
+ <span class="cstat-no" title="statement not covered" > },</span>
1699
+ <span class="cstat-no" title="statement not covered" > context: {</span>
1700
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
1701
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
1702
+ <span class="cstat-no" title="statement not covered" > },</span>
1703
+ <span class="cstat-no" title="statement not covered" > permissions: ['sign', 'submit'],</span>
1704
+ <span class="cstat-no" title="statement not covered" > });</span>
1705
+ <span class="cstat-no" title="statement not covered" ></span>
1706
+ <span class="cstat-no" title="statement not covered" > this.currentInvite = invite;</span>
1707
+ <span class="cstat-no" title="statement not covered" ></span>
1708
+ <span class="cstat-no" title="statement not covered" > // Encode invite for QR code</span>
1709
+ <span class="cstat-no" title="statement not covered" > const qrData = encodeChannelInvite(invite);</span>
1710
+ <span class="cstat-no" title="statement not covered" ></span>
1711
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._connectionState.set('awaiting_connection'));</span>
1712
+ <span class="cstat-no" title="statement not covered" ></span>
1713
+ <span class="cstat-no" title="statement not covered" > logger.info('Pairing offer created', {</span>
1714
+ <span class="cstat-no" title="statement not covered" > sessionId: invite.id.slice(0, 8),</span>
1715
+ <span class="cstat-no" title="statement not covered" > qrDataLength: qrData.length,</span>
1716
+ <span class="cstat-no" title="statement not covered" > });</span>
1717
+ <span class="cstat-no" title="statement not covered" ></span>
1718
+ <span class="cstat-no" title="statement not covered" > // Start polling for state changes</span>
1719
+ <span class="cstat-no" title="statement not covered" > this.startStateSync();</span>
1720
+ <span class="cstat-no" title="statement not covered" ></span>
1721
+ <span class="cstat-no" title="statement not covered" > return { qrData, sessionId: invite.id };</span>
1722
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1723
+ <span class="cstat-no" title="statement not covered" > logger.error('Failed to create pairing offer', { error });</span>
1724
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._connectionState.set('error'));</span>
1725
+ <span class="cstat-no" title="statement not covered" > this.notifyError(error instanceof Error ? error : new Error('Failed to create offer'));</span>
1726
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1727
+ <span class="cstat-no" title="statement not covered" > }</span>
1728
+ <span class="cstat-no" title="statement not covered" > }</span>
1729
+ <span class="cstat-no" title="statement not covered" ></span>
1730
+ <span class="cstat-no" title="statement not covered" > /**</span>
1731
+ <span class="cstat-no" title="statement not covered" > * Wait for wallet to connect and approve the session.</span>
1732
+ <span class="cstat-no" title="statement not covered" > *</span>
1733
+ <span class="cstat-no" title="statement not covered" > * This method blocks until the wallet scans the QR, connects via Nostr,</span>
1734
+ <span class="cstat-no" title="statement not covered" > * and the user approves the session.</span>
1735
+ <span class="cstat-no" title="statement not covered" > *</span>
1736
+ <span class="cstat-no" title="statement not covered" > * @returns Promise resolving to the approved session</span>
1737
+ <span class="cstat-no" title="statement not covered" > */</span>
1738
+ <span class="cstat-no" title="statement not covered" > async waitForSessionApproval(): Promise&lt;P2PSession&gt; {</span>
1739
+ <span class="cstat-no" title="statement not covered" > if (!this.client || !this.currentInvite) {</span>
1740
+ <span class="cstat-no" title="statement not covered" > throw new Error('No active pairing offer - call createPairingOffer first');</span>
1741
+ <span class="cstat-no" title="statement not covered" > }</span>
1742
+ <span class="cstat-no" title="statement not covered" ></span>
1743
+ <span class="cstat-no" title="statement not covered" > logger.info('Waiting for wallet to connect and approve session...');</span>
1744
+ <span class="cstat-no" title="statement not covered" ></span>
1745
+ <span class="cstat-no" title="statement not covered" > return new Promise&lt;P2PSession&gt;((resolve, reject) =&gt; {</span>
1746
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise = { resolve, reject };</span>
1747
+ <span class="cstat-no" title="statement not covered" > });</span>
1748
+ <span class="cstat-no" title="statement not covered" > }</span>
1749
+ <span class="cstat-no" title="statement not covered" ></span>
1750
+ <span class="cstat-no" title="statement not covered" > /**</span>
1751
+ <span class="cstat-no" title="statement not covered" > * Cancel the current pairing offer.</span>
1752
+ <span class="cstat-no" title="statement not covered" > *</span>
1753
+ <span class="cstat-no" title="statement not covered" > * Cleans up the transport without fully disconnecting.</span>
1754
+ <span class="cstat-no" title="statement not covered" > */</span>
1755
+ <span class="cstat-no" title="statement not covered" > async cancelPairingOffer(): Promise&lt;void&gt; {</span>
1756
+ <span class="cstat-no" title="statement not covered" > logger.debug('Cancelling pairing offer');</span>
1757
+ <span class="cstat-no" title="statement not covered" ></span>
1758
+ <span class="cstat-no" title="statement not covered" > if (this.sessionApprovalPromise) {</span>
1759
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise.reject(new Error('Pairing cancelled'));</span>
1760
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise = undefined;</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" > await this.cleanup();</span>
1764
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._connectionState.set('idle'));</span>
1765
+ <span class="cstat-no" title="statement not covered" > }</span>
1766
+ <span class="cstat-no" title="statement not covered" ></span>
1767
+ <span class="cstat-no" title="statement not covered" > /**</span>
1768
+ <span class="cstat-no" title="statement not covered" > * @param callback</span>
1769
+ <span class="cstat-no" title="statement not covered" > * Register callback for when peer connects</span>
1770
+ <span class="cstat-no" title="statement not covered" > */</span>
1771
+ <span class="cstat-no" title="statement not covered" > onConnected(callback: (session: P2PSession) =&gt; void): void {</span>
1772
+ <span class="cstat-no" title="statement not covered" > this.connectedCallbacks.push(callback);</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" > /**</span>
1776
+ <span class="cstat-no" title="statement not covered" > * @param callback</span>
1777
+ <span class="cstat-no" title="statement not covered" > * Register callback for disconnection</span>
1778
+ <span class="cstat-no" title="statement not covered" > */</span>
1779
+ <span class="cstat-no" title="statement not covered" > onDisconnected(callback: () =&gt; void): void {</span>
1780
+ <span class="cstat-no" title="statement not covered" > this.disconnectedCallbacks.push(callback);</span>
1781
+ <span class="cstat-no" title="statement not covered" > }</span>
1782
+ <span class="cstat-no" title="statement not covered" ></span>
1783
+ <span class="cstat-no" title="statement not covered" > /**</span>
1784
+ <span class="cstat-no" title="statement not covered" > * @param callback</span>
1785
+ <span class="cstat-no" title="statement not covered" > * Register callback for errors</span>
1786
+ <span class="cstat-no" title="statement not covered" > */</span>
1787
+ <span class="cstat-no" title="statement not covered" > onError(callback: (error: Error) =&gt; void): void {</span>
1788
+ <span class="cstat-no" title="statement not covered" > this.errorCallbacks.push(callback);</span>
1789
+ <span class="cstat-no" title="statement not covered" > }</span>
1790
+ <span class="cstat-no" title="statement not covered" ></span>
1791
+ <span class="cstat-no" title="statement not covered" > /**</span>
1792
+ <span class="cstat-no" title="statement not covered" > * @param callback</span>
1793
+ <span class="cstat-no" title="statement not covered" > * Register callback for accounts changes</span>
1794
+ <span class="cstat-no" title="statement not covered" > */</span>
1795
+ <span class="cstat-no" title="statement not covered" > onAccountsChanged(callback: (accounts: UnifiedAccount[]) =&gt; void): void {</span>
1796
+ <span class="cstat-no" title="statement not covered" > this.accountsChangedCallbacks.push(callback);</span>
1797
+ <span class="cstat-no" title="statement not covered" > }</span>
1798
+ <span class="cstat-no" title="statement not covered" ></span>
1799
+ <span class="cstat-no" title="statement not covered" > /**</span>
1800
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
1801
+ <span class="cstat-no" title="statement not covered" > * Sign a transaction via RPC</span>
1802
+ <span class="cstat-no" title="statement not covered" > */</span>
1803
+ <span class="cstat-no" title="statement not covered" > async signTransaction(options: TransactionOptions): Promise&lt;{</span>
1804
+ <span class="cstat-no" title="statement not covered" > signedPayload: string;</span>
1805
+ <span class="cstat-no" title="statement not covered" > signature?: string;</span>
1806
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1807
+ <span class="cstat-no" title="statement not covered" > }&gt; {</span>
1808
+ <span class="cstat-no" title="statement not covered" > this.requireSession();</span>
1809
+ <span class="cstat-no" title="statement not covered" ></span>
1810
+ <span class="cstat-no" title="statement not covered" > logger.info('Signing transaction', { account: options.accountAddress });</span>
1811
+ <span class="cstat-no" title="statement not covered" ></span>
1812
+ <span class="cstat-no" title="statement not covered" > if (!this.client) {</span>
1813
+ <span class="cstat-no" title="statement not covered" > throw new Error('Not connected');</span>
1814
+ <span class="cstat-no" title="statement not covered" > }</span>
1815
+ <span class="cstat-no" title="statement not covered" ></span>
1816
+ <span class="cstat-no" title="statement not covered" > const response = await this.client.request&lt;{</span>
1817
+ <span class="cstat-no" title="statement not covered" > signedPayload?: string;</span>
1818
+ <span class="cstat-no" title="statement not covered" > signedTransaction?: string;</span>
1819
+ <span class="cstat-no" title="statement not covered" > signature?: string;</span>
1820
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1821
+ <span class="cstat-no" title="statement not covered" > }&gt;('ledger/sign', {</span>
1822
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
1823
+ <span class="cstat-no" title="statement not covered" > payload: options.payload,</span>
1824
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
1825
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
1826
+ <span class="cstat-no" title="statement not covered" > });</span>
1827
+ <span class="cstat-no" title="statement not covered" ></span>
1828
+ <span class="cstat-no" title="statement not covered" > return {</span>
1829
+ <span class="cstat-no" title="statement not covered" > signedPayload: response.signedPayload || response.signedTransaction || '',</span>
1830
+ <span class="cstat-no" title="statement not covered" > signature: response.signature,</span>
1831
+ <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
1832
+ <span class="cstat-no" title="statement not covered" > };</span>
1833
+ <span class="cstat-no" title="statement not covered" > }</span>
1834
+ <span class="cstat-no" title="statement not covered" ></span>
1835
+ <span class="cstat-no" title="statement not covered" > /**</span>
1836
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
1837
+ <span class="cstat-no" title="statement not covered" > * Submit a transaction via RPC</span>
1838
+ <span class="cstat-no" title="statement not covered" > */</span>
1839
+ <span class="cstat-no" title="statement not covered" > async submitTransaction(options: TransactionOptions): Promise&lt;{</span>
1840
+ <span class="cstat-no" title="statement not covered" > transactionId: string;</span>
1841
+ <span class="cstat-no" title="statement not covered" > transactionHash?: string;</span>
1842
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1843
+ <span class="cstat-no" title="statement not covered" > }&gt; {</span>
1844
+ <span class="cstat-no" title="statement not covered" > this.requireSession();</span>
1845
+ <span class="cstat-no" title="statement not covered" ></span>
1846
+ <span class="cstat-no" title="statement not covered" > logger.info('Submitting transaction', { account: options.accountAddress });</span>
1847
+ <span class="cstat-no" title="statement not covered" ></span>
1848
+ <span class="cstat-no" title="statement not covered" > if (!this.client) {</span>
1849
+ <span class="cstat-no" title="statement not covered" > throw new Error('Not connected');</span>
1850
+ <span class="cstat-no" title="statement not covered" > }</span>
1851
+ <span class="cstat-no" title="statement not covered" ></span>
1852
+ <span class="cstat-no" title="statement not covered" > const response = await this.client.request&lt;{</span>
1853
+ <span class="cstat-no" title="statement not covered" > transactionId?: string;</span>
1854
+ <span class="cstat-no" title="statement not covered" > transactionHash?: string;</span>
1855
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1856
+ <span class="cstat-no" title="statement not covered" > }&gt;('ledger/signAndSubmit', {</span>
1857
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
1858
+ <span class="cstat-no" title="statement not covered" > payload: options.payload,</span>
1859
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
1860
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
1861
+ <span class="cstat-no" title="statement not covered" > isBatch: options.isBatch,</span>
1862
+ <span class="cstat-no" title="statement not covered" > batchKey: options.batchKey,</span>
1863
+ <span class="cstat-no" title="statement not covered" > innerTransactions: options.innerTransactions,</span>
1864
+ <span class="cstat-no" title="statement not covered" > });</span>
1865
+ <span class="cstat-no" title="statement not covered" ></span>
1866
+ <span class="cstat-no" title="statement not covered" > return {</span>
1867
+ <span class="cstat-no" title="statement not covered" > transactionId: response.transactionId || '',</span>
1868
+ <span class="cstat-no" title="statement not covered" > transactionHash: response.transactionHash,</span>
1869
+ <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
1870
+ <span class="cstat-no" title="statement not covered" > };</span>
1871
+ <span class="cstat-no" title="statement not covered" > }</span>
1872
+ <span class="cstat-no" title="statement not covered" ></span>
1873
+ <span class="cstat-no" title="statement not covered" > /**</span>
1874
+ <span class="cstat-no" title="statement not covered" > * @param options</span>
1875
+ <span class="cstat-no" title="statement not covered" > * Sign an arbitrary message via RPC</span>
1876
+ <span class="cstat-no" title="statement not covered" > */</span>
1877
+ <span class="cstat-no" title="statement not covered" > async signMessage(options: MessageSigningOptions): Promise&lt;{</span>
1878
+ <span class="cstat-no" title="statement not covered" > signature: string;</span>
1879
+ <span class="cstat-no" title="statement not covered" > publicKey?: string;</span>
1880
+ <span class="cstat-no" title="statement not covered" > // §21.3 extended shape — passes the adapter's full MessageSignResult</span>
1881
+ <span class="cstat-no" title="statement not covered" > // through to the dApp. Optional for backwards compatibility with</span>
1882
+ <span class="cstat-no" title="statement not covered" > // pre-§21.3 wallets that only return signature + publicKey.</span>
1883
+ <span class="cstat-no" title="statement not covered" > algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';</span>
1884
+ <span class="cstat-no" title="statement not covered" > encoding?: 'utf-8' | 'base64';</span>
1885
+ <span class="cstat-no" title="statement not covered" > caipChainId?: string;</span>
1886
+ <span class="cstat-no" title="statement not covered" > messageLength?: number;</span>
1887
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1888
+ <span class="cstat-no" title="statement not covered" > }&gt; {</span>
1889
+ <span class="cstat-no" title="statement not covered" > this.requireSession();</span>
1890
+ <span class="cstat-no" title="statement not covered" ></span>
1891
+ <span class="cstat-no" title="statement not covered" > logger.info('Signing message', { account: options.accountAddress });</span>
1892
+ <span class="cstat-no" title="statement not covered" ></span>
1893
+ <span class="cstat-no" title="statement not covered" > if (!this.client) {</span>
1894
+ <span class="cstat-no" title="statement not covered" > throw new Error('Not connected');</span>
1895
+ <span class="cstat-no" title="statement not covered" > }</span>
1896
+ <span class="cstat-no" title="statement not covered" ></span>
1897
+ <span class="cstat-no" title="statement not covered" > const response = await this.client.request&lt;{</span>
1898
+ <span class="cstat-no" title="statement not covered" > signature?: string;</span>
1899
+ <span class="cstat-no" title="statement not covered" > publicKey?: string;</span>
1900
+ <span class="cstat-no" title="statement not covered" > algorithm?: 'ed25519' | 'ecdsa_secp256k1' | 'secp256k1';</span>
1901
+ <span class="cstat-no" title="statement not covered" > encoding?: 'utf-8' | 'base64';</span>
1902
+ <span class="cstat-no" title="statement not covered" > caipChainId?: string;</span>
1903
+ <span class="cstat-no" title="statement not covered" > messageLength?: number;</span>
1904
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1905
+ <span class="cstat-no" title="statement not covered" > }&gt;('ledger/signMessage', {</span>
1906
+ <span class="cstat-no" title="statement not covered" > accountAddress: options.accountAddress,</span>
1907
+ <span class="cstat-no" title="statement not covered" > message: options.message,</span>
1908
+ <span class="cstat-no" title="statement not covered" > encoding: options.encoding || 'utf-8',</span>
1909
+ <span class="cstat-no" title="statement not covered" > ledgerId: options.ledgerId,</span>
1910
+ <span class="cstat-no" title="statement not covered" > networkId: options.networkId,</span>
1911
+ <span class="cstat-no" title="statement not covered" > });</span>
1912
+ <span class="cstat-no" title="statement not covered" ></span>
1913
+ <span class="cstat-no" title="statement not covered" > return {</span>
1914
+ <span class="cstat-no" title="statement not covered" > signature: response.signature || '',</span>
1915
+ <span class="cstat-no" title="statement not covered" > publicKey: response.publicKey,</span>
1916
+ <span class="cstat-no" title="statement not covered" > algorithm: response.algorithm,</span>
1917
+ <span class="cstat-no" title="statement not covered" > encoding: response.encoding,</span>
1918
+ <span class="cstat-no" title="statement not covered" > caipChainId: response.caipChainId,</span>
1919
+ <span class="cstat-no" title="statement not covered" > messageLength: response.messageLength,</span>
1920
+ <span class="cstat-no" title="statement not covered" > metadata: response.metadata,</span>
1921
+ <span class="cstat-no" title="statement not covered" > };</span>
1922
+ <span class="cstat-no" title="statement not covered" > }</span>
1923
+ <span class="cstat-no" title="statement not covered" ></span>
1924
+ <span class="cstat-no" title="statement not covered" > /**</span>
1925
+ <span class="cstat-no" title="statement not covered" > * Terminate the current session</span>
1926
+ <span class="cstat-no" title="statement not covered" > */</span>
1927
+ <span class="cstat-no" title="statement not covered" > async terminateSession(): Promise&lt;void&gt; {</span>
1928
+ <span class="cstat-no" title="statement not covered" > logger.info('Terminating session');</span>
1929
+ <span class="cstat-no" title="statement not covered" ></span>
1930
+ <span class="cstat-no" title="statement not covered" > if (this.client) {</span>
1931
+ <span class="cstat-no" title="statement not covered" > await this.client.disconnect();</span>
1932
+ <span class="cstat-no" title="statement not covered" > }</span>
1933
+ <span class="cstat-no" title="statement not covered" ></span>
1934
+ <span class="cstat-no" title="statement not covered" > await this.cleanup();</span>
1935
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; {</span>
1936
+ <span class="cstat-no" title="statement not covered" > this._currentSession.set(null);</span>
1937
+ <span class="cstat-no" title="statement not covered" > this._connectionState.set('disconnected');</span>
1938
+ <span class="cstat-no" title="statement not covered" > });</span>
1939
+ <span class="cstat-no" title="statement not covered" > this.notifyDisconnected();</span>
1940
+ <span class="cstat-no" title="statement not covered" > }</span>
1941
+ <span class="cstat-no" title="statement not covered" ></span>
1942
+ <span class="cstat-no" title="statement not covered" > // ========== Private Methods ==========</span>
1943
+ <span class="cstat-no" title="statement not covered" ></span>
1944
+ <span class="cstat-no" title="statement not covered" > /**</span>
1945
+ <span class="cstat-no" title="statement not covered" > * Run function in NgZone if available</span>
1946
+ <span class="cstat-no" title="statement not covered" > * @param fn</span>
1947
+ <span class="cstat-no" title="statement not covered" > */</span>
1948
+ <span class="cstat-no" title="statement not covered" > private runInZone(fn: () =&gt; void): void {</span>
1949
+ <span class="cstat-no" title="statement not covered" > if (this.zone) {</span>
1950
+ <span class="cstat-no" title="statement not covered" > this.zone.run(fn);</span>
1951
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1952
+ <span class="cstat-no" title="statement not covered" > fn();</span>
1953
+ <span class="cstat-no" title="statement not covered" > }</span>
1954
+ <span class="cstat-no" title="statement not covered" > }</span>
1955
+ <span class="cstat-no" title="statement not covered" ></span>
1956
+ <span class="cstat-no" title="statement not covered" > /**</span>
1957
+ <span class="cstat-no" title="statement not covered" > * Start polling for state changes from the channel client</span>
1958
+ <span class="cstat-no" title="statement not covered" > */</span>
1959
+ <span class="cstat-no" title="statement not covered" > private startStateSync(): void {</span>
1960
+ <span class="cstat-no" title="statement not covered" > const checkState = () =&gt; {</span>
1961
+ <span class="cstat-no" title="statement not covered" > if (!this.client) return;</span>
1962
+ <span class="cstat-no" title="statement not covered" ></span>
1963
+ <span class="cstat-no" title="statement not covered" > const clientState = this.client.state;</span>
1964
+ <span class="cstat-no" title="statement not covered" > const clientAccounts = this.client.accounts;</span>
1965
+ <span class="cstat-no" title="statement not covered" > const clientTransport = this.client.transportState;</span>
1966
+ <span class="cstat-no" title="statement not covered" ></span>
1967
+ <span class="cstat-no" title="statement not covered" > // Update transport state</span>
1968
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._p2pState.set(clientTransport));</span>
1969
+ <span class="cstat-no" title="statement not covered" ></span>
1970
+ <span class="cstat-no" title="statement not covered" > // Map channel state to P2P connection state</span>
1971
+ <span class="cstat-no" title="statement not covered" > this.handleStateChange(clientState, clientAccounts);</span>
1972
+ <span class="cstat-no" title="statement not covered" ></span>
1973
+ <span class="cstat-no" title="statement not covered" > // Continue polling while not disconnected</span>
1974
+ <span class="cstat-no" title="statement not covered" > if (this.client &amp;&amp; clientState !== 'disconnected' &amp;&amp; clientState !== 'error') {</span>
1975
+ <span class="cstat-no" title="statement not covered" > setTimeout(checkState, 100);</span>
1976
+ <span class="cstat-no" title="statement not covered" > }</span>
1977
+ <span class="cstat-no" title="statement not covered" > };</span>
1978
+ <span class="cstat-no" title="statement not covered" ></span>
1979
+ <span class="cstat-no" title="statement not covered" > setTimeout(checkState, 100);</span>
1980
+ <span class="cstat-no" title="statement not covered" > }</span>
1981
+ <span class="cstat-no" title="statement not covered" ></span>
1982
+ <span class="cstat-no" title="statement not covered" > /**</span>
1983
+ <span class="cstat-no" title="statement not covered" > * Handle channel state changes</span>
1984
+ <span class="cstat-no" title="statement not covered" > * @param state</span>
1985
+ <span class="cstat-no" title="statement not covered" > * @param accounts</span>
1986
+ <span class="cstat-no" title="statement not covered" > */</span>
1987
+ <span class="cstat-no" title="statement not covered" > private handleStateChange(state: ChannelState, accounts: ChannelAccount[]): void {</span>
1988
+ <span class="cstat-no" title="statement not covered" > switch (state) {</span>
1989
+ <span class="cstat-no" title="statement not covered" > case 'pending':</span>
1990
+ <span class="cstat-no" title="statement not covered" > if (this._connectionState() === 'awaiting_connection') {</span>
1991
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._connectionState.set('pending_approval'));</span>
1992
+ <span class="cstat-no" title="statement not covered" > }</span>
1993
+ <span class="cstat-no" title="statement not covered" > break;</span>
1994
+ <span class="cstat-no" title="statement not covered" ></span>
1995
+ <span class="cstat-no" title="statement not covered" > case 'active':</span>
1996
+ <span class="cstat-no" title="statement not covered" > case 'approved':</span>
1997
+ <span class="cstat-no" title="statement not covered" > if (this._connectionState() !== 'connected') {</span>
1998
+ <span class="cstat-no" title="statement not covered" > const session = this.createSession(accounts);</span>
1999
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; {</span>
2000
+ <span class="cstat-no" title="statement not covered" > this._currentSession.set(session);</span>
2001
+ <span class="cstat-no" title="statement not covered" > this._connectionState.set('connected');</span>
2002
+ <span class="cstat-no" title="statement not covered" > });</span>
2003
+ <span class="cstat-no" title="statement not covered" ></span>
2004
+ <span class="cstat-no" title="statement not covered" > // Resolve the approval promise</span>
2005
+ <span class="cstat-no" title="statement not covered" > if (this.sessionApprovalPromise) {</span>
2006
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise.resolve(session);</span>
2007
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise = undefined;</span>
2008
+ <span class="cstat-no" title="statement not covered" > }</span>
2009
+ <span class="cstat-no" title="statement not covered" ></span>
2010
+ <span class="cstat-no" title="statement not covered" > this.notifyConnected(session);</span>
2011
+ <span class="cstat-no" title="statement not covered" > }</span>
2012
+ <span class="cstat-no" title="statement not covered" > break;</span>
2013
+ <span class="cstat-no" title="statement not covered" ></span>
2014
+ <span class="cstat-no" title="statement not covered" > case 'disconnected':</span>
2015
+ <span class="cstat-no" title="statement not covered" > this.handleDisconnection('Wallet disconnected');</span>
2016
+ <span class="cstat-no" title="statement not covered" > break;</span>
2017
+ <span class="cstat-no" title="statement not covered" ></span>
2018
+ <span class="cstat-no" title="statement not covered" > case 'error':</span>
2019
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._connectionState.set('error'));</span>
2020
+ <span class="cstat-no" title="statement not covered" > if (this.sessionApprovalPromise) {</span>
2021
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise.reject(new Error('Connection error'));</span>
2022
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise = undefined;</span>
2023
+ <span class="cstat-no" title="statement not covered" > }</span>
2024
+ <span class="cstat-no" title="statement not covered" > break;</span>
2025
+ <span class="cstat-no" title="statement not covered" > }</span>
2026
+ <span class="cstat-no" title="statement not covered" > }</span>
2027
+ <span class="cstat-no" title="statement not covered" ></span>
2028
+ <span class="cstat-no" title="statement not covered" > /**</span>
2029
+ <span class="cstat-no" title="statement not covered" > * Create a P2PSession from channel accounts</span>
2030
+ <span class="cstat-no" title="statement not covered" > * @param accounts</span>
2031
+ <span class="cstat-no" title="statement not covered" > */</span>
2032
+ <span class="cstat-no" title="statement not covered" > private createSession(accounts: ChannelAccount[]): P2PSession {</span>
2033
+ <span class="cstat-no" title="statement not covered" > const invite = this.currentInvite;</span>
2034
+ <span class="cstat-no" title="statement not covered" ></span>
2035
+ <span class="cstat-no" title="statement not covered" > return {</span>
2036
+ <span class="cstat-no" title="statement not covered" > id: crypto.randomUUID(),</span>
2037
+ <span class="cstat-no" title="statement not covered" > sessionId: invite?.id || crypto.randomUUID(),</span>
2038
+ <span class="cstat-no" title="statement not covered" > appId: invite?.app.id || 'hsuite-dapp',</span>
2039
+ <span class="cstat-no" title="statement not covered" > appName: invite?.app.name || 'HSuite dApp',</span>
2040
+ <span class="cstat-no" title="statement not covered" > ledgerId: invite?.context.ledgerId || 'hedera',</span>
2041
+ <span class="cstat-no" title="statement not covered" > networkId: invite?.context.networkId || 'testnet',</span>
2042
+ <span class="cstat-no" title="statement not covered" > accounts: accounts.map((acc, index) =&gt; ({</span>
2043
+ <span class="cstat-no" title="statement not covered" > id: `p2p-${acc.address}`,</span>
2044
+ <span class="cstat-no" title="statement not covered" > address: acc.address,</span>
2045
+ <span class="cstat-no" title="statement not covered" > label: acc.alias || `Account ${index + 1}`,</span>
2046
+ <span class="cstat-no" title="statement not covered" > ledgerId: acc.ledgerId,</span>
2047
+ <span class="cstat-no" title="statement not covered" > networkId: acc.networkId,</span>
2048
+ <span class="cstat-no" title="statement not covered" > providerId: 'p2p-native',</span>
2049
+ <span class="cstat-no" title="statement not covered" > providerType: 'hsuite-native' as const,</span>
2050
+ <span class="cstat-no" title="statement not covered" > metadata: {</span>
2051
+ <span class="cstat-no" title="statement not covered" > publicKey: acc.publicKey,</span>
2052
+ <span class="cstat-no" title="statement not covered" > },</span>
2053
+ <span class="cstat-no" title="statement not covered" > })),</span>
2054
+ <span class="cstat-no" title="statement not covered" > permissions: this.client?.permissions || [],</span>
2055
+ <span class="cstat-no" title="statement not covered" > connectedAt: Date.now(),</span>
2056
+ <span class="cstat-no" title="statement not covered" > };</span>
2057
+ <span class="cstat-no" title="statement not covered" > }</span>
2058
+ <span class="cstat-no" title="statement not covered" ></span>
2059
+ <span class="cstat-no" title="statement not covered" > /**</span>
2060
+ <span class="cstat-no" title="statement not covered" > * Handle disconnection</span>
2061
+ <span class="cstat-no" title="statement not covered" > * @param reason</span>
2062
+ <span class="cstat-no" title="statement not covered" > */</span>
2063
+ <span class="cstat-no" title="statement not covered" > private handleDisconnection(reason: string): void {</span>
2064
+ <span class="cstat-no" title="statement not covered" > logger.info('Handling disconnection', { reason });</span>
2065
+ <span class="cstat-no" title="statement not covered" > this.cleanup();</span>
2066
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; {</span>
2067
+ <span class="cstat-no" title="statement not covered" > this._currentSession.set(null);</span>
2068
+ <span class="cstat-no" title="statement not covered" > this._connectionState.set('disconnected');</span>
2069
+ <span class="cstat-no" title="statement not covered" > });</span>
2070
+ <span class="cstat-no" title="statement not covered" > this.notifyDisconnected();</span>
2071
+ <span class="cstat-no" title="statement not covered" > }</span>
2072
+ <span class="cstat-no" title="statement not covered" ></span>
2073
+ <span class="cstat-no" title="statement not covered" > /**</span>
2074
+ <span class="cstat-no" title="statement not covered" > * Require active session or throw</span>
2075
+ <span class="cstat-no" title="statement not covered" > */</span>
2076
+ <span class="cstat-no" title="statement not covered" > private requireSession(): P2PSession {</span>
2077
+ <span class="cstat-no" title="statement not covered" > const session = this._currentSession();</span>
2078
+ <span class="cstat-no" title="statement not covered" > if (!session) {</span>
2079
+ <span class="cstat-no" title="statement not covered" > throw new Error('No active session');</span>
2080
+ <span class="cstat-no" title="statement not covered" > }</span>
2081
+ <span class="cstat-no" title="statement not covered" > return session;</span>
2082
+ <span class="cstat-no" title="statement not covered" > }</span>
2083
+ <span class="cstat-no" title="statement not covered" ></span>
2084
+ <span class="cstat-no" title="statement not covered" > /**</span>
2085
+ <span class="cstat-no" title="statement not covered" > * Clean up resources.</span>
2086
+ <span class="cstat-no" title="statement not covered" > *</span>
2087
+ <span class="cstat-no" title="statement not covered" > * @param rejectPending - If true, reject pending promises with error.</span>
2088
+ <span class="cstat-no" title="statement not covered" > * If false, clear them silently (for new session creation).</span>
2089
+ <span class="cstat-no" title="statement not covered" > */</span>
2090
+ <span class="cstat-no" title="statement not covered" > private async cleanup(rejectPending = true): Promise&lt;void&gt; {</span>
2091
+ <span class="cstat-no" title="statement not covered" > // Reject pending approval if requested</span>
2092
+ <span class="cstat-no" title="statement not covered" > if (this.sessionApprovalPromise &amp;&amp; rejectPending) {</span>
2093
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise.reject(new Error('Connection closed'));</span>
2094
+ <span class="cstat-no" title="statement not covered" > }</span>
2095
+ <span class="cstat-no" title="statement not covered" > this.sessionApprovalPromise = undefined;</span>
2096
+ <span class="cstat-no" title="statement not covered" ></span>
2097
+ <span class="cstat-no" title="statement not covered" > if (this.client) {</span>
2098
+ <span class="cstat-no" title="statement not covered" > try {</span>
2099
+ <span class="cstat-no" title="statement not covered" > await this.client.disconnect();</span>
2100
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
2101
+ <span class="cstat-no" title="statement not covered" > // Ignore disconnect errors during cleanup</span>
2102
+ <span class="cstat-no" title="statement not covered" > }</span>
2103
+ <span class="cstat-no" title="statement not covered" > this.client = undefined;</span>
2104
+ <span class="cstat-no" title="statement not covered" > }</span>
2105
+ <span class="cstat-no" title="statement not covered" ></span>
2106
+ <span class="cstat-no" title="statement not covered" > this.currentInvite = undefined;</span>
2107
+ <span class="cstat-no" title="statement not covered" > this.runInZone(() =&gt; this._p2pState.set('nostr-only'));</span>
2108
+ <span class="cstat-no" title="statement not covered" > }</span>
2109
+ <span class="cstat-no" title="statement not covered" ></span>
2110
+ <span class="cstat-no" title="statement not covered" > /**</span>
2111
+ <span class="cstat-no" title="statement not covered" > * Notify connected callbacks</span>
2112
+ <span class="cstat-no" title="statement not covered" > * @param session</span>
2113
+ <span class="cstat-no" title="statement not covered" > */</span>
2114
+ <span class="cstat-no" title="statement not covered" > private notifyConnected(session: P2PSession): void {</span>
2115
+ <span class="cstat-no" title="statement not covered" > for (const callback of this.connectedCallbacks) {</span>
2116
+ <span class="cstat-no" title="statement not covered" > try {</span>
2117
+ <span class="cstat-no" title="statement not covered" > callback(session);</span>
2118
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2119
+ <span class="cstat-no" title="statement not covered" > logger.error('Connected callback error', { error });</span>
2120
+ <span class="cstat-no" title="statement not covered" > }</span>
2121
+ <span class="cstat-no" title="statement not covered" > }</span>
2122
+ <span class="cstat-no" title="statement not covered" > }</span>
2123
+ <span class="cstat-no" title="statement not covered" ></span>
2124
+ <span class="cstat-no" title="statement not covered" > /**</span>
2125
+ <span class="cstat-no" title="statement not covered" > * Notify disconnected callbacks</span>
2126
+ <span class="cstat-no" title="statement not covered" > */</span>
2127
+ <span class="cstat-no" title="statement not covered" > private notifyDisconnected(): void {</span>
2128
+ <span class="cstat-no" title="statement not covered" > for (const callback of this.disconnectedCallbacks) {</span>
2129
+ <span class="cstat-no" title="statement not covered" > try {</span>
2130
+ <span class="cstat-no" title="statement not covered" > callback();</span>
2131
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
2132
+ <span class="cstat-no" title="statement not covered" > logger.error('Disconnected callback error', { error });</span>
2133
+ <span class="cstat-no" title="statement not covered" > }</span>
2134
+ <span class="cstat-no" title="statement not covered" > }</span>
2135
+ <span class="cstat-no" title="statement not covered" > }</span>
2136
+ <span class="cstat-no" title="statement not covered" ></span>
2137
+ <span class="cstat-no" title="statement not covered" > /**</span>
2138
+ <span class="cstat-no" title="statement not covered" > * Notify error callbacks</span>
2139
+ <span class="cstat-no" title="statement not covered" > * @param error</span>
2140
+ <span class="cstat-no" title="statement not covered" > */</span>
2141
+ <span class="cstat-no" title="statement not covered" > private notifyError(error: Error): void {</span>
2142
+ <span class="cstat-no" title="statement not covered" > for (const callback of this.errorCallbacks) {</span>
2143
+ <span class="cstat-no" title="statement not covered" > try {</span>
2144
+ <span class="cstat-no" title="statement not covered" > callback(error);</span>
2145
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
2146
+ <span class="cstat-no" title="statement not covered" > logger.error('Error callback error', { err });</span>
2147
+ <span class="cstat-no" title="statement not covered" > }</span>
2148
+ <span class="cstat-no" title="statement not covered" > }</span>
2149
+ <span class="cstat-no" title="statement not covered" > }</span>
2150
+ <span class="cstat-no" title="statement not covered" >}</span>
2151
+ &nbsp;</pre></td></tr></table></pre>
2152
+
2153
+ <div class='push'></div><!-- for sticky footer -->
2154
+ </div><!-- /wrapper -->
2155
+ <div class='footer quiet pad2 space-top1 center small'>
2156
+ Code coverage generated by
2157
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2158
+ at 2026-06-02T14:30:38.257Z
2159
+ </div>
2160
+ <script src="../../../prettify.js"></script>
2161
+ <script>
2162
+ window.onload = function () {
2163
+ prettyPrint();
2164
+ };
2165
+ </script>
2166
+ <script src="../../../sorter.js"></script>
2167
+ <script src="../../../block-navigation.js"></script>
2168
+ </body>
2169
+ </html>
2170
+