@sidhujag/sysweb3-keyring 1.0.545 → 1.0.547

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 (212) hide show
  1. package/coverage/clover.xml +2875 -0
  2. package/coverage/coverage-final.json +29468 -0
  3. package/coverage/lcov-report/base.css +354 -0
  4. package/coverage/lcov-report/block-navigation.js +85 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +320 -0
  7. package/coverage/lcov-report/prettify.css +101 -0
  8. package/coverage/lcov-report/prettify.js +1008 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +191 -0
  11. package/coverage/lcov-report/src/index.html +276 -0
  12. package/coverage/lcov-report/src/index.ts.html +114 -0
  13. package/coverage/lcov-report/src/initial-state.ts.html +558 -0
  14. package/coverage/lcov-report/src/keyring-manager.ts.html +6279 -0
  15. package/coverage/lcov-report/src/ledger/bitcoin_client/index.html +178 -0
  16. package/coverage/lcov-report/src/ledger/bitcoin_client/index.ts.html +144 -0
  17. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/appClient.ts.html +1560 -0
  18. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/bip32.ts.html +276 -0
  19. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/buffertools.ts.html +495 -0
  20. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/clientCommands.ts.html +1138 -0
  21. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/index.html +363 -0
  22. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts.html +289 -0
  23. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkle.ts.html +486 -0
  24. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/merkleMap.ts.html +240 -0
  25. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/policy.ts.html +342 -0
  26. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/psbtv2.ts.html +2388 -0
  27. package/coverage/lcov-report/src/ledger/bitcoin_client/lib/varint.ts.html +453 -0
  28. package/coverage/lcov-report/src/ledger/consts.ts.html +177 -0
  29. package/coverage/lcov-report/src/ledger/index.html +216 -0
  30. package/coverage/lcov-report/src/ledger/index.ts.html +1371 -0
  31. package/coverage/lcov-report/src/ledger/utils.ts.html +102 -0
  32. package/coverage/lcov-report/src/signers.ts.html +591 -0
  33. package/coverage/lcov-report/src/storage.ts.html +198 -0
  34. package/coverage/lcov-report/src/transactions/ethereum.ts.html +5826 -0
  35. package/coverage/lcov-report/src/transactions/index.html +216 -0
  36. package/coverage/lcov-report/src/transactions/index.ts.html +93 -0
  37. package/coverage/lcov-report/src/transactions/syscoin.ts.html +1521 -0
  38. package/coverage/lcov-report/src/trezor/index.html +176 -0
  39. package/coverage/lcov-report/src/trezor/index.ts.html +2655 -0
  40. package/coverage/lcov-report/src/types.ts.html +1443 -0
  41. package/coverage/lcov-report/src/utils/derivation-paths.ts.html +486 -0
  42. package/coverage/lcov-report/src/utils/index.html +196 -0
  43. package/coverage/lcov-report/src/utils/psbt.ts.html +159 -0
  44. package/coverage/lcov-report/test/helpers/constants.ts.html +627 -0
  45. package/coverage/lcov-report/test/helpers/index.html +176 -0
  46. package/coverage/lcov.info +4832 -0
  47. package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/appClient.js +1 -124
  48. package/dist/cjs/ledger/bitcoin_client/lib/appClient.js.map +1 -0
  49. package/{cjs → dist/cjs}/transactions/ethereum.js +6 -2
  50. package/dist/cjs/transactions/ethereum.js.map +1 -0
  51. package/dist/package.json +50 -0
  52. package/{types → dist/types}/ledger/bitcoin_client/lib/appClient.d.ts +0 -6
  53. package/examples/basic-usage.js +140 -0
  54. package/jest.config.js +32 -0
  55. package/package.json +31 -13
  56. package/readme.md +201 -0
  57. package/src/declare.d.ts +7 -0
  58. package/src/errorUtils.ts +83 -0
  59. package/src/hardware-wallet-manager.ts +655 -0
  60. package/src/index.ts +12 -0
  61. package/src/initial-state.ts +108 -0
  62. package/src/keyring-manager.ts +2698 -0
  63. package/src/ledger/bitcoin_client/index.ts +19 -0
  64. package/src/ledger/bitcoin_client/lib/appClient.ts +405 -0
  65. package/src/ledger/bitcoin_client/lib/bip32.ts +61 -0
  66. package/src/ledger/bitcoin_client/lib/buffertools.ts +134 -0
  67. package/src/ledger/bitcoin_client/lib/clientCommands.ts +356 -0
  68. package/src/ledger/bitcoin_client/lib/constants.ts +12 -0
  69. package/src/ledger/bitcoin_client/lib/merkelizedPsbt.ts +65 -0
  70. package/src/ledger/bitcoin_client/lib/merkle.ts +136 -0
  71. package/src/ledger/bitcoin_client/lib/merkleMap.ts +49 -0
  72. package/src/ledger/bitcoin_client/lib/policy.ts +91 -0
  73. package/src/ledger/bitcoin_client/lib/psbtv2.ts +768 -0
  74. package/src/ledger/bitcoin_client/lib/varint.ts +120 -0
  75. package/src/ledger/consts.ts +3 -0
  76. package/src/ledger/index.ts +685 -0
  77. package/src/ledger/types.ts +74 -0
  78. package/src/network-utils.ts +99 -0
  79. package/src/providers.ts +345 -0
  80. package/src/signers.ts +158 -0
  81. package/src/storage.ts +63 -0
  82. package/src/transactions/__tests__/integration.test.ts +303 -0
  83. package/src/transactions/__tests__/syscoin.test.ts +409 -0
  84. package/src/transactions/ethereum.ts +2503 -0
  85. package/src/transactions/index.ts +2 -0
  86. package/src/transactions/syscoin.ts +542 -0
  87. package/src/trezor/index.ts +1050 -0
  88. package/src/types.ts +366 -0
  89. package/src/utils/derivation-paths.ts +133 -0
  90. package/src/utils/psbt.ts +24 -0
  91. package/src/utils.ts +191 -0
  92. package/test/README.md +158 -0
  93. package/test/__mocks__/ledger-mock.js +20 -0
  94. package/test/__mocks__/trezor-mock.js +75 -0
  95. package/test/cleanup-summary.md +167 -0
  96. package/test/helpers/README.md +78 -0
  97. package/test/helpers/constants.ts +79 -0
  98. package/test/helpers/setup.ts +714 -0
  99. package/test/integration/import-validation.spec.ts +588 -0
  100. package/test/unit/hardware/ledger.spec.ts +869 -0
  101. package/test/unit/hardware/trezor.spec.ts +828 -0
  102. package/test/unit/keyring-manager/account-management.spec.ts +970 -0
  103. package/test/unit/keyring-manager/import-watchonly.spec.ts +181 -0
  104. package/test/unit/keyring-manager/import-wif.spec.ts +126 -0
  105. package/test/unit/keyring-manager/initialization.spec.ts +782 -0
  106. package/test/unit/keyring-manager/key-derivation.spec.ts +996 -0
  107. package/test/unit/keyring-manager/security.spec.ts +505 -0
  108. package/test/unit/keyring-manager/state-management.spec.ts +375 -0
  109. package/test/unit/network/network-management.spec.ts +372 -0
  110. package/test/unit/transactions/ethereum-transactions.spec.ts +382 -0
  111. package/test/unit/transactions/syscoin-transactions.spec.ts +615 -0
  112. package/tsconfig.json +14 -0
  113. package/cjs/ledger/bitcoin_client/lib/appClient.js.map +0 -1
  114. package/cjs/transactions/ethereum.js.map +0 -1
  115. /package/{README.md → dist/README.md} +0 -0
  116. /package/{cjs → dist/cjs}/errorUtils.js +0 -0
  117. /package/{cjs → dist/cjs}/errorUtils.js.map +0 -0
  118. /package/{cjs → dist/cjs}/hardware-wallet-manager.js +0 -0
  119. /package/{cjs → dist/cjs}/hardware-wallet-manager.js.map +0 -0
  120. /package/{cjs → dist/cjs}/index.js +0 -0
  121. /package/{cjs → dist/cjs}/index.js.map +0 -0
  122. /package/{cjs → dist/cjs}/initial-state.js +0 -0
  123. /package/{cjs → dist/cjs}/initial-state.js.map +0 -0
  124. /package/{cjs → dist/cjs}/keyring-manager.js +0 -0
  125. /package/{cjs → dist/cjs}/keyring-manager.js.map +0 -0
  126. /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js +0 -0
  127. /package/{cjs → dist/cjs}/ledger/bitcoin_client/index.js.map +0 -0
  128. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js +0 -0
  129. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/bip32.js.map +0 -0
  130. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js +0 -0
  131. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/buffertools.js.map +0 -0
  132. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js +0 -0
  133. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/clientCommands.js.map +0 -0
  134. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js +0 -0
  135. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/constants.js.map +0 -0
  136. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js +0 -0
  137. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkelizedPsbt.js.map +0 -0
  138. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js +0 -0
  139. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkle.js.map +0 -0
  140. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js +0 -0
  141. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/merkleMap.js.map +0 -0
  142. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js +0 -0
  143. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/policy.js.map +0 -0
  144. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js +0 -0
  145. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/psbtv2.js.map +0 -0
  146. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js +0 -0
  147. /package/{cjs → dist/cjs}/ledger/bitcoin_client/lib/varint.js.map +0 -0
  148. /package/{cjs → dist/cjs}/ledger/consts.js +0 -0
  149. /package/{cjs → dist/cjs}/ledger/consts.js.map +0 -0
  150. /package/{cjs → dist/cjs}/ledger/index.js +0 -0
  151. /package/{cjs → dist/cjs}/ledger/index.js.map +0 -0
  152. /package/{cjs → dist/cjs}/ledger/types.js +0 -0
  153. /package/{cjs → dist/cjs}/ledger/types.js.map +0 -0
  154. /package/{cjs → dist/cjs}/network-utils.js +0 -0
  155. /package/{cjs → dist/cjs}/network-utils.js.map +0 -0
  156. /package/{cjs → dist/cjs}/providers.js +0 -0
  157. /package/{cjs → dist/cjs}/providers.js.map +0 -0
  158. /package/{cjs → dist/cjs}/signers.js +0 -0
  159. /package/{cjs → dist/cjs}/signers.js.map +0 -0
  160. /package/{cjs → dist/cjs}/storage.js +0 -0
  161. /package/{cjs → dist/cjs}/storage.js.map +0 -0
  162. /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js +0 -0
  163. /package/{cjs → dist/cjs}/transactions/__tests__/integration.test.js.map +0 -0
  164. /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js +0 -0
  165. /package/{cjs → dist/cjs}/transactions/__tests__/syscoin.test.js.map +0 -0
  166. /package/{cjs → dist/cjs}/transactions/index.js +0 -0
  167. /package/{cjs → dist/cjs}/transactions/index.js.map +0 -0
  168. /package/{cjs → dist/cjs}/transactions/syscoin.js +0 -0
  169. /package/{cjs → dist/cjs}/transactions/syscoin.js.map +0 -0
  170. /package/{cjs → dist/cjs}/trezor/index.js +0 -0
  171. /package/{cjs → dist/cjs}/trezor/index.js.map +0 -0
  172. /package/{cjs → dist/cjs}/types.js +0 -0
  173. /package/{cjs → dist/cjs}/types.js.map +0 -0
  174. /package/{cjs → dist/cjs}/utils/derivation-paths.js +0 -0
  175. /package/{cjs → dist/cjs}/utils/derivation-paths.js.map +0 -0
  176. /package/{cjs → dist/cjs}/utils/psbt.js +0 -0
  177. /package/{cjs → dist/cjs}/utils/psbt.js.map +0 -0
  178. /package/{cjs → dist/cjs}/utils.js +0 -0
  179. /package/{cjs → dist/cjs}/utils.js.map +0 -0
  180. /package/{types → dist/types}/errorUtils.d.ts +0 -0
  181. /package/{types → dist/types}/hardware-wallet-manager.d.ts +0 -0
  182. /package/{types → dist/types}/index.d.ts +0 -0
  183. /package/{types → dist/types}/initial-state.d.ts +0 -0
  184. /package/{types → dist/types}/keyring-manager.d.ts +0 -0
  185. /package/{types → dist/types}/ledger/bitcoin_client/index.d.ts +0 -0
  186. /package/{types → dist/types}/ledger/bitcoin_client/lib/bip32.d.ts +0 -0
  187. /package/{types → dist/types}/ledger/bitcoin_client/lib/buffertools.d.ts +0 -0
  188. /package/{types → dist/types}/ledger/bitcoin_client/lib/clientCommands.d.ts +0 -0
  189. /package/{types → dist/types}/ledger/bitcoin_client/lib/constants.d.ts +0 -0
  190. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkelizedPsbt.d.ts +0 -0
  191. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkle.d.ts +0 -0
  192. /package/{types → dist/types}/ledger/bitcoin_client/lib/merkleMap.d.ts +0 -0
  193. /package/{types → dist/types}/ledger/bitcoin_client/lib/policy.d.ts +0 -0
  194. /package/{types → dist/types}/ledger/bitcoin_client/lib/psbtv2.d.ts +0 -0
  195. /package/{types → dist/types}/ledger/bitcoin_client/lib/varint.d.ts +0 -0
  196. /package/{types → dist/types}/ledger/consts.d.ts +0 -0
  197. /package/{types → dist/types}/ledger/index.d.ts +0 -0
  198. /package/{types → dist/types}/ledger/types.d.ts +0 -0
  199. /package/{types → dist/types}/network-utils.d.ts +0 -0
  200. /package/{types → dist/types}/providers.d.ts +0 -0
  201. /package/{types → dist/types}/signers.d.ts +0 -0
  202. /package/{types → dist/types}/storage.d.ts +0 -0
  203. /package/{types → dist/types}/transactions/__tests__/integration.test.d.ts +0 -0
  204. /package/{types → dist/types}/transactions/__tests__/syscoin.test.d.ts +0 -0
  205. /package/{types → dist/types}/transactions/ethereum.d.ts +0 -0
  206. /package/{types → dist/types}/transactions/index.d.ts +0 -0
  207. /package/{types → dist/types}/transactions/syscoin.d.ts +0 -0
  208. /package/{types → dist/types}/trezor/index.d.ts +0 -0
  209. /package/{types → dist/types}/types.d.ts +0 -0
  210. /package/{types → dist/types}/utils/derivation-paths.d.ts +0 -0
  211. /package/{types → dist/types}/utils/psbt.d.ts +0 -0
  212. /package/{types → dist/types}/utils.d.ts +0 -0
@@ -0,0 +1,1521 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Code coverage report for src/transactions/syscoin.ts</title>
5
+ <meta charset="utf-8" />
6
+ <link rel="stylesheet" href="../../prettify.css" />
7
+ <link rel="stylesheet" href="../../base.css" />
8
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <style type="text/css">
11
+ .coverage-summary .sorter {
12
+ background-image: url(../../sort-arrow-sprite.png);
13
+ }
14
+ </style>
15
+ </head>
16
+
17
+ <body>
18
+ <div class="wrapper">
19
+ <div class="pad1">
20
+ <h1>
21
+ <a href="../../index.html">All files</a> /
22
+ <a href="index.html">src/transactions</a> syscoin.ts
23
+ </h1>
24
+ <div class="clearfix">
25
+ <div class="fl pad1y space-right2">
26
+ <span class="strong">41.12% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class="fraction">51/124</span>
29
+ </div>
30
+
31
+ <div class="fl pad1y space-right2">
32
+ <span class="strong">7.57% </span>
33
+ <span class="quiet">Branches</span>
34
+ <span class="fraction">5/66</span>
35
+ </div>
36
+
37
+ <div class="fl pad1y space-right2">
38
+ <span class="strong">46.15% </span>
39
+ <span class="quiet">Functions</span>
40
+ <span class="fraction">6/13</span>
41
+ </div>
42
+
43
+ <div class="fl pad1y space-right2">
44
+ <span class="strong">41.12% </span>
45
+ <span class="quiet">Lines</span>
46
+ <span class="fraction">51/124</span>
47
+ </div>
48
+ </div>
49
+ <p class="quiet">
50
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block,
51
+ <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
52
+ </p>
53
+ <template id="filterTemplate">
54
+ <div class="quiet">
55
+ Filter:
56
+ <input type="search" id="fileSearch" />
57
+ </div>
58
+ </template>
59
+ </div>
60
+ <div class="status-line low"></div>
61
+ <pre><table class="coverage">
62
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
63
+ <a name='L2'></a><a href='#L2'>2</a>
64
+ <a name='L3'></a><a href='#L3'>3</a>
65
+ <a name='L4'></a><a href='#L4'>4</a>
66
+ <a name='L5'></a><a href='#L5'>5</a>
67
+ <a name='L6'></a><a href='#L6'>6</a>
68
+ <a name='L7'></a><a href='#L7'>7</a>
69
+ <a name='L8'></a><a href='#L8'>8</a>
70
+ <a name='L9'></a><a href='#L9'>9</a>
71
+ <a name='L10'></a><a href='#L10'>10</a>
72
+ <a name='L11'></a><a href='#L11'>11</a>
73
+ <a name='L12'></a><a href='#L12'>12</a>
74
+ <a name='L13'></a><a href='#L13'>13</a>
75
+ <a name='L14'></a><a href='#L14'>14</a>
76
+ <a name='L15'></a><a href='#L15'>15</a>
77
+ <a name='L16'></a><a href='#L16'>16</a>
78
+ <a name='L17'></a><a href='#L17'>17</a>
79
+ <a name='L18'></a><a href='#L18'>18</a>
80
+ <a name='L19'></a><a href='#L19'>19</a>
81
+ <a name='L20'></a><a href='#L20'>20</a>
82
+ <a name='L21'></a><a href='#L21'>21</a>
83
+ <a name='L22'></a><a href='#L22'>22</a>
84
+ <a name='L23'></a><a href='#L23'>23</a>
85
+ <a name='L24'></a><a href='#L24'>24</a>
86
+ <a name='L25'></a><a href='#L25'>25</a>
87
+ <a name='L26'></a><a href='#L26'>26</a>
88
+ <a name='L27'></a><a href='#L27'>27</a>
89
+ <a name='L28'></a><a href='#L28'>28</a>
90
+ <a name='L29'></a><a href='#L29'>29</a>
91
+ <a name='L30'></a><a href='#L30'>30</a>
92
+ <a name='L31'></a><a href='#L31'>31</a>
93
+ <a name='L32'></a><a href='#L32'>32</a>
94
+ <a name='L33'></a><a href='#L33'>33</a>
95
+ <a name='L34'></a><a href='#L34'>34</a>
96
+ <a name='L35'></a><a href='#L35'>35</a>
97
+ <a name='L36'></a><a href='#L36'>36</a>
98
+ <a name='L37'></a><a href='#L37'>37</a>
99
+ <a name='L38'></a><a href='#L38'>38</a>
100
+ <a name='L39'></a><a href='#L39'>39</a>
101
+ <a name='L40'></a><a href='#L40'>40</a>
102
+ <a name='L41'></a><a href='#L41'>41</a>
103
+ <a name='L42'></a><a href='#L42'>42</a>
104
+ <a name='L43'></a><a href='#L43'>43</a>
105
+ <a name='L44'></a><a href='#L44'>44</a>
106
+ <a name='L45'></a><a href='#L45'>45</a>
107
+ <a name='L46'></a><a href='#L46'>46</a>
108
+ <a name='L47'></a><a href='#L47'>47</a>
109
+ <a name='L48'></a><a href='#L48'>48</a>
110
+ <a name='L49'></a><a href='#L49'>49</a>
111
+ <a name='L50'></a><a href='#L50'>50</a>
112
+ <a name='L51'></a><a href='#L51'>51</a>
113
+ <a name='L52'></a><a href='#L52'>52</a>
114
+ <a name='L53'></a><a href='#L53'>53</a>
115
+ <a name='L54'></a><a href='#L54'>54</a>
116
+ <a name='L55'></a><a href='#L55'>55</a>
117
+ <a name='L56'></a><a href='#L56'>56</a>
118
+ <a name='L57'></a><a href='#L57'>57</a>
119
+ <a name='L58'></a><a href='#L58'>58</a>
120
+ <a name='L59'></a><a href='#L59'>59</a>
121
+ <a name='L60'></a><a href='#L60'>60</a>
122
+ <a name='L61'></a><a href='#L61'>61</a>
123
+ <a name='L62'></a><a href='#L62'>62</a>
124
+ <a name='L63'></a><a href='#L63'>63</a>
125
+ <a name='L64'></a><a href='#L64'>64</a>
126
+ <a name='L65'></a><a href='#L65'>65</a>
127
+ <a name='L66'></a><a href='#L66'>66</a>
128
+ <a name='L67'></a><a href='#L67'>67</a>
129
+ <a name='L68'></a><a href='#L68'>68</a>
130
+ <a name='L69'></a><a href='#L69'>69</a>
131
+ <a name='L70'></a><a href='#L70'>70</a>
132
+ <a name='L71'></a><a href='#L71'>71</a>
133
+ <a name='L72'></a><a href='#L72'>72</a>
134
+ <a name='L73'></a><a href='#L73'>73</a>
135
+ <a name='L74'></a><a href='#L74'>74</a>
136
+ <a name='L75'></a><a href='#L75'>75</a>
137
+ <a name='L76'></a><a href='#L76'>76</a>
138
+ <a name='L77'></a><a href='#L77'>77</a>
139
+ <a name='L78'></a><a href='#L78'>78</a>
140
+ <a name='L79'></a><a href='#L79'>79</a>
141
+ <a name='L80'></a><a href='#L80'>80</a>
142
+ <a name='L81'></a><a href='#L81'>81</a>
143
+ <a name='L82'></a><a href='#L82'>82</a>
144
+ <a name='L83'></a><a href='#L83'>83</a>
145
+ <a name='L84'></a><a href='#L84'>84</a>
146
+ <a name='L85'></a><a href='#L85'>85</a>
147
+ <a name='L86'></a><a href='#L86'>86</a>
148
+ <a name='L87'></a><a href='#L87'>87</a>
149
+ <a name='L88'></a><a href='#L88'>88</a>
150
+ <a name='L89'></a><a href='#L89'>89</a>
151
+ <a name='L90'></a><a href='#L90'>90</a>
152
+ <a name='L91'></a><a href='#L91'>91</a>
153
+ <a name='L92'></a><a href='#L92'>92</a>
154
+ <a name='L93'></a><a href='#L93'>93</a>
155
+ <a name='L94'></a><a href='#L94'>94</a>
156
+ <a name='L95'></a><a href='#L95'>95</a>
157
+ <a name='L96'></a><a href='#L96'>96</a>
158
+ <a name='L97'></a><a href='#L97'>97</a>
159
+ <a name='L98'></a><a href='#L98'>98</a>
160
+ <a name='L99'></a><a href='#L99'>99</a>
161
+ <a name='L100'></a><a href='#L100'>100</a>
162
+ <a name='L101'></a><a href='#L101'>101</a>
163
+ <a name='L102'></a><a href='#L102'>102</a>
164
+ <a name='L103'></a><a href='#L103'>103</a>
165
+ <a name='L104'></a><a href='#L104'>104</a>
166
+ <a name='L105'></a><a href='#L105'>105</a>
167
+ <a name='L106'></a><a href='#L106'>106</a>
168
+ <a name='L107'></a><a href='#L107'>107</a>
169
+ <a name='L108'></a><a href='#L108'>108</a>
170
+ <a name='L109'></a><a href='#L109'>109</a>
171
+ <a name='L110'></a><a href='#L110'>110</a>
172
+ <a name='L111'></a><a href='#L111'>111</a>
173
+ <a name='L112'></a><a href='#L112'>112</a>
174
+ <a name='L113'></a><a href='#L113'>113</a>
175
+ <a name='L114'></a><a href='#L114'>114</a>
176
+ <a name='L115'></a><a href='#L115'>115</a>
177
+ <a name='L116'></a><a href='#L116'>116</a>
178
+ <a name='L117'></a><a href='#L117'>117</a>
179
+ <a name='L118'></a><a href='#L118'>118</a>
180
+ <a name='L119'></a><a href='#L119'>119</a>
181
+ <a name='L120'></a><a href='#L120'>120</a>
182
+ <a name='L121'></a><a href='#L121'>121</a>
183
+ <a name='L122'></a><a href='#L122'>122</a>
184
+ <a name='L123'></a><a href='#L123'>123</a>
185
+ <a name='L124'></a><a href='#L124'>124</a>
186
+ <a name='L125'></a><a href='#L125'>125</a>
187
+ <a name='L126'></a><a href='#L126'>126</a>
188
+ <a name='L127'></a><a href='#L127'>127</a>
189
+ <a name='L128'></a><a href='#L128'>128</a>
190
+ <a name='L129'></a><a href='#L129'>129</a>
191
+ <a name='L130'></a><a href='#L130'>130</a>
192
+ <a name='L131'></a><a href='#L131'>131</a>
193
+ <a name='L132'></a><a href='#L132'>132</a>
194
+ <a name='L133'></a><a href='#L133'>133</a>
195
+ <a name='L134'></a><a href='#L134'>134</a>
196
+ <a name='L135'></a><a href='#L135'>135</a>
197
+ <a name='L136'></a><a href='#L136'>136</a>
198
+ <a name='L137'></a><a href='#L137'>137</a>
199
+ <a name='L138'></a><a href='#L138'>138</a>
200
+ <a name='L139'></a><a href='#L139'>139</a>
201
+ <a name='L140'></a><a href='#L140'>140</a>
202
+ <a name='L141'></a><a href='#L141'>141</a>
203
+ <a name='L142'></a><a href='#L142'>142</a>
204
+ <a name='L143'></a><a href='#L143'>143</a>
205
+ <a name='L144'></a><a href='#L144'>144</a>
206
+ <a name='L145'></a><a href='#L145'>145</a>
207
+ <a name='L146'></a><a href='#L146'>146</a>
208
+ <a name='L147'></a><a href='#L147'>147</a>
209
+ <a name='L148'></a><a href='#L148'>148</a>
210
+ <a name='L149'></a><a href='#L149'>149</a>
211
+ <a name='L150'></a><a href='#L150'>150</a>
212
+ <a name='L151'></a><a href='#L151'>151</a>
213
+ <a name='L152'></a><a href='#L152'>152</a>
214
+ <a name='L153'></a><a href='#L153'>153</a>
215
+ <a name='L154'></a><a href='#L154'>154</a>
216
+ <a name='L155'></a><a href='#L155'>155</a>
217
+ <a name='L156'></a><a href='#L156'>156</a>
218
+ <a name='L157'></a><a href='#L157'>157</a>
219
+ <a name='L158'></a><a href='#L158'>158</a>
220
+ <a name='L159'></a><a href='#L159'>159</a>
221
+ <a name='L160'></a><a href='#L160'>160</a>
222
+ <a name='L161'></a><a href='#L161'>161</a>
223
+ <a name='L162'></a><a href='#L162'>162</a>
224
+ <a name='L163'></a><a href='#L163'>163</a>
225
+ <a name='L164'></a><a href='#L164'>164</a>
226
+ <a name='L165'></a><a href='#L165'>165</a>
227
+ <a name='L166'></a><a href='#L166'>166</a>
228
+ <a name='L167'></a><a href='#L167'>167</a>
229
+ <a name='L168'></a><a href='#L168'>168</a>
230
+ <a name='L169'></a><a href='#L169'>169</a>
231
+ <a name='L170'></a><a href='#L170'>170</a>
232
+ <a name='L171'></a><a href='#L171'>171</a>
233
+ <a name='L172'></a><a href='#L172'>172</a>
234
+ <a name='L173'></a><a href='#L173'>173</a>
235
+ <a name='L174'></a><a href='#L174'>174</a>
236
+ <a name='L175'></a><a href='#L175'>175</a>
237
+ <a name='L176'></a><a href='#L176'>176</a>
238
+ <a name='L177'></a><a href='#L177'>177</a>
239
+ <a name='L178'></a><a href='#L178'>178</a>
240
+ <a name='L179'></a><a href='#L179'>179</a>
241
+ <a name='L180'></a><a href='#L180'>180</a>
242
+ <a name='L181'></a><a href='#L181'>181</a>
243
+ <a name='L182'></a><a href='#L182'>182</a>
244
+ <a name='L183'></a><a href='#L183'>183</a>
245
+ <a name='L184'></a><a href='#L184'>184</a>
246
+ <a name='L185'></a><a href='#L185'>185</a>
247
+ <a name='L186'></a><a href='#L186'>186</a>
248
+ <a name='L187'></a><a href='#L187'>187</a>
249
+ <a name='L188'></a><a href='#L188'>188</a>
250
+ <a name='L189'></a><a href='#L189'>189</a>
251
+ <a name='L190'></a><a href='#L190'>190</a>
252
+ <a name='L191'></a><a href='#L191'>191</a>
253
+ <a name='L192'></a><a href='#L192'>192</a>
254
+ <a name='L193'></a><a href='#L193'>193</a>
255
+ <a name='L194'></a><a href='#L194'>194</a>
256
+ <a name='L195'></a><a href='#L195'>195</a>
257
+ <a name='L196'></a><a href='#L196'>196</a>
258
+ <a name='L197'></a><a href='#L197'>197</a>
259
+ <a name='L198'></a><a href='#L198'>198</a>
260
+ <a name='L199'></a><a href='#L199'>199</a>
261
+ <a name='L200'></a><a href='#L200'>200</a>
262
+ <a name='L201'></a><a href='#L201'>201</a>
263
+ <a name='L202'></a><a href='#L202'>202</a>
264
+ <a name='L203'></a><a href='#L203'>203</a>
265
+ <a name='L204'></a><a href='#L204'>204</a>
266
+ <a name='L205'></a><a href='#L205'>205</a>
267
+ <a name='L206'></a><a href='#L206'>206</a>
268
+ <a name='L207'></a><a href='#L207'>207</a>
269
+ <a name='L208'></a><a href='#L208'>208</a>
270
+ <a name='L209'></a><a href='#L209'>209</a>
271
+ <a name='L210'></a><a href='#L210'>210</a>
272
+ <a name='L211'></a><a href='#L211'>211</a>
273
+ <a name='L212'></a><a href='#L212'>212</a>
274
+ <a name='L213'></a><a href='#L213'>213</a>
275
+ <a name='L214'></a><a href='#L214'>214</a>
276
+ <a name='L215'></a><a href='#L215'>215</a>
277
+ <a name='L216'></a><a href='#L216'>216</a>
278
+ <a name='L217'></a><a href='#L217'>217</a>
279
+ <a name='L218'></a><a href='#L218'>218</a>
280
+ <a name='L219'></a><a href='#L219'>219</a>
281
+ <a name='L220'></a><a href='#L220'>220</a>
282
+ <a name='L221'></a><a href='#L221'>221</a>
283
+ <a name='L222'></a><a href='#L222'>222</a>
284
+ <a name='L223'></a><a href='#L223'>223</a>
285
+ <a name='L224'></a><a href='#L224'>224</a>
286
+ <a name='L225'></a><a href='#L225'>225</a>
287
+ <a name='L226'></a><a href='#L226'>226</a>
288
+ <a name='L227'></a><a href='#L227'>227</a>
289
+ <a name='L228'></a><a href='#L228'>228</a>
290
+ <a name='L229'></a><a href='#L229'>229</a>
291
+ <a name='L230'></a><a href='#L230'>230</a>
292
+ <a name='L231'></a><a href='#L231'>231</a>
293
+ <a name='L232'></a><a href='#L232'>232</a>
294
+ <a name='L233'></a><a href='#L233'>233</a>
295
+ <a name='L234'></a><a href='#L234'>234</a>
296
+ <a name='L235'></a><a href='#L235'>235</a>
297
+ <a name='L236'></a><a href='#L236'>236</a>
298
+ <a name='L237'></a><a href='#L237'>237</a>
299
+ <a name='L238'></a><a href='#L238'>238</a>
300
+ <a name='L239'></a><a href='#L239'>239</a>
301
+ <a name='L240'></a><a href='#L240'>240</a>
302
+ <a name='L241'></a><a href='#L241'>241</a>
303
+ <a name='L242'></a><a href='#L242'>242</a>
304
+ <a name='L243'></a><a href='#L243'>243</a>
305
+ <a name='L244'></a><a href='#L244'>244</a>
306
+ <a name='L245'></a><a href='#L245'>245</a>
307
+ <a name='L246'></a><a href='#L246'>246</a>
308
+ <a name='L247'></a><a href='#L247'>247</a>
309
+ <a name='L248'></a><a href='#L248'>248</a>
310
+ <a name='L249'></a><a href='#L249'>249</a>
311
+ <a name='L250'></a><a href='#L250'>250</a>
312
+ <a name='L251'></a><a href='#L251'>251</a>
313
+ <a name='L252'></a><a href='#L252'>252</a>
314
+ <a name='L253'></a><a href='#L253'>253</a>
315
+ <a name='L254'></a><a href='#L254'>254</a>
316
+ <a name='L255'></a><a href='#L255'>255</a>
317
+ <a name='L256'></a><a href='#L256'>256</a>
318
+ <a name='L257'></a><a href='#L257'>257</a>
319
+ <a name='L258'></a><a href='#L258'>258</a>
320
+ <a name='L259'></a><a href='#L259'>259</a>
321
+ <a name='L260'></a><a href='#L260'>260</a>
322
+ <a name='L261'></a><a href='#L261'>261</a>
323
+ <a name='L262'></a><a href='#L262'>262</a>
324
+ <a name='L263'></a><a href='#L263'>263</a>
325
+ <a name='L264'></a><a href='#L264'>264</a>
326
+ <a name='L265'></a><a href='#L265'>265</a>
327
+ <a name='L266'></a><a href='#L266'>266</a>
328
+ <a name='L267'></a><a href='#L267'>267</a>
329
+ <a name='L268'></a><a href='#L268'>268</a>
330
+ <a name='L269'></a><a href='#L269'>269</a>
331
+ <a name='L270'></a><a href='#L270'>270</a>
332
+ <a name='L271'></a><a href='#L271'>271</a>
333
+ <a name='L272'></a><a href='#L272'>272</a>
334
+ <a name='L273'></a><a href='#L273'>273</a>
335
+ <a name='L274'></a><a href='#L274'>274</a>
336
+ <a name='L275'></a><a href='#L275'>275</a>
337
+ <a name='L276'></a><a href='#L276'>276</a>
338
+ <a name='L277'></a><a href='#L277'>277</a>
339
+ <a name='L278'></a><a href='#L278'>278</a>
340
+ <a name='L279'></a><a href='#L279'>279</a>
341
+ <a name='L280'></a><a href='#L280'>280</a>
342
+ <a name='L281'></a><a href='#L281'>281</a>
343
+ <a name='L282'></a><a href='#L282'>282</a>
344
+ <a name='L283'></a><a href='#L283'>283</a>
345
+ <a name='L284'></a><a href='#L284'>284</a>
346
+ <a name='L285'></a><a href='#L285'>285</a>
347
+ <a name='L286'></a><a href='#L286'>286</a>
348
+ <a name='L287'></a><a href='#L287'>287</a>
349
+ <a name='L288'></a><a href='#L288'>288</a>
350
+ <a name='L289'></a><a href='#L289'>289</a>
351
+ <a name='L290'></a><a href='#L290'>290</a>
352
+ <a name='L291'></a><a href='#L291'>291</a>
353
+ <a name='L292'></a><a href='#L292'>292</a>
354
+ <a name='L293'></a><a href='#L293'>293</a>
355
+ <a name='L294'></a><a href='#L294'>294</a>
356
+ <a name='L295'></a><a href='#L295'>295</a>
357
+ <a name='L296'></a><a href='#L296'>296</a>
358
+ <a name='L297'></a><a href='#L297'>297</a>
359
+ <a name='L298'></a><a href='#L298'>298</a>
360
+ <a name='L299'></a><a href='#L299'>299</a>
361
+ <a name='L300'></a><a href='#L300'>300</a>
362
+ <a name='L301'></a><a href='#L301'>301</a>
363
+ <a name='L302'></a><a href='#L302'>302</a>
364
+ <a name='L303'></a><a href='#L303'>303</a>
365
+ <a name='L304'></a><a href='#L304'>304</a>
366
+ <a name='L305'></a><a href='#L305'>305</a>
367
+ <a name='L306'></a><a href='#L306'>306</a>
368
+ <a name='L307'></a><a href='#L307'>307</a>
369
+ <a name='L308'></a><a href='#L308'>308</a>
370
+ <a name='L309'></a><a href='#L309'>309</a>
371
+ <a name='L310'></a><a href='#L310'>310</a>
372
+ <a name='L311'></a><a href='#L311'>311</a>
373
+ <a name='L312'></a><a href='#L312'>312</a>
374
+ <a name='L313'></a><a href='#L313'>313</a>
375
+ <a name='L314'></a><a href='#L314'>314</a>
376
+ <a name='L315'></a><a href='#L315'>315</a>
377
+ <a name='L316'></a><a href='#L316'>316</a>
378
+ <a name='L317'></a><a href='#L317'>317</a>
379
+ <a name='L318'></a><a href='#L318'>318</a>
380
+ <a name='L319'></a><a href='#L319'>319</a>
381
+ <a name='L320'></a><a href='#L320'>320</a>
382
+ <a name='L321'></a><a href='#L321'>321</a>
383
+ <a name='L322'></a><a href='#L322'>322</a>
384
+ <a name='L323'></a><a href='#L323'>323</a>
385
+ <a name='L324'></a><a href='#L324'>324</a>
386
+ <a name='L325'></a><a href='#L325'>325</a>
387
+ <a name='L326'></a><a href='#L326'>326</a>
388
+ <a name='L327'></a><a href='#L327'>327</a>
389
+ <a name='L328'></a><a href='#L328'>328</a>
390
+ <a name='L329'></a><a href='#L329'>329</a>
391
+ <a name='L330'></a><a href='#L330'>330</a>
392
+ <a name='L331'></a><a href='#L331'>331</a>
393
+ <a name='L332'></a><a href='#L332'>332</a>
394
+ <a name='L333'></a><a href='#L333'>333</a>
395
+ <a name='L334'></a><a href='#L334'>334</a>
396
+ <a name='L335'></a><a href='#L335'>335</a>
397
+ <a name='L336'></a><a href='#L336'>336</a>
398
+ <a name='L337'></a><a href='#L337'>337</a>
399
+ <a name='L338'></a><a href='#L338'>338</a>
400
+ <a name='L339'></a><a href='#L339'>339</a>
401
+ <a name='L340'></a><a href='#L340'>340</a>
402
+ <a name='L341'></a><a href='#L341'>341</a>
403
+ <a name='L342'></a><a href='#L342'>342</a>
404
+ <a name='L343'></a><a href='#L343'>343</a>
405
+ <a name='L344'></a><a href='#L344'>344</a>
406
+ <a name='L345'></a><a href='#L345'>345</a>
407
+ <a name='L346'></a><a href='#L346'>346</a>
408
+ <a name='L347'></a><a href='#L347'>347</a>
409
+ <a name='L348'></a><a href='#L348'>348</a>
410
+ <a name='L349'></a><a href='#L349'>349</a>
411
+ <a name='L350'></a><a href='#L350'>350</a>
412
+ <a name='L351'></a><a href='#L351'>351</a>
413
+ <a name='L352'></a><a href='#L352'>352</a>
414
+ <a name='L353'></a><a href='#L353'>353</a>
415
+ <a name='L354'></a><a href='#L354'>354</a>
416
+ <a name='L355'></a><a href='#L355'>355</a>
417
+ <a name='L356'></a><a href='#L356'>356</a>
418
+ <a name='L357'></a><a href='#L357'>357</a>
419
+ <a name='L358'></a><a href='#L358'>358</a>
420
+ <a name='L359'></a><a href='#L359'>359</a>
421
+ <a name='L360'></a><a href='#L360'>360</a>
422
+ <a name='L361'></a><a href='#L361'>361</a>
423
+ <a name='L362'></a><a href='#L362'>362</a>
424
+ <a name='L363'></a><a href='#L363'>363</a>
425
+ <a name='L364'></a><a href='#L364'>364</a>
426
+ <a name='L365'></a><a href='#L365'>365</a>
427
+ <a name='L366'></a><a href='#L366'>366</a>
428
+ <a name='L367'></a><a href='#L367'>367</a>
429
+ <a name='L368'></a><a href='#L368'>368</a>
430
+ <a name='L369'></a><a href='#L369'>369</a>
431
+ <a name='L370'></a><a href='#L370'>370</a>
432
+ <a name='L371'></a><a href='#L371'>371</a>
433
+ <a name='L372'></a><a href='#L372'>372</a>
434
+ <a name='L373'></a><a href='#L373'>373</a>
435
+ <a name='L374'></a><a href='#L374'>374</a>
436
+ <a name='L375'></a><a href='#L375'>375</a>
437
+ <a name='L376'></a><a href='#L376'>376</a>
438
+ <a name='L377'></a><a href='#L377'>377</a>
439
+ <a name='L378'></a><a href='#L378'>378</a>
440
+ <a name='L379'></a><a href='#L379'>379</a>
441
+ <a name='L380'></a><a href='#L380'>380</a>
442
+ <a name='L381'></a><a href='#L381'>381</a>
443
+ <a name='L382'></a><a href='#L382'>382</a>
444
+ <a name='L383'></a><a href='#L383'>383</a>
445
+ <a name='L384'></a><a href='#L384'>384</a>
446
+ <a name='L385'></a><a href='#L385'>385</a>
447
+ <a name='L386'></a><a href='#L386'>386</a>
448
+ <a name='L387'></a><a href='#L387'>387</a>
449
+ <a name='L388'></a><a href='#L388'>388</a>
450
+ <a name='L389'></a><a href='#L389'>389</a>
451
+ <a name='L390'></a><a href='#L390'>390</a>
452
+ <a name='L391'></a><a href='#L391'>391</a>
453
+ <a name='L392'></a><a href='#L392'>392</a>
454
+ <a name='L393'></a><a href='#L393'>393</a>
455
+ <a name='L394'></a><a href='#L394'>394</a>
456
+ <a name='L395'></a><a href='#L395'>395</a>
457
+ <a name='L396'></a><a href='#L396'>396</a>
458
+ <a name='L397'></a><a href='#L397'>397</a>
459
+ <a name='L398'></a><a href='#L398'>398</a>
460
+ <a name='L399'></a><a href='#L399'>399</a>
461
+ <a name='L400'></a><a href='#L400'>400</a>
462
+ <a name='L401'></a><a href='#L401'>401</a>
463
+ <a name='L402'></a><a href='#L402'>402</a>
464
+ <a name='L403'></a><a href='#L403'>403</a>
465
+ <a name='L404'></a><a href='#L404'>404</a>
466
+ <a name='L405'></a><a href='#L405'>405</a>
467
+ <a name='L406'></a><a href='#L406'>406</a>
468
+ <a name='L407'></a><a href='#L407'>407</a>
469
+ <a name='L408'></a><a href='#L408'>408</a>
470
+ <a name='L409'></a><a href='#L409'>409</a>
471
+ <a name='L410'></a><a href='#L410'>410</a>
472
+ <a name='L411'></a><a href='#L411'>411</a>
473
+ <a name='L412'></a><a href='#L412'>412</a>
474
+ <a name='L413'></a><a href='#L413'>413</a>
475
+ <a name='L414'></a><a href='#L414'>414</a>
476
+ <a name='L415'></a><a href='#L415'>415</a>
477
+ <a name='L416'></a><a href='#L416'>416</a>
478
+ <a name='L417'></a><a href='#L417'>417</a>
479
+ <a name='L418'></a><a href='#L418'>418</a>
480
+ <a name='L419'></a><a href='#L419'>419</a>
481
+ <a name='L420'></a><a href='#L420'>420</a>
482
+ <a name='L421'></a><a href='#L421'>421</a>
483
+ <a name='L422'></a><a href='#L422'>422</a>
484
+ <a name='L423'></a><a href='#L423'>423</a>
485
+ <a name='L424'></a><a href='#L424'>424</a>
486
+ <a name='L425'></a><a href='#L425'>425</a>
487
+ <a name='L426'></a><a href='#L426'>426</a>
488
+ <a name='L427'></a><a href='#L427'>427</a>
489
+ <a name='L428'></a><a href='#L428'>428</a>
490
+ <a name='L429'></a><a href='#L429'>429</a>
491
+ <a name='L430'></a><a href='#L430'>430</a>
492
+ <a name='L431'></a><a href='#L431'>431</a>
493
+ <a name='L432'></a><a href='#L432'>432</a>
494
+ <a name='L433'></a><a href='#L433'>433</a>
495
+ <a name='L434'></a><a href='#L434'>434</a>
496
+ <a name='L435'></a><a href='#L435'>435</a>
497
+ <a name='L436'></a><a href='#L436'>436</a>
498
+ <a name='L437'></a><a href='#L437'>437</a>
499
+ <a name='L438'></a><a href='#L438'>438</a>
500
+ <a name='L439'></a><a href='#L439'>439</a>
501
+ <a name='L440'></a><a href='#L440'>440</a>
502
+ <a name='L441'></a><a href='#L441'>441</a>
503
+ <a name='L442'></a><a href='#L442'>442</a>
504
+ <a name='L443'></a><a href='#L443'>443</a>
505
+ <a name='L444'></a><a href='#L444'>444</a>
506
+ <a name='L445'></a><a href='#L445'>445</a>
507
+ <a name='L446'></a><a href='#L446'>446</a>
508
+ <a name='L447'></a><a href='#L447'>447</a>
509
+ <a name='L448'></a><a href='#L448'>448</a>
510
+ <a name='L449'></a><a href='#L449'>449</a>
511
+ <a name='L450'></a><a href='#L450'>450</a>
512
+ <a name='L451'></a><a href='#L451'>451</a>
513
+ <a name='L452'></a><a href='#L452'>452</a>
514
+ <a name='L453'></a><a href='#L453'>453</a>
515
+ <a name='L454'></a><a href='#L454'>454</a>
516
+ <a name='L455'></a><a href='#L455'>455</a>
517
+ <a name='L456'></a><a href='#L456'>456</a>
518
+ <a name='L457'></a><a href='#L457'>457</a>
519
+ <a name='L458'></a><a href='#L458'>458</a>
520
+ <a name='L459'></a><a href='#L459'>459</a>
521
+ <a name='L460'></a><a href='#L460'>460</a>
522
+ <a name='L461'></a><a href='#L461'>461</a>
523
+ <a name='L462'></a><a href='#L462'>462</a>
524
+ <a name='L463'></a><a href='#L463'>463</a>
525
+ <a name='L464'></a><a href='#L464'>464</a>
526
+ <a name='L465'></a><a href='#L465'>465</a>
527
+ <a name='L466'></a><a href='#L466'>466</a>
528
+ <a name='L467'></a><a href='#L467'>467</a>
529
+ <a name='L468'></a><a href='#L468'>468</a>
530
+ <a name='L469'></a><a href='#L469'>469</a>
531
+ <a name='L470'></a><a href='#L470'>470</a>
532
+ <a name='L471'></a><a href='#L471'>471</a>
533
+ <a name='L472'></a><a href='#L472'>472</a>
534
+ <a name='L473'></a><a href='#L473'>473</a>
535
+ <a name='L474'></a><a href='#L474'>474</a>
536
+ <a name='L475'></a><a href='#L475'>475</a>
537
+ <a name='L476'></a><a href='#L476'>476</a>
538
+ <a name='L477'></a><a href='#L477'>477</a>
539
+ <a name='L478'></a><a href='#L478'>478</a>
540
+ <a name='L479'></a><a href='#L479'>479</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-yes">2x</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-yes">2x</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-yes">2x</span>
553
+ <span class="cline-any cline-yes">2x</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-yes">2x</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-neutral">&nbsp;</span>
563
+ <span class="cline-any cline-neutral">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-yes">2x</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-yes">43x</span>
618
+ <span class="cline-any cline-yes">43x</span>
619
+ <span class="cline-any cline-yes">43x</span>
620
+ <span class="cline-any cline-yes">43x</span>
621
+ <span class="cline-any cline-yes">43x</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-yes">43x</span>
625
+ <span class="cline-any cline-neutral">&nbsp;</span>
626
+ <span class="cline-any cline-neutral">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-no">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-no">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-yes">43x</span>
663
+ <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-yes">43x</span>
669
+ <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-neutral">&nbsp;</span>
671
+ <span class="cline-any cline-yes">43x</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-yes">43x</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-neutral">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-yes">43x</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
+ <span class="cline-any cline-no">&nbsp;</span>
710
+ <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-no">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-no">&nbsp;</span>
729
+ <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-yes">43x</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-yes">1x</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-yes">1x</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-yes">1x</span>
798
+ <span class="cline-any cline-yes">1x</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-yes">1x</span>
803
+ <span class="cline-any cline-yes">1x</span>
804
+ <span class="cline-any cline-yes">1x</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-yes">1x</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-yes">1x</span>
818
+ <span class="cline-any cline-yes">1x</span>
819
+ <span class="cline-any cline-yes">1x</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-yes">1x</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-yes">1x</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-yes">1x</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-yes">1x</span>
843
+ <span class="cline-any cline-yes">1x</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-yes">1x</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-yes">1x</span>
852
+ <span class="cline-any cline-no">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-no">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&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-neutral">&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-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-no">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-yes">43x</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-no">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-yes">43x</span>
967
+ <span class="cline-any cline-yes">1x</span>
968
+ <span class="cline-any cline-yes">1x</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-yes">1x</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-yes">1x</span>
974
+ <span class="cline-any cline-yes">1x</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-yes">43x</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-yes">2x</span>
1002
+ <span class="cline-any cline-yes">1x</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-yes">1x</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-yes">43x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as syscoinjs from 'syscoinjs-lib';
1019
+ // import { BIP_84, ONE_HUNDRED_MILLION, SYSCOIN_BASIC_FEE } from 'utils';
1020
+ &nbsp;
1021
+ import { LedgerKeyring } from '../ledger';
1022
+ import { DefaultWalletPolicy } from '../ledger/bitcoin_client';
1023
+ import { SyscoinHDSigner } from '../signers';
1024
+ import { TrezorKeyring } from '../trezor';
1025
+ import {
1026
+ ISyscoinTransactions,
1027
+ KeyringAccountType,
1028
+ accountType,
1029
+ } from '../types';
1030
+ import { getAccountDerivationPath } from '../utils/derivation-paths';
1031
+ import { PsbtUtils } from '../utils/psbt';
1032
+ import { INetwork } from '@pollum-io/sysweb3-network';
1033
+ import { ITxid, txUtils, getAsset } from '@pollum-io/sysweb3-utils';
1034
+ &nbsp;
1035
+ type EstimateFeeParams = {
1036
+ changeAddress: string;
1037
+ feeRateBN: any;
1038
+ outputs: { address: string; value: number }[];
1039
+ txOptions: any;
1040
+ xpub: string;
1041
+ };
1042
+ &nbsp;
1043
+ export class SyscoinTransactions implements ISyscoinTransactions {
1044
+ // New separated transaction flow for better UX:
1045
+ // 1. Call getEstimateSysTransactionFee() - creates UNSIGNED PSBT and calculates fee
1046
+ // 2. Call signPSBT() - signs the PSBT with appropriate wallet (HD/Trezor/Ledger)
1047
+ // 3. Call sendTransaction() - broadcasts the signed PSBT
1048
+ //
1049
+ // This separation allows:
1050
+ // - Independent error handling for each step
1051
+ // - Better UX feedback (fee estimation, signing, broadcasting)
1052
+ // - Hardware wallet compatibility with proper PSBT enhancement
1053
+ &nbsp;
1054
+ private getSigner: () =&gt; {
1055
+ hd: SyscoinHDSigner;
1056
+ main: any;
1057
+ };
1058
+ private trezor: TrezorKeyring;
1059
+ private ledger: LedgerKeyring;
1060
+ private getState: () =&gt; {
1061
+ accounts: {
1062
+ HDAccount: accountType;
1063
+ Imported: accountType;
1064
+ Ledger: accountType;
1065
+ Trezor: accountType;
1066
+ };
1067
+ activeAccountId: number;
1068
+ activeAccountType: KeyringAccountType;
1069
+ activeNetwork: INetwork;
1070
+ };
1071
+ private getAddress: (
1072
+ xpub: string,
1073
+ isChangeAddress: boolean
1074
+ ) =&gt; Promise&lt;string&gt;;
1075
+ &nbsp;
1076
+ constructor(
1077
+ getSyscoinSigner: () =&gt; {
1078
+ hd: SyscoinHDSigner;
1079
+ main: any;
1080
+ },
1081
+ getState: () =&gt; {
1082
+ accounts: {
1083
+ HDAccount: accountType;
1084
+ Imported: accountType;
1085
+ Ledger: accountType;
1086
+ Trezor: accountType;
1087
+ };
1088
+ activeAccountId: number;
1089
+ activeAccountType: KeyringAccountType;
1090
+ activeNetwork: INetwork;
1091
+ },
1092
+ getAddress: (xpub: string, isChangeAddress: boolean) =&gt; Promise&lt;string&gt;,
1093
+ ledgerSigner: LedgerKeyring
1094
+ ) {
1095
+ this.getSigner = getSyscoinSigner;
1096
+ this.getState = getState;
1097
+ this.getAddress = getAddress;
1098
+ this.trezor = new TrezorKeyring(this.getSigner);
1099
+ this.ledger = ledgerSigner;
1100
+ }
1101
+ &nbsp;
1102
+ private getTransactionPSBT = <span class="fstat-no" title="function not covered" >async </span>({
1103
+ txOptions,
1104
+ outputs,
1105
+ changeAddress,
1106
+ xpub,
1107
+ feeRateBN,
1108
+ }: EstimateFeeParams) =&gt; {
1109
+ const { main } = <span class="cstat-no" title="statement not covered" >this.getSigner();</span>
1110
+ &nbsp;
1111
+ <span class="cstat-no" title="statement not covered" > try {</span>
1112
+ // Use syscoinjs-lib directly for transaction creation
1113
+ const result = <span class="cstat-no" title="statement not covered" >await main.createTransaction(</span>
1114
+ txOptions,
1115
+ changeAddress,
1116
+ outputs,
1117
+ feeRateBN,
1118
+ xpub // sysFromXpubOrAddress
1119
+ );
1120
+ &nbsp;
1121
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (result &amp;&amp; result.psbt) {</span>
1122
+ <span class="cstat-no" title="statement not covered" > return { psbt: result.psbt, fee: result.fee };</span>
1123
+ }
1124
+ <span class="cstat-no" title="statement not covered" > throw new Error('psbt not found');</span>
1125
+ } catch (error) {
1126
+ // Propagate structured error from syscoinjs-lib
1127
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.error &amp;&amp; error.code) {</span>
1128
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1129
+ }
1130
+ // Wrap non-structured errors
1131
+ <span class="cstat-no" title="statement not covered" > throw {</span>
1132
+ error: true,
1133
+ code: 'TRANSACTION_CREATION_FAILED',
1134
+ message: error.message || 'Failed to create transaction',
1135
+ details: error,
1136
+ };
1137
+ }
1138
+ };
1139
+ &nbsp;
1140
+ public decodeRawTransaction = <span class="fstat-no" title="function not covered" >(p</span>sbt: any) =&gt; {
1141
+ const { main } = <span class="cstat-no" title="statement not covered" >this.getSigner();</span>
1142
+ const psbtObj = <span class="cstat-no" title="statement not covered" >PsbtUtils.fromPali(psbt);</span>
1143
+ <span class="cstat-no" title="statement not covered" > return main.decodeRawTransaction(psbtObj);</span>
1144
+ };
1145
+ &nbsp;
1146
+ public getRecommendedFee = <span class="fstat-no" title="function not covered" >async </span>(explorerUrl: string): Promise&lt;number&gt; =&gt;
1147
+ <span class="cstat-no" title="statement not covered" > (await syscoinjs.utils.fetchEstimateFee(explorerUrl, 1)) / 1024;</span>
1148
+ &nbsp;
1149
+ public txUtilsFunctions = <span class="fstat-no" title="function not covered" >() =</span>&gt; {
1150
+ const { getRawTransaction } = <span class="cstat-no" title="statement not covered" >txUtils();</span>
1151
+ <span class="cstat-no" title="statement not covered" > return {</span>
1152
+ getRawTransaction,
1153
+ };
1154
+ };
1155
+ &nbsp;
1156
+ // Internal method for signing with the HD signer
1157
+ private signPSBTWithSigner = <span class="fstat-no" title="function not covered" >async </span>({
1158
+ psbt,
1159
+ signer,
1160
+ pathIn,
1161
+ }: {
1162
+ pathIn?: string;
1163
+ psbt: any;
1164
+ signer: any;
1165
+ }): Promise&lt;any&gt; =&gt; <span class="cstat-no" title="statement not covered" >await signer.sign(psbt, pathIn);</span>
1166
+ &nbsp;
1167
+ // Create unsigned PSBT for any transaction type
1168
+ private createUnsignedPSBT = <span class="fstat-no" title="function not covered" >async </span>({
1169
+ txOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
1170
+ isMax = <span class="branch-0 cbranch-no" title="branch not covered" >false,</span>
1171
+ amount,
1172
+ receivingAddress,
1173
+ feeRateBN,
1174
+ token = <span class="branch-0 cbranch-no" title="branch not covered" >null,</span>
1175
+ }: {
1176
+ amount: number;
1177
+ feeRateBN: any; // BigNumber in satoshis/byte
1178
+ receivingAddress: string;
1179
+ token?: { guid: string; symbol?: string } | null;
1180
+ txOptions?: any;
1181
+ isMax?: boolean | false;
1182
+ }): Promise&lt;{ psbt: any; fee: number }&gt; =&gt; {
1183
+ // Ensure RBF is enabled by default if not explicitly set
1184
+ const finalTxOptions = <span class="cstat-no" title="statement not covered" >{ rbf: true, ...txOptions };</span>
1185
+ const { activeAccountId, accounts, activeAccountType } = <span class="cstat-no" title="statement not covered" >this.getState();</span>
1186
+ const { main } = <span class="cstat-no" title="statement not covered" >this.getSigner();</span>
1187
+ const xpub = <span class="cstat-no" title="statement not covered" >accounts[activeAccountType][activeAccountId].xpub;</span>
1188
+ const value = <span class="cstat-no" title="statement not covered" >new syscoinjs.utils.BN(amount * 1e8);</span>
1189
+ const changeAddress = <span class="cstat-no" title="statement not covered" >await this.getAddress(xpub, true);</span>
1190
+ &nbsp;
1191
+ <span class="cstat-no" title="statement not covered" > try {</span>
1192
+ <span class="cstat-no" title="statement not covered" > if (token &amp;&amp; token.guid) {</span>
1193
+ // Token transaction: use assetAllocationSend
1194
+ const asset = <span class="cstat-no" title="statement not covered" >await getAsset(main.blockbookURL, token.guid);</span>
1195
+ &nbsp;
1196
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!asset) {</span>
1197
+ <span class="cstat-no" title="statement not covered" > throw {</span>
1198
+ error: true,
1199
+ code: 'INVALID_ASSET_ALLOCATION',
1200
+ message: 'Token not found',
1201
+ details: { guid: token.guid },
1202
+ };
1203
+ }
1204
+ &nbsp;
1205
+ // Create a Map for the asset allocation
1206
+ const assetMap = <span class="cstat-no" title="statement not covered" >new Map();</span>
1207
+ <span class="cstat-no" title="statement not covered" > assetMap.set(token.guid, {</span>
1208
+ changeAddress,
1209
+ outputs: [
1210
+ {
1211
+ value: value as any,
1212
+ address: receivingAddress,
1213
+ },
1214
+ ],
1215
+ });
1216
+ &nbsp;
1217
+ // Pass xpub to get back just the PSBT without signing and sending
1218
+ const result = <span class="cstat-no" title="statement not covered" >await main.assetAllocationSend(</span>
1219
+ finalTxOptions,
1220
+ assetMap,
1221
+ changeAddress,
1222
+ feeRateBN,
1223
+ xpub // Pass xpub to get PSBT back
1224
+ );
1225
+ &nbsp;
1226
+ // Return PSBT and fee
1227
+ <span class="cstat-no" title="statement not covered" > return { psbt: result.psbt, fee: result.fee };</span>
1228
+ } else {
1229
+ // Native transaction: use getTransactionPSBT to create unsigned PSBT
1230
+ const outputs = <span class="cstat-no" title="statement not covered" >[</span>
1231
+ {
1232
+ address: receivingAddress,
1233
+ value,
1234
+ subtractFeeFrom: isMax ? true : undefined,
1235
+ },
1236
+ ];
1237
+ &nbsp;
1238
+ const result = <span class="cstat-no" title="statement not covered" >await this.getTransactionPSBT({</span>
1239
+ txOptions: finalTxOptions,
1240
+ outputs,
1241
+ changeAddress,
1242
+ feeRateBN,
1243
+ xpub,
1244
+ });
1245
+ &nbsp;
1246
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1247
+ }
1248
+ } catch (error) {
1249
+ // Re-throw structured errors from syscoinjs-lib
1250
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.error &amp;&amp; error.code) {</span>
1251
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1252
+ }
1253
+ // Wrap other errors in structured format
1254
+ <span class="cstat-no" title="statement not covered" > throw {</span>
1255
+ error: true,
1256
+ code: 'TRANSACTION_CREATION_FAILED',
1257
+ message: error.message || 'Failed to create unsigned PSBT',
1258
+ details: error,
1259
+ };
1260
+ }
1261
+ };
1262
+ &nbsp;
1263
+ // Sign PSBT with appropriate method - separated for better error handling
1264
+ private signPSBTWithMethod = async (
1265
+ psbt: any,
1266
+ isTrezor: boolean,
1267
+ isLedger = <span class="branch-0 cbranch-no" title="branch not covered" >false,</span>
1268
+ pathIn = ''
1269
+ ): Promise&lt;any&gt; =&gt; {
1270
+ const { activeNetwork, activeAccountId, activeAccountType, accounts } =
1271
+ this.getState();
1272
+ &nbsp;
1273
+ if (isLedger) {
1274
+ // Initialize Ledger connection if needed
1275
+ if (!this.ledger.ledgerTransport) {
1276
+ await this.ledger.connectToLedgerDevice();
1277
+ }
1278
+ &nbsp;
1279
+ // CRITICAL: Enhance PSBT with required Ledger fields
1280
+ const accountXpub = accounts[activeAccountType][activeAccountId].xpub;
1281
+ const accountId = accounts[activeAccountType][activeAccountId].id;
1282
+ const enhancedPsbt = await this.ledger.convertToLedgerFormat(
1283
+ psbt,
1284
+ accountXpub,
1285
+ accountId,
1286
+ activeNetwork.currency,
1287
+ activeNetwork.slip44
1288
+ );
1289
+ &nbsp;
1290
+ // Get wallet policy for Ledger
1291
+ const fingerprint =
1292
+ await this.ledger.ledgerUtxoClient.getMasterFingerprint();
1293
+ &nbsp;
1294
+ // Use dynamic path generation if no path provided
1295
+ let hdPath = pathIn;
1296
+ if (!pathIn || <span class="branch-1 cbranch-no" title="branch not covered" >pathIn.length === 0)</span> {
1297
+ hdPath = getAccountDerivationPath(
1298
+ activeNetwork.currency,
1299
+ activeNetwork.slip44,
1300
+ accountId
1301
+ );
1302
+ }
1303
+ &nbsp;
1304
+ const xpubWithDescriptor = `[${hdPath}]${accountXpub}`.replace(
1305
+ 'm',
1306
+ fingerprint
1307
+ );
1308
+ const walletPolicy = new DefaultWalletPolicy(
1309
+ 'wpkh(@0/**)',
1310
+ xpubWithDescriptor
1311
+ );
1312
+ &nbsp;
1313
+ // Sign the enhanced PSBT with Ledger
1314
+ const signatureEntries = await this.ledger.ledgerUtxoClient.signPsbt(
1315
+ enhancedPsbt.toBase64(),
1316
+ walletPolicy,
1317
+ null // No HMAC needed for standard policy
1318
+ );
1319
+ &nbsp;
1320
+ signatureEntries.forEach(([inputIndex, partialSig]) =&gt; {
1321
+ enhancedPsbt.updateInput(inputIndex, {
1322
+ partialSig: [partialSig],
1323
+ });
1324
+ });
1325
+ &nbsp;
1326
+ // Finalize all inputs
1327
+ enhancedPsbt.finalizeAllInputs();
1328
+ &nbsp;
1329
+ return enhancedPsbt;
1330
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (isTrezor) {</span>
1331
+ // Initialize Trezor connection before signing
1332
+ <span class="cstat-no" title="statement not covered" > await this.trezor.init();</span>
1333
+ &nbsp;
1334
+ // Handle Trezor signing for UTXO
1335
+ const trezorTx = <span class="cstat-no" title="statement not covered" >this.trezor.convertToTrezorFormat({</span>
1336
+ psbt,
1337
+ pathIn, // Pass pathIn to Trezor
1338
+ coin: activeNetwork.currency.toLowerCase(),
1339
+ });
1340
+ const signedPsbt = <span class="cstat-no" title="statement not covered" >await this.trezor.signUtxoTransaction(trezorTx, psbt);</span>
1341
+ <span class="cstat-no" title="statement not covered" > return signedPsbt;</span>
1342
+ } else {
1343
+ const { hd } = <span class="cstat-no" title="statement not covered" >this.getSigner();</span>
1344
+ const signedPsbt = <span class="cstat-no" title="statement not covered" >await this.signPSBTWithSigner({</span>
1345
+ psbt,
1346
+ signer: hd,
1347
+ pathIn,
1348
+ });
1349
+ <span class="cstat-no" title="statement not covered" > return signedPsbt;</span>
1350
+ }
1351
+ };
1352
+ &nbsp;
1353
+ // Create unsigned PSBT and estimate fee - NO SIGNING
1354
+ public getEstimateSysTransactionFee = <span class="fstat-no" title="function not covered" >async </span>({
1355
+ txOptions = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
1356
+ isMax = <span class="branch-0 cbranch-no" title="branch not covered" >false,</span>
1357
+ amount,
1358
+ receivingAddress,
1359
+ feeRate,
1360
+ token = <span class="branch-0 cbranch-no" title="branch not covered" >null,</span>
1361
+ }: {
1362
+ amount: number;
1363
+ feeRate?: number;
1364
+ receivingAddress: string;
1365
+ // Optional fee rate in SYS/byte
1366
+ token?: { guid: string; symbol?: string } | null;
1367
+ txOptions?: any;
1368
+ isMax?: boolean | false;
1369
+ }) =&gt; {
1370
+ <span class="cstat-no" title="statement not covered" > try {</span>
1371
+ // Ensure RBF is enabled by default if not explicitly set
1372
+ const finalTxOptions = <span class="cstat-no" title="statement not covered" >{ rbf: true, ...txOptions };</span>
1373
+ const { main } = <span class="cstat-no" title="statement not covered" >this.getSigner();</span>
1374
+ // Step 1: Determine fee rate
1375
+ let actualFeeRate;
1376
+ <span class="cstat-no" title="statement not covered" > if (feeRate !== undefined) {</span>
1377
+ <span class="cstat-no" title="statement not covered" > actualFeeRate = feeRate;</span>
1378
+ } else {
1379
+ <span class="cstat-no" title="statement not covered" > actualFeeRate = await this.getRecommendedFee(main.blockbookURL);</span>
1380
+ }
1381
+ &nbsp;
1382
+ // Convert fee rate to satoshis/byte for consistent usage
1383
+ const feeRateBN = <span class="cstat-no" title="statement not covered" >new syscoinjs.utils.BN(actualFeeRate * 1e8);</span>
1384
+ &nbsp;
1385
+ // Step 2: Create unsigned PSBT
1386
+ const result = <span class="cstat-no" title="statement not covered" >await this.createUnsignedPSBT({</span>
1387
+ txOptions: finalTxOptions,
1388
+ isMax,
1389
+ amount,
1390
+ receivingAddress,
1391
+ feeRateBN,
1392
+ token,
1393
+ });
1394
+ &nbsp;
1395
+ <span class="cstat-no" title="statement not covered" > return {</span>
1396
+ fee: result.fee / 1e8,
1397
+ psbt: PsbtUtils.toPali(result.psbt), // Return UNSIGNED PSBT as JSON
1398
+ };
1399
+ } catch (error) {
1400
+ // Pass through structured errors from syscoinjs-lib
1401
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.error &amp;&amp; error.code) {</span>
1402
+ // Convert fee from satoshis to SYS if available
1403
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.fee !== undefined) {</span>
1404
+ // If fee is a BN object, convert to number first
1405
+ <span class="cstat-no" title="statement not covered" > if (typeof error.fee === 'object' &amp;&amp; error.fee.toNumber) {</span>
1406
+ <span class="cstat-no" title="statement not covered" > error.fee = error.fee.toNumber() / 1e8;</span>
1407
+ } else {
1408
+ <span class="cstat-no" title="statement not covered" > error.fee = error.fee / 1e8;</span>
1409
+ }
1410
+ }
1411
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.remainingFee !== undefined) {</span>
1412
+ // If remainingFee is a BN object, convert to number first
1413
+ <span class="cstat-no" title="statement not covered" > if (</span>
1414
+ typeof error.remainingFee === 'object' &amp;&amp;
1415
+ error.remainingFee.toNumber
1416
+ ) {
1417
+ <span class="cstat-no" title="statement not covered" > error.remainingFee = error.remainingFee.toNumber() / 1e8;</span>
1418
+ } else {
1419
+ <span class="cstat-no" title="statement not covered" > error.remainingFee = error.remainingFee / 1e8;</span>
1420
+ }
1421
+ }
1422
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.shortfall !== undefined) {</span>
1423
+ // If shortfall is a BN object, convert to number first
1424
+ <span class="cstat-no" title="statement not covered" > if (typeof error.shortfall === 'object' &amp;&amp; error.shortfall.toNumber) {</span>
1425
+ <span class="cstat-no" title="statement not covered" > error.shortfall = error.shortfall.toNumber() / 1e8;</span>
1426
+ } else {
1427
+ <span class="cstat-no" title="statement not covered" > error.shortfall = error.shortfall / 1e8;</span>
1428
+ }
1429
+ }
1430
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1431
+ }
1432
+ // Wrap other errors
1433
+ <span class="cstat-no" title="statement not covered" > throw {</span>
1434
+ error: true,
1435
+ code: 'TRANSACTION_CREATION_FAILED',
1436
+ message: error.message || 'Failed to estimate transaction fee',
1437
+ details: error,
1438
+ };
1439
+ }
1440
+ };
1441
+ &nbsp;
1442
+ // Removed createAndSignSysTransaction - functionality merged into getEstimateSysTransactionFee
1443
+ &nbsp;
1444
+ private sendSignedTransaction = async (psbt): Promise&lt;ITxid&gt; =&gt; {
1445
+ try {
1446
+ const { main } = this.getSigner();
1447
+ // Send the transaction
1448
+ const result = await main.send(psbt);
1449
+ &nbsp;
1450
+ // Extract the transaction ID
1451
+ const txid = result.extractTransaction().getId();
1452
+ return { txid };
1453
+ } catch (error) {
1454
+ // Pass through structured errors
1455
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (error.error &amp;&amp; error.code) {</span>
1456
+ <span class="cstat-no" title="statement not covered" > throw error;</span>
1457
+ }
1458
+ // Wrap other errors
1459
+ <span class="cstat-no" title="statement not covered" > throw {</span>
1460
+ error: true,
1461
+ code: 'TRANSACTION_SEND_FAILED',
1462
+ message: error.message || 'Failed to send transaction',
1463
+ details: error,
1464
+ };
1465
+ }
1466
+ };
1467
+ &nbsp;
1468
+ public signPSBT = async ({
1469
+ psbt,
1470
+ isTrezor = <span class="branch-0 cbranch-no" title="branch not covered" >false,</span>
1471
+ isLedger = <span class="branch-0 cbranch-no" title="branch not covered" >false,</span>
1472
+ pathIn,
1473
+ }: {
1474
+ psbt: any;
1475
+ isTrezor?: boolean;
1476
+ isLedger?: boolean;
1477
+ pathIn?: string;
1478
+ }): Promise&lt;any&gt; =&gt; {
1479
+ const psbtObj = PsbtUtils.fromPali(psbt);
1480
+ const signedPsbt = await this.signPSBTWithMethod(
1481
+ psbtObj,
1482
+ isTrezor,
1483
+ isLedger,
1484
+ pathIn
1485
+ );
1486
+ return PsbtUtils.toPali(signedPsbt);
1487
+ };
1488
+ &nbsp;
1489
+ public sendTransaction = async (psbt: any): Promise&lt;ITxid&gt; =&gt; {
1490
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!psbt) {
1491
+ <span class="cstat-no" title="statement not covered" > throw new Error('Signed PSBT is required for broadcasting.');</span>
1492
+ }
1493
+ return await this.sendSignedTransaction(PsbtUtils.fromPali(psbt));
1494
+ };
1495
+ }
1496
+ &nbsp;</pre></td></tr></table></pre>
1497
+
1498
+ <div class="push"></div>
1499
+ <!-- for sticky footer -->
1500
+ </div>
1501
+ <!-- /wrapper -->
1502
+ <div class="footer quiet pad2 space-top1 center small">
1503
+ Code coverage generated by
1504
+ <a
1505
+ href="https://istanbul.js.org/"
1506
+ target="_blank"
1507
+ rel="noopener noreferrer"
1508
+ >istanbul</a
1509
+ >
1510
+ at 2025-06-20T17:45:56.456Z
1511
+ </div>
1512
+ <script src="../../prettify.js"></script>
1513
+ <script>
1514
+ window.onload = function () {
1515
+ prettyPrint();
1516
+ };
1517
+ </script>
1518
+ <script src="../../sorter.js"></script>
1519
+ <script src="../../block-navigation.js"></script>
1520
+ </body>
1521
+ </html>