@claude-flow/memory 3.0.0-alpha.1

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 (214) hide show
  1. package/.agentic-flow/intelligence.json +16 -0
  2. package/README.md +249 -0
  3. package/__tests__/coverage/base.css +224 -0
  4. package/__tests__/coverage/block-navigation.js +87 -0
  5. package/__tests__/coverage/coverage-final.json +19 -0
  6. package/__tests__/coverage/favicon.png +0 -0
  7. package/__tests__/coverage/index.html +206 -0
  8. package/__tests__/coverage/lcov-report/base.css +224 -0
  9. package/__tests__/coverage/lcov-report/block-navigation.js +87 -0
  10. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  11. package/__tests__/coverage/lcov-report/index.html +206 -0
  12. package/__tests__/coverage/lcov-report/prettify.css +1 -0
  13. package/__tests__/coverage/lcov-report/prettify.js +2 -0
  14. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  15. package/__tests__/coverage/lcov-report/sorter.js +210 -0
  16. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +2737 -0
  17. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +3130 -0
  18. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +601 -0
  19. package/__tests__/coverage/lcov-report/src/application/commands/index.html +131 -0
  20. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +394 -0
  21. package/__tests__/coverage/lcov-report/src/application/queries/index.html +116 -0
  22. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +796 -0
  23. package/__tests__/coverage/lcov-report/src/application/services/index.html +116 -0
  24. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +793 -0
  25. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +1633 -0
  26. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +1618 -0
  27. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +116 -0
  28. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +952 -0
  29. package/__tests__/coverage/lcov-report/src/domain/services/index.html +116 -0
  30. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +1294 -0
  31. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +3124 -0
  32. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +2167 -0
  33. package/__tests__/coverage/lcov-report/src/index.html +266 -0
  34. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
  35. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +116 -0
  36. package/__tests__/coverage/lcov-report/src/migration.ts.html +2092 -0
  37. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +1711 -0
  38. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +2281 -0
  39. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +2374 -0
  40. package/__tests__/coverage/lcov-report/src/types.ts.html +2266 -0
  41. package/__tests__/coverage/lcov.info +10238 -0
  42. package/__tests__/coverage/prettify.css +1 -0
  43. package/__tests__/coverage/prettify.js +2 -0
  44. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  45. package/__tests__/coverage/sorter.js +210 -0
  46. package/__tests__/coverage/src/agentdb-adapter.ts.html +2737 -0
  47. package/__tests__/coverage/src/agentdb-backend.ts.html +3130 -0
  48. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +601 -0
  49. package/__tests__/coverage/src/application/commands/index.html +131 -0
  50. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +394 -0
  51. package/__tests__/coverage/src/application/queries/index.html +116 -0
  52. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +796 -0
  53. package/__tests__/coverage/src/application/services/index.html +116 -0
  54. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +793 -0
  55. package/__tests__/coverage/src/cache-manager.ts.html +1633 -0
  56. package/__tests__/coverage/src/database-provider.ts.html +1618 -0
  57. package/__tests__/coverage/src/domain/entities/index.html +116 -0
  58. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +952 -0
  59. package/__tests__/coverage/src/domain/services/index.html +116 -0
  60. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +1294 -0
  61. package/__tests__/coverage/src/hnsw-index.ts.html +3124 -0
  62. package/__tests__/coverage/src/hybrid-backend.ts.html +2167 -0
  63. package/__tests__/coverage/src/index.html +266 -0
  64. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
  65. package/__tests__/coverage/src/infrastructure/repositories/index.html +116 -0
  66. package/__tests__/coverage/src/migration.ts.html +2092 -0
  67. package/__tests__/coverage/src/query-builder.ts.html +1711 -0
  68. package/__tests__/coverage/src/sqlite-backend.ts.html +2281 -0
  69. package/__tests__/coverage/src/sqljs-backend.ts.html +2374 -0
  70. package/__tests__/coverage/src/types.ts.html +2266 -0
  71. package/benchmarks/cache-hit-rate.bench.ts +535 -0
  72. package/benchmarks/hnsw-indexing.bench.ts +552 -0
  73. package/benchmarks/memory-write.bench.ts +469 -0
  74. package/benchmarks/vector-search.bench.ts +449 -0
  75. package/dist/agentdb-adapter.d.ts +146 -0
  76. package/dist/agentdb-adapter.d.ts.map +1 -0
  77. package/dist/agentdb-adapter.js +679 -0
  78. package/dist/agentdb-adapter.js.map +1 -0
  79. package/dist/agentdb-backend.d.ts +214 -0
  80. package/dist/agentdb-backend.d.ts.map +1 -0
  81. package/dist/agentdb-backend.js +827 -0
  82. package/dist/agentdb-backend.js.map +1 -0
  83. package/dist/agentdb-backend.test.d.ts +7 -0
  84. package/dist/agentdb-backend.test.d.ts.map +1 -0
  85. package/dist/agentdb-backend.test.js +258 -0
  86. package/dist/agentdb-backend.test.js.map +1 -0
  87. package/dist/application/commands/delete-memory.command.d.ts +65 -0
  88. package/dist/application/commands/delete-memory.command.d.ts.map +1 -0
  89. package/dist/application/commands/delete-memory.command.js +129 -0
  90. package/dist/application/commands/delete-memory.command.js.map +1 -0
  91. package/dist/application/commands/store-memory.command.d.ts +48 -0
  92. package/dist/application/commands/store-memory.command.d.ts.map +1 -0
  93. package/dist/application/commands/store-memory.command.js +72 -0
  94. package/dist/application/commands/store-memory.command.js.map +1 -0
  95. package/dist/application/index.d.ts +12 -0
  96. package/dist/application/index.d.ts.map +1 -0
  97. package/dist/application/index.js +15 -0
  98. package/dist/application/index.js.map +1 -0
  99. package/dist/application/queries/search-memory.query.d.ts +72 -0
  100. package/dist/application/queries/search-memory.query.d.ts.map +1 -0
  101. package/dist/application/queries/search-memory.query.js +143 -0
  102. package/dist/application/queries/search-memory.query.js.map +1 -0
  103. package/dist/application/services/memory-application-service.d.ts +121 -0
  104. package/dist/application/services/memory-application-service.d.ts.map +1 -0
  105. package/dist/application/services/memory-application-service.js +190 -0
  106. package/dist/application/services/memory-application-service.js.map +1 -0
  107. package/dist/cache-manager.d.ts +134 -0
  108. package/dist/cache-manager.d.ts.map +1 -0
  109. package/dist/cache-manager.js +407 -0
  110. package/dist/cache-manager.js.map +1 -0
  111. package/dist/database-provider.d.ts +86 -0
  112. package/dist/database-provider.d.ts.map +1 -0
  113. package/dist/database-provider.js +385 -0
  114. package/dist/database-provider.js.map +1 -0
  115. package/dist/database-provider.test.d.ts +7 -0
  116. package/dist/database-provider.test.d.ts.map +1 -0
  117. package/dist/database-provider.test.js +285 -0
  118. package/dist/database-provider.test.js.map +1 -0
  119. package/dist/domain/entities/memory-entry.d.ts +143 -0
  120. package/dist/domain/entities/memory-entry.d.ts.map +1 -0
  121. package/dist/domain/entities/memory-entry.js +226 -0
  122. package/dist/domain/entities/memory-entry.js.map +1 -0
  123. package/dist/domain/index.d.ts +11 -0
  124. package/dist/domain/index.d.ts.map +1 -0
  125. package/dist/domain/index.js +12 -0
  126. package/dist/domain/index.js.map +1 -0
  127. package/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
  128. package/dist/domain/repositories/memory-repository.interface.d.ts.map +1 -0
  129. package/dist/domain/repositories/memory-repository.interface.js +11 -0
  130. package/dist/domain/repositories/memory-repository.interface.js.map +1 -0
  131. package/dist/domain/services/memory-domain-service.d.ts +105 -0
  132. package/dist/domain/services/memory-domain-service.d.ts.map +1 -0
  133. package/dist/domain/services/memory-domain-service.js +297 -0
  134. package/dist/domain/services/memory-domain-service.js.map +1 -0
  135. package/dist/hnsw-index.d.ts +111 -0
  136. package/dist/hnsw-index.d.ts.map +1 -0
  137. package/dist/hnsw-index.js +781 -0
  138. package/dist/hnsw-index.js.map +1 -0
  139. package/dist/hybrid-backend.d.ts +217 -0
  140. package/dist/hybrid-backend.d.ts.map +1 -0
  141. package/dist/hybrid-backend.js +491 -0
  142. package/dist/hybrid-backend.js.map +1 -0
  143. package/dist/hybrid-backend.test.d.ts +8 -0
  144. package/dist/hybrid-backend.test.d.ts.map +1 -0
  145. package/dist/hybrid-backend.test.js +320 -0
  146. package/dist/hybrid-backend.test.js.map +1 -0
  147. package/dist/index.d.ts +188 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +345 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/infrastructure/index.d.ts +17 -0
  152. package/dist/infrastructure/index.d.ts.map +1 -0
  153. package/dist/infrastructure/index.js +16 -0
  154. package/dist/infrastructure/index.js.map +1 -0
  155. package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
  156. package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts.map +1 -0
  157. package/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
  158. package/dist/infrastructure/repositories/hybrid-memory-repository.js.map +1 -0
  159. package/dist/migration.d.ts +68 -0
  160. package/dist/migration.d.ts.map +1 -0
  161. package/dist/migration.js +513 -0
  162. package/dist/migration.js.map +1 -0
  163. package/dist/query-builder.d.ts +211 -0
  164. package/dist/query-builder.d.ts.map +1 -0
  165. package/dist/query-builder.js +438 -0
  166. package/dist/query-builder.js.map +1 -0
  167. package/dist/sqlite-backend.d.ts +121 -0
  168. package/dist/sqlite-backend.d.ts.map +1 -0
  169. package/dist/sqlite-backend.js +564 -0
  170. package/dist/sqlite-backend.js.map +1 -0
  171. package/dist/sqljs-backend.d.ts +128 -0
  172. package/dist/sqljs-backend.d.ts.map +1 -0
  173. package/dist/sqljs-backend.js +598 -0
  174. package/dist/sqljs-backend.js.map +1 -0
  175. package/dist/types.d.ts +481 -0
  176. package/dist/types.d.ts.map +1 -0
  177. package/dist/types.js +58 -0
  178. package/dist/types.js.map +1 -0
  179. package/docs/AGENTDB-INTEGRATION.md +388 -0
  180. package/docs/CROSS_PLATFORM.md +505 -0
  181. package/docs/WINDOWS_SUPPORT.md +422 -0
  182. package/examples/agentdb-example.ts +345 -0
  183. package/examples/cross-platform-usage.ts +326 -0
  184. package/framework/benchmark.ts +112 -0
  185. package/package.json +31 -0
  186. package/src/agentdb-adapter.ts +884 -0
  187. package/src/agentdb-backend.test.ts +339 -0
  188. package/src/agentdb-backend.ts +1016 -0
  189. package/src/application/commands/delete-memory.command.ts +172 -0
  190. package/src/application/commands/store-memory.command.ts +103 -0
  191. package/src/application/index.ts +36 -0
  192. package/src/application/queries/search-memory.query.ts +237 -0
  193. package/src/application/services/memory-application-service.ts +236 -0
  194. package/src/cache-manager.ts +516 -0
  195. package/src/database-provider.test.ts +364 -0
  196. package/src/database-provider.ts +511 -0
  197. package/src/domain/entities/memory-entry.ts +289 -0
  198. package/src/domain/index.ts +35 -0
  199. package/src/domain/repositories/memory-repository.interface.ts +120 -0
  200. package/src/domain/services/memory-domain-service.ts +403 -0
  201. package/src/hnsw-index.ts +1013 -0
  202. package/src/hybrid-backend.test.ts +399 -0
  203. package/src/hybrid-backend.ts +694 -0
  204. package/src/index.ts +515 -0
  205. package/src/infrastructure/index.ts +23 -0
  206. package/src/infrastructure/repositories/hybrid-memory-repository.ts +516 -0
  207. package/src/migration.ts +669 -0
  208. package/src/query-builder.ts +542 -0
  209. package/src/sqlite-backend.ts +732 -0
  210. package/src/sqljs-backend.ts +763 -0
  211. package/src/types.ts +727 -0
  212. package/tsconfig.json +9 -0
  213. package/tsconfig.tsbuildinfo +1 -0
  214. package/verify-cross-platform.ts +170 -0
@@ -0,0 +1,2092 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/migration.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">src</a> migration.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/669</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/669</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></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-no">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-no">&nbsp;</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <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-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>
1405
+ <span class="cstat-no" title="statement not covered" > * V3 Memory Migration Utility</span>
1406
+ <span class="cstat-no" title="statement not covered" > *</span>
1407
+ <span class="cstat-no" title="statement not covered" > * Migrates data from legacy memory systems (SQLite, Markdown, JSON, etc.)</span>
1408
+ <span class="cstat-no" title="statement not covered" > * to the unified AgentDB-backed memory system with HNSW indexing.</span>
1409
+ <span class="cstat-no" title="statement not covered" > *</span>
1410
+ <span class="cstat-no" title="statement not covered" > * @module v3/memory/migration</span>
1411
+ <span class="cstat-no" title="statement not covered" > */</span>
1412
+ <span class="cstat-no" title="statement not covered" ></span>
1413
+ <span class="cstat-no" title="statement not covered" >import { EventEmitter } from 'node:events';</span>
1414
+ <span class="cstat-no" title="statement not covered" >import { promises as fs } from 'node:fs';</span>
1415
+ <span class="cstat-no" title="statement not covered" >import * as path from 'node:path';</span>
1416
+ <span class="cstat-no" title="statement not covered" >import {</span>
1417
+ <span class="cstat-no" title="statement not covered" > MigrationConfig,</span>
1418
+ <span class="cstat-no" title="statement not covered" > MigrationProgress,</span>
1419
+ <span class="cstat-no" title="statement not covered" > MigrationResult,</span>
1420
+ <span class="cstat-no" title="statement not covered" > MigrationError,</span>
1421
+ <span class="cstat-no" title="statement not covered" > MigrationSource,</span>
1422
+ <span class="cstat-no" title="statement not covered" > MemoryEntry,</span>
1423
+ <span class="cstat-no" title="statement not covered" > MemoryType,</span>
1424
+ <span class="cstat-no" title="statement not covered" > MemoryEntryInput,</span>
1425
+ <span class="cstat-no" title="statement not covered" > EmbeddingGenerator,</span>
1426
+ <span class="cstat-no" title="statement not covered" > createDefaultEntry,</span>
1427
+ <span class="cstat-no" title="statement not covered" >} from './types.js';</span>
1428
+ <span class="cstat-no" title="statement not covered" >import { AgentDBAdapter } from './agentdb-adapter.js';</span>
1429
+ <span class="cstat-no" title="statement not covered" ></span>
1430
+ <span class="cstat-no" title="statement not covered" >/**</span>
1431
+ <span class="cstat-no" title="statement not covered" > * Default migration configuration</span>
1432
+ <span class="cstat-no" title="statement not covered" > */</span>
1433
+ <span class="cstat-no" title="statement not covered" >const DEFAULT_MIGRATION_CONFIG: Partial&lt;MigrationConfig&gt; = {</span>
1434
+ <span class="cstat-no" title="statement not covered" > batchSize: 100,</span>
1435
+ <span class="cstat-no" title="statement not covered" > generateEmbeddings: true,</span>
1436
+ <span class="cstat-no" title="statement not covered" > validateData: true,</span>
1437
+ <span class="cstat-no" title="statement not covered" > continueOnError: true,</span>
1438
+ <span class="cstat-no" title="statement not covered" >};</span>
1439
+ <span class="cstat-no" title="statement not covered" ></span>
1440
+ <span class="cstat-no" title="statement not covered" >/**</span>
1441
+ <span class="cstat-no" title="statement not covered" > * Legacy entry format (common structure)</span>
1442
+ <span class="cstat-no" title="statement not covered" > */</span>
1443
+ <span class="cstat-no" title="statement not covered" >interface LegacyEntry {</span>
1444
+ <span class="cstat-no" title="statement not covered" > id?: string;</span>
1445
+ <span class="cstat-no" title="statement not covered" > key: string;</span>
1446
+ <span class="cstat-no" title="statement not covered" > value: unknown;</span>
1447
+ <span class="cstat-no" title="statement not covered" > namespace?: string;</span>
1448
+ <span class="cstat-no" title="statement not covered" > tags?: string[];</span>
1449
+ <span class="cstat-no" title="statement not covered" > metadata?: Record&lt;string, unknown&gt;;</span>
1450
+ <span class="cstat-no" title="statement not covered" > timestamp?: number;</span>
1451
+ <span class="cstat-no" title="statement not covered" > createdAt?: string | number;</span>
1452
+ <span class="cstat-no" title="statement not covered" > updatedAt?: string | number;</span>
1453
+ <span class="cstat-no" title="statement not covered" > created_at?: string | number;</span>
1454
+ <span class="cstat-no" title="statement not covered" > updated_at?: string | number;</span>
1455
+ <span class="cstat-no" title="statement not covered" >}</span>
1456
+ <span class="cstat-no" title="statement not covered" ></span>
1457
+ <span class="cstat-no" title="statement not covered" >/**</span>
1458
+ <span class="cstat-no" title="statement not covered" > * Memory Migration Manager</span>
1459
+ <span class="cstat-no" title="statement not covered" > *</span>
1460
+ <span class="cstat-no" title="statement not covered" > * Handles migration from:</span>
1461
+ <span class="cstat-no" title="statement not covered" > * - SQLite backends (.db files)</span>
1462
+ <span class="cstat-no" title="statement not covered" > * - Markdown backends (.md files)</span>
1463
+ <span class="cstat-no" title="statement not covered" > * - JSON memory stores (.json files)</span>
1464
+ <span class="cstat-no" title="statement not covered" > * - MemoryManager instances</span>
1465
+ <span class="cstat-no" title="statement not covered" > * - SwarmMemory instances</span>
1466
+ <span class="cstat-no" title="statement not covered" > * - DistributedMemory instances</span>
1467
+ <span class="cstat-no" title="statement not covered" > */</span>
1468
+ <span class="cstat-no" title="statement not covered" >export class MemoryMigrator extends EventEmitter {</span>
1469
+ <span class="cstat-no" title="statement not covered" > private config: MigrationConfig;</span>
1470
+ <span class="cstat-no" title="statement not covered" > private target: AgentDBAdapter;</span>
1471
+ <span class="cstat-no" title="statement not covered" > private embeddingGenerator?: EmbeddingGenerator;</span>
1472
+ <span class="cstat-no" title="statement not covered" > private progress: MigrationProgress;</span>
1473
+ <span class="cstat-no" title="statement not covered" ></span>
1474
+ <span class="cstat-no" title="statement not covered" > constructor(</span>
1475
+ <span class="cstat-no" title="statement not covered" > target: AgentDBAdapter,</span>
1476
+ <span class="cstat-no" title="statement not covered" > config: Partial&lt;MigrationConfig&gt;,</span>
1477
+ <span class="cstat-no" title="statement not covered" > embeddingGenerator?: EmbeddingGenerator</span>
1478
+ <span class="cstat-no" title="statement not covered" > ) {</span>
1479
+ <span class="cstat-no" title="statement not covered" > super();</span>
1480
+ <span class="cstat-no" title="statement not covered" > this.target = target;</span>
1481
+ <span class="cstat-no" title="statement not covered" > this.config = { ...DEFAULT_MIGRATION_CONFIG, ...config } as MigrationConfig;</span>
1482
+ <span class="cstat-no" title="statement not covered" > this.embeddingGenerator = embeddingGenerator;</span>
1483
+ <span class="cstat-no" title="statement not covered" > this.progress = this.initializeProgress();</span>
1484
+ <span class="cstat-no" title="statement not covered" > }</span>
1485
+ <span class="cstat-no" title="statement not covered" ></span>
1486
+ <span class="cstat-no" title="statement not covered" > /**</span>
1487
+ <span class="cstat-no" title="statement not covered" > * Run the migration</span>
1488
+ <span class="cstat-no" title="statement not covered" > */</span>
1489
+ <span class="cstat-no" title="statement not covered" > async migrate(): Promise&lt;MigrationResult&gt; {</span>
1490
+ <span class="cstat-no" title="statement not covered" > const startTime = Date.now();</span>
1491
+ <span class="cstat-no" title="statement not covered" > this.progress = this.initializeProgress();</span>
1492
+ <span class="cstat-no" title="statement not covered" ></span>
1493
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:started', { source: this.config.source });</span>
1494
+ <span class="cstat-no" title="statement not covered" ></span>
1495
+ <span class="cstat-no" title="statement not covered" > try {</span>
1496
+ <span class="cstat-no" title="statement not covered" > // Load entries from source</span>
1497
+ <span class="cstat-no" title="statement not covered" > const entries = await this.loadFromSource();</span>
1498
+ <span class="cstat-no" title="statement not covered" > this.progress.total = entries.length;</span>
1499
+ <span class="cstat-no" title="statement not covered" > this.progress.totalBatches = Math.ceil(entries.length / this.config.batchSize);</span>
1500
+ <span class="cstat-no" title="statement not covered" ></span>
1501
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:progress', { ...this.progress });</span>
1502
+ <span class="cstat-no" title="statement not covered" ></span>
1503
+ <span class="cstat-no" title="statement not covered" > // Process in batches</span>
1504
+ <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; entries.length; i += this.config.batchSize) {</span>
1505
+ <span class="cstat-no" title="statement not covered" > const batch = entries.slice(i, i + this.config.batchSize);</span>
1506
+ <span class="cstat-no" title="statement not covered" > this.progress.currentBatch = Math.floor(i / this.config.batchSize) + 1;</span>
1507
+ <span class="cstat-no" title="statement not covered" ></span>
1508
+ <span class="cstat-no" title="statement not covered" > await this.processBatch(batch);</span>
1509
+ <span class="cstat-no" title="statement not covered" ></span>
1510
+ <span class="cstat-no" title="statement not covered" > this.progress.percentage = Math.round(</span>
1511
+ <span class="cstat-no" title="statement not covered" > (this.progress.migrated / this.progress.total) * 100</span>
1512
+ <span class="cstat-no" title="statement not covered" > );</span>
1513
+ <span class="cstat-no" title="statement not covered" > this.progress.estimatedTimeRemaining = this.estimateTimeRemaining(</span>
1514
+ <span class="cstat-no" title="statement not covered" > startTime,</span>
1515
+ <span class="cstat-no" title="statement not covered" > this.progress.migrated,</span>
1516
+ <span class="cstat-no" title="statement not covered" > this.progress.total</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" > this.emit('migration:progress', { ...this.progress });</span>
1520
+ <span class="cstat-no" title="statement not covered" > }</span>
1521
+ <span class="cstat-no" title="statement not covered" ></span>
1522
+ <span class="cstat-no" title="statement not covered" > const duration = Date.now() - startTime;</span>
1523
+ <span class="cstat-no" title="statement not covered" ></span>
1524
+ <span class="cstat-no" title="statement not covered" > const result: MigrationResult = {</span>
1525
+ <span class="cstat-no" title="statement not covered" > success: this.progress.failed === 0 || this.config.continueOnError,</span>
1526
+ <span class="cstat-no" title="statement not covered" > progress: { ...this.progress },</span>
1527
+ <span class="cstat-no" title="statement not covered" > duration,</span>
1528
+ <span class="cstat-no" title="statement not covered" > summary: this.generateSummary(),</span>
1529
+ <span class="cstat-no" title="statement not covered" > };</span>
1530
+ <span class="cstat-no" title="statement not covered" ></span>
1531
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:completed', result);</span>
1532
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1533
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1534
+ <span class="cstat-no" title="statement not covered" > const duration = Date.now() - startTime;</span>
1535
+ <span class="cstat-no" title="statement not covered" ></span>
1536
+ <span class="cstat-no" title="statement not covered" > const result: MigrationResult = {</span>
1537
+ <span class="cstat-no" title="statement not covered" > success: false,</span>
1538
+ <span class="cstat-no" title="statement not covered" > progress: { ...this.progress },</span>
1539
+ <span class="cstat-no" title="statement not covered" > duration,</span>
1540
+ <span class="cstat-no" title="statement not covered" > summary: `Migration failed: ${(error as Error).message}`,</span>
1541
+ <span class="cstat-no" title="statement not covered" > };</span>
1542
+ <span class="cstat-no" title="statement not covered" ></span>
1543
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:failed', { error, result });</span>
1544
+ <span class="cstat-no" title="statement not covered" > return result;</span>
1545
+ <span class="cstat-no" title="statement not covered" > }</span>
1546
+ <span class="cstat-no" title="statement not covered" > }</span>
1547
+ <span class="cstat-no" title="statement not covered" ></span>
1548
+ <span class="cstat-no" title="statement not covered" > /**</span>
1549
+ <span class="cstat-no" title="statement not covered" > * Get current migration progress</span>
1550
+ <span class="cstat-no" title="statement not covered" > */</span>
1551
+ <span class="cstat-no" title="statement not covered" > getProgress(): MigrationProgress {</span>
1552
+ <span class="cstat-no" title="statement not covered" > return { ...this.progress };</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" > // ===== Source Loaders =====</span>
1556
+ <span class="cstat-no" title="statement not covered" ></span>
1557
+ <span class="cstat-no" title="statement not covered" > private async loadFromSource(): Promise&lt;LegacyEntry[]&gt; {</span>
1558
+ <span class="cstat-no" title="statement not covered" > switch (this.config.source) {</span>
1559
+ <span class="cstat-no" title="statement not covered" > case 'sqlite':</span>
1560
+ <span class="cstat-no" title="statement not covered" > return this.loadFromSQLite();</span>
1561
+ <span class="cstat-no" title="statement not covered" > case 'markdown':</span>
1562
+ <span class="cstat-no" title="statement not covered" > return this.loadFromMarkdown();</span>
1563
+ <span class="cstat-no" title="statement not covered" > case 'json':</span>
1564
+ <span class="cstat-no" title="statement not covered" > return this.loadFromJSON();</span>
1565
+ <span class="cstat-no" title="statement not covered" > case 'memory-manager':</span>
1566
+ <span class="cstat-no" title="statement not covered" > return this.loadFromMemoryManager();</span>
1567
+ <span class="cstat-no" title="statement not covered" > case 'swarm-memory':</span>
1568
+ <span class="cstat-no" title="statement not covered" > return this.loadFromSwarmMemory();</span>
1569
+ <span class="cstat-no" title="statement not covered" > case 'distributed-memory':</span>
1570
+ <span class="cstat-no" title="statement not covered" > return this.loadFromDistributedMemory();</span>
1571
+ <span class="cstat-no" title="statement not covered" > default:</span>
1572
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Unknown migration source: ${this.config.source}`);</span>
1573
+ <span class="cstat-no" title="statement not covered" > }</span>
1574
+ <span class="cstat-no" title="statement not covered" > }</span>
1575
+ <span class="cstat-no" title="statement not covered" ></span>
1576
+ <span class="cstat-no" title="statement not covered" > private async loadFromSQLite(): Promise&lt;LegacyEntry[]&gt; {</span>
1577
+ <span class="cstat-no" title="statement not covered" > const entries: LegacyEntry[] = [];</span>
1578
+ <span class="cstat-no" title="statement not covered" > const dbPath = this.config.sourcePath;</span>
1579
+ <span class="cstat-no" title="statement not covered" ></span>
1580
+ <span class="cstat-no" title="statement not covered" > try {</span>
1581
+ <span class="cstat-no" title="statement not covered" > // Dynamic import for better-sqlite3 or similar</span>
1582
+ <span class="cstat-no" title="statement not covered" > // In production, would use actual SQLite library</span>
1583
+ <span class="cstat-no" title="statement not covered" > const fileContent = await fs.readFile(dbPath);</span>
1584
+ <span class="cstat-no" title="statement not covered" ></span>
1585
+ <span class="cstat-no" title="statement not covered" > // Parse SQLite format (simplified - actual implementation would use SQLite library)</span>
1586
+ <span class="cstat-no" title="statement not covered" > // For now, we'll try to read it as a JSON export format</span>
1587
+ <span class="cstat-no" title="statement not covered" > if (dbPath.endsWith('.json')) {</span>
1588
+ <span class="cstat-no" title="statement not covered" > const data = JSON.parse(fileContent.toString());</span>
1589
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(data)) {</span>
1590
+ <span class="cstat-no" title="statement not covered" > return data;</span>
1591
+ <span class="cstat-no" title="statement not covered" > } else if (data.entries) {</span>
1592
+ <span class="cstat-no" title="statement not covered" > return data.entries;</span>
1593
+ <span class="cstat-no" title="statement not covered" > }</span>
1594
+ <span class="cstat-no" title="statement not covered" > }</span>
1595
+ <span class="cstat-no" title="statement not covered" ></span>
1596
+ <span class="cstat-no" title="statement not covered" > // SQLite parsing would go here using better-sqlite3 or sql.js</span>
1597
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:warning', {</span>
1598
+ <span class="cstat-no" title="statement not covered" > message: 'Direct SQLite parsing requires additional setup. Using export format.',</span>
1599
+ <span class="cstat-no" title="statement not covered" > });</span>
1600
+ <span class="cstat-no" title="statement not covered" ></span>
1601
+ <span class="cstat-no" title="statement not covered" > return entries;</span>
1602
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1603
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to load SQLite: ${(error as Error).message}`);</span>
1604
+ <span class="cstat-no" title="statement not covered" > }</span>
1605
+ <span class="cstat-no" title="statement not covered" > }</span>
1606
+ <span class="cstat-no" title="statement not covered" ></span>
1607
+ <span class="cstat-no" title="statement not covered" > private async loadFromMarkdown(): Promise&lt;LegacyEntry[]&gt; {</span>
1608
+ <span class="cstat-no" title="statement not covered" > const entries: LegacyEntry[] = [];</span>
1609
+ <span class="cstat-no" title="statement not covered" > const basePath = this.config.sourcePath;</span>
1610
+ <span class="cstat-no" title="statement not covered" ></span>
1611
+ <span class="cstat-no" title="statement not covered" > try {</span>
1612
+ <span class="cstat-no" title="statement not covered" > const files = await this.walkDirectory(basePath, '.md');</span>
1613
+ <span class="cstat-no" title="statement not covered" ></span>
1614
+ <span class="cstat-no" title="statement not covered" > for (const filePath of files) {</span>
1615
+ <span class="cstat-no" title="statement not covered" > try {</span>
1616
+ <span class="cstat-no" title="statement not covered" > const content = await fs.readFile(filePath, 'utf-8');</span>
1617
+ <span class="cstat-no" title="statement not covered" > const entry = this.parseMarkdownEntry(filePath, content, basePath);</span>
1618
+ <span class="cstat-no" title="statement not covered" > if (entry) {</span>
1619
+ <span class="cstat-no" title="statement not covered" > entries.push(entry);</span>
1620
+ <span class="cstat-no" title="statement not covered" > }</span>
1621
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1622
+ <span class="cstat-no" title="statement not covered" > this.addError(filePath, (error as Error).message, 'PARSE_ERROR', true);</span>
1623
+ <span class="cstat-no" title="statement not covered" > }</span>
1624
+ <span class="cstat-no" title="statement not covered" > }</span>
1625
+ <span class="cstat-no" title="statement not covered" ></span>
1626
+ <span class="cstat-no" title="statement not covered" > return entries;</span>
1627
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1628
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to load Markdown: ${(error as Error).message}`);</span>
1629
+ <span class="cstat-no" title="statement not covered" > }</span>
1630
+ <span class="cstat-no" title="statement not covered" > }</span>
1631
+ <span class="cstat-no" title="statement not covered" ></span>
1632
+ <span class="cstat-no" title="statement not covered" > private async loadFromJSON(): Promise&lt;LegacyEntry[]&gt; {</span>
1633
+ <span class="cstat-no" title="statement not covered" > const filePath = this.config.sourcePath;</span>
1634
+ <span class="cstat-no" title="statement not covered" ></span>
1635
+ <span class="cstat-no" title="statement not covered" > try {</span>
1636
+ <span class="cstat-no" title="statement not covered" > const content = await fs.readFile(filePath, 'utf-8');</span>
1637
+ <span class="cstat-no" title="statement not covered" > const data = JSON.parse(content);</span>
1638
+ <span class="cstat-no" title="statement not covered" ></span>
1639
+ <span class="cstat-no" title="statement not covered" > // Handle different JSON formats</span>
1640
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(data)) {</span>
1641
+ <span class="cstat-no" title="statement not covered" > return data;</span>
1642
+ <span class="cstat-no" title="statement not covered" > } else if (data.entries) {</span>
1643
+ <span class="cstat-no" title="statement not covered" > return data.entries;</span>
1644
+ <span class="cstat-no" title="statement not covered" > } else if (typeof data === 'object') {</span>
1645
+ <span class="cstat-no" title="statement not covered" > // Assume it's a namespace -&gt; entries map</span>
1646
+ <span class="cstat-no" title="statement not covered" > const entries: LegacyEntry[] = [];</span>
1647
+ <span class="cstat-no" title="statement not covered" > for (const [namespace, namespaceEntries] of Object.entries(data)) {</span>
1648
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(namespaceEntries)) {</span>
1649
+ <span class="cstat-no" title="statement not covered" > for (const entry of namespaceEntries) {</span>
1650
+ <span class="cstat-no" title="statement not covered" > entries.push({ ...entry, namespace });</span>
1651
+ <span class="cstat-no" title="statement not covered" > }</span>
1652
+ <span class="cstat-no" title="statement not covered" > }</span>
1653
+ <span class="cstat-no" title="statement not covered" > }</span>
1654
+ <span class="cstat-no" title="statement not covered" > return entries;</span>
1655
+ <span class="cstat-no" title="statement not covered" > }</span>
1656
+ <span class="cstat-no" title="statement not covered" ></span>
1657
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1658
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1659
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to load JSON: ${(error as Error).message}`);</span>
1660
+ <span class="cstat-no" title="statement not covered" > }</span>
1661
+ <span class="cstat-no" title="statement not covered" > }</span>
1662
+ <span class="cstat-no" title="statement not covered" ></span>
1663
+ <span class="cstat-no" title="statement not covered" > private async loadFromMemoryManager(): Promise&lt;LegacyEntry[]&gt; {</span>
1664
+ <span class="cstat-no" title="statement not covered" > // Would integrate with existing MemoryManager instance</span>
1665
+ <span class="cstat-no" title="statement not covered" > // For now, try to load from common paths</span>
1666
+ <span class="cstat-no" title="statement not covered" > const possiblePaths = [</span>
1667
+ <span class="cstat-no" title="statement not covered" > './memory/memory-store.json',</span>
1668
+ <span class="cstat-no" title="statement not covered" > './.swarm/memory.db',</span>
1669
+ <span class="cstat-no" title="statement not covered" > './memory.json',</span>
1670
+ <span class="cstat-no" title="statement not covered" > ];</span>
1671
+ <span class="cstat-no" title="statement not covered" ></span>
1672
+ <span class="cstat-no" title="statement not covered" > for (const p of possiblePaths) {</span>
1673
+ <span class="cstat-no" title="statement not covered" > try {</span>
1674
+ <span class="cstat-no" title="statement not covered" > const fullPath = path.resolve(this.config.sourcePath, p);</span>
1675
+ <span class="cstat-no" title="statement not covered" > await fs.access(fullPath);</span>
1676
+ <span class="cstat-no" title="statement not covered" > return this.loadFromJSON();</span>
1677
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
1678
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1679
+ <span class="cstat-no" title="statement not covered" > }</span>
1680
+ <span class="cstat-no" title="statement not covered" > }</span>
1681
+ <span class="cstat-no" title="statement not covered" ></span>
1682
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1683
+ <span class="cstat-no" title="statement not covered" > }</span>
1684
+ <span class="cstat-no" title="statement not covered" ></span>
1685
+ <span class="cstat-no" title="statement not covered" > private async loadFromSwarmMemory(): Promise&lt;LegacyEntry[]&gt; {</span>
1686
+ <span class="cstat-no" title="statement not covered" > // Would integrate with SwarmMemory partitions</span>
1687
+ <span class="cstat-no" title="statement not covered" > const entries: LegacyEntry[] = [];</span>
1688
+ <span class="cstat-no" title="statement not covered" > const basePath = this.config.sourcePath;</span>
1689
+ <span class="cstat-no" title="statement not covered" ></span>
1690
+ <span class="cstat-no" title="statement not covered" > try {</span>
1691
+ <span class="cstat-no" title="statement not covered" > // Check for swarm memory directory structure</span>
1692
+ <span class="cstat-no" title="statement not covered" > const partitionsPath = path.join(basePath, '.swarm', 'memory');</span>
1693
+ <span class="cstat-no" title="statement not covered" > const files = await this.walkDirectory(partitionsPath, '.json');</span>
1694
+ <span class="cstat-no" title="statement not covered" ></span>
1695
+ <span class="cstat-no" title="statement not covered" > for (const filePath of files) {</span>
1696
+ <span class="cstat-no" title="statement not covered" > try {</span>
1697
+ <span class="cstat-no" title="statement not covered" > const content = await fs.readFile(filePath, 'utf-8');</span>
1698
+ <span class="cstat-no" title="statement not covered" > const data = JSON.parse(content);</span>
1699
+ <span class="cstat-no" title="statement not covered" ></span>
1700
+ <span class="cstat-no" title="statement not covered" > // Extract namespace from file path</span>
1701
+ <span class="cstat-no" title="statement not covered" > const relativePath = path.relative(partitionsPath, filePath);</span>
1702
+ <span class="cstat-no" title="statement not covered" > const namespace = path.dirname(relativePath).replace(/\\/g, '/');</span>
1703
+ <span class="cstat-no" title="statement not covered" ></span>
1704
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(data)) {</span>
1705
+ <span class="cstat-no" title="statement not covered" > entries.push(...data.map((e: LegacyEntry) =&gt; ({ ...e, namespace })));</span>
1706
+ <span class="cstat-no" title="statement not covered" > } else if (data.entries) {</span>
1707
+ <span class="cstat-no" title="statement not covered" > entries.push(...data.entries.map((e: LegacyEntry) =&gt; ({ ...e, namespace })));</span>
1708
+ <span class="cstat-no" title="statement not covered" > }</span>
1709
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1710
+ <span class="cstat-no" title="statement not covered" > this.addError(filePath, (error as Error).message, 'PARSE_ERROR', true);</span>
1711
+ <span class="cstat-no" title="statement not covered" > }</span>
1712
+ <span class="cstat-no" title="statement not covered" > }</span>
1713
+ <span class="cstat-no" title="statement not covered" ></span>
1714
+ <span class="cstat-no" title="statement not covered" > return entries;</span>
1715
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1716
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1717
+ <span class="cstat-no" title="statement not covered" > }</span>
1718
+ <span class="cstat-no" title="statement not covered" > }</span>
1719
+ <span class="cstat-no" title="statement not covered" ></span>
1720
+ <span class="cstat-no" title="statement not covered" > private async loadFromDistributedMemory(): Promise&lt;LegacyEntry[]&gt; {</span>
1721
+ <span class="cstat-no" title="statement not covered" > // Would integrate with DistributedMemorySystem nodes</span>
1722
+ <span class="cstat-no" title="statement not covered" > return this.loadFromSwarmMemory(); // Similar structure</span>
1723
+ <span class="cstat-no" title="statement not covered" > }</span>
1724
+ <span class="cstat-no" title="statement not covered" ></span>
1725
+ <span class="cstat-no" title="statement not covered" > // ===== Batch Processing =====</span>
1726
+ <span class="cstat-no" title="statement not covered" ></span>
1727
+ <span class="cstat-no" title="statement not covered" > private async processBatch(batch: LegacyEntry[]): Promise&lt;void&gt; {</span>
1728
+ <span class="cstat-no" title="statement not covered" > for (const legacyEntry of batch) {</span>
1729
+ <span class="cstat-no" title="statement not covered" > try {</span>
1730
+ <span class="cstat-no" title="statement not covered" > // Validate if enabled</span>
1731
+ <span class="cstat-no" title="statement not covered" > if (this.config.validateData) {</span>
1732
+ <span class="cstat-no" title="statement not covered" > const validation = this.validateEntry(legacyEntry);</span>
1733
+ <span class="cstat-no" title="statement not covered" > if (!validation.valid) {</span>
1734
+ <span class="cstat-no" title="statement not covered" > if (this.config.continueOnError) {</span>
1735
+ <span class="cstat-no" title="statement not covered" > this.addError(</span>
1736
+ <span class="cstat-no" title="statement not covered" > legacyEntry.key || 'unknown',</span>
1737
+ <span class="cstat-no" title="statement not covered" > validation.reason || 'Validation failed',</span>
1738
+ <span class="cstat-no" title="statement not covered" > 'VALIDATION_ERROR',</span>
1739
+ <span class="cstat-no" title="statement not covered" > false</span>
1740
+ <span class="cstat-no" title="statement not covered" > );</span>
1741
+ <span class="cstat-no" title="statement not covered" > this.progress.skipped++;</span>
1742
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1743
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1744
+ <span class="cstat-no" title="statement not covered" > throw new Error(validation.reason);</span>
1745
+ <span class="cstat-no" title="statement not covered" > }</span>
1746
+ <span class="cstat-no" title="statement not covered" > }</span>
1747
+ <span class="cstat-no" title="statement not covered" > }</span>
1748
+ <span class="cstat-no" title="statement not covered" ></span>
1749
+ <span class="cstat-no" title="statement not covered" > // Transform to new format</span>
1750
+ <span class="cstat-no" title="statement not covered" > const newEntry = await this.transformEntry(legacyEntry);</span>
1751
+ <span class="cstat-no" title="statement not covered" ></span>
1752
+ <span class="cstat-no" title="statement not covered" > // Store in target</span>
1753
+ <span class="cstat-no" title="statement not covered" > await this.target.store(newEntry);</span>
1754
+ <span class="cstat-no" title="statement not covered" > this.progress.migrated++;</span>
1755
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1756
+ <span class="cstat-no" title="statement not covered" > if (this.config.continueOnError) {</span>
1757
+ <span class="cstat-no" title="statement not covered" > this.addError(</span>
1758
+ <span class="cstat-no" title="statement not covered" > legacyEntry.key || 'unknown',</span>
1759
+ <span class="cstat-no" title="statement not covered" > (error as Error).message,</span>
1760
+ <span class="cstat-no" title="statement not covered" > 'STORE_ERROR',</span>
1761
+ <span class="cstat-no" title="statement not covered" > true</span>
1762
+ <span class="cstat-no" title="statement not covered" > );</span>
1763
+ <span class="cstat-no" title="statement not covered" > this.progress.failed++;</span>
1764
+ <span class="cstat-no" title="statement not covered" > } else {</span>
1765
+ <span class="cstat-no" title="statement not covered" > throw error;</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" > }</span>
1769
+ <span class="cstat-no" title="statement not covered" > }</span>
1770
+ <span class="cstat-no" title="statement not covered" ></span>
1771
+ <span class="cstat-no" title="statement not covered" > private async transformEntry(legacy: LegacyEntry): Promise&lt;MemoryEntry&gt; {</span>
1772
+ <span class="cstat-no" title="statement not covered" > // Map namespace if configured</span>
1773
+ <span class="cstat-no" title="statement not covered" > let namespace = legacy.namespace || 'default';</span>
1774
+ <span class="cstat-no" title="statement not covered" > if (this.config.namespaceMapping &amp;&amp; this.config.namespaceMapping[namespace]) {</span>
1775
+ <span class="cstat-no" title="statement not covered" > namespace = this.config.namespaceMapping[namespace];</span>
1776
+ <span class="cstat-no" title="statement not covered" > }</span>
1777
+ <span class="cstat-no" title="statement not covered" ></span>
1778
+ <span class="cstat-no" title="statement not covered" > // Determine content</span>
1779
+ <span class="cstat-no" title="statement not covered" > const content =</span>
1780
+ <span class="cstat-no" title="statement not covered" > typeof legacy.value === 'string'</span>
1781
+ <span class="cstat-no" title="statement not covered" > ? legacy.value</span>
1782
+ <span class="cstat-no" title="statement not covered" > : JSON.stringify(legacy.value);</span>
1783
+ <span class="cstat-no" title="statement not covered" ></span>
1784
+ <span class="cstat-no" title="statement not covered" > // Map type if configured</span>
1785
+ <span class="cstat-no" title="statement not covered" > let type: MemoryType = 'semantic';</span>
1786
+ <span class="cstat-no" title="statement not covered" > if (legacy.metadata?.type &amp;&amp; typeof legacy.metadata.type === 'string') {</span>
1787
+ <span class="cstat-no" title="statement not covered" > if (this.config.typeMapping &amp;&amp; this.config.typeMapping[legacy.metadata.type]) {</span>
1788
+ <span class="cstat-no" title="statement not covered" > type = this.config.typeMapping[legacy.metadata.type];</span>
1789
+ <span class="cstat-no" title="statement not covered" > } else if (this.isValidMemoryType(legacy.metadata.type)) {</span>
1790
+ <span class="cstat-no" title="statement not covered" > type = legacy.metadata.type as MemoryType;</span>
1791
+ <span class="cstat-no" title="statement not covered" > }</span>
1792
+ <span class="cstat-no" title="statement not covered" > }</span>
1793
+ <span class="cstat-no" title="statement not covered" ></span>
1794
+ <span class="cstat-no" title="statement not covered" > // Parse timestamps</span>
1795
+ <span class="cstat-no" title="statement not covered" > const createdAt = this.parseTimestamp(</span>
1796
+ <span class="cstat-no" title="statement not covered" > legacy.createdAt || legacy.created_at || legacy.timestamp</span>
1797
+ <span class="cstat-no" title="statement not covered" > );</span>
1798
+ <span class="cstat-no" title="statement not covered" > const updatedAt = this.parseTimestamp(</span>
1799
+ <span class="cstat-no" title="statement not covered" > legacy.updatedAt || legacy.updated_at || legacy.timestamp</span>
1800
+ <span class="cstat-no" title="statement not covered" > );</span>
1801
+ <span class="cstat-no" title="statement not covered" ></span>
1802
+ <span class="cstat-no" title="statement not covered" > const input: MemoryEntryInput = {</span>
1803
+ <span class="cstat-no" title="statement not covered" > key: legacy.key,</span>
1804
+ <span class="cstat-no" title="statement not covered" > content,</span>
1805
+ <span class="cstat-no" title="statement not covered" > type,</span>
1806
+ <span class="cstat-no" title="statement not covered" > namespace,</span>
1807
+ <span class="cstat-no" title="statement not covered" > tags: legacy.tags || [],</span>
1808
+ <span class="cstat-no" title="statement not covered" > metadata: {</span>
1809
+ <span class="cstat-no" title="statement not covered" > ...legacy.metadata,</span>
1810
+ <span class="cstat-no" title="statement not covered" > migrated: true,</span>
1811
+ <span class="cstat-no" title="statement not covered" > migrationSource: this.config.source,</span>
1812
+ <span class="cstat-no" title="statement not covered" > migrationTimestamp: Date.now(),</span>
1813
+ <span class="cstat-no" title="statement not covered" > originalValue: legacy.value,</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" ></span>
1817
+ <span class="cstat-no" title="statement not covered" > const entry = createDefaultEntry(input);</span>
1818
+ <span class="cstat-no" title="statement not covered" > entry.createdAt = createdAt;</span>
1819
+ <span class="cstat-no" title="statement not covered" > entry.updatedAt = updatedAt;</span>
1820
+ <span class="cstat-no" title="statement not covered" ></span>
1821
+ <span class="cstat-no" title="statement not covered" > // Generate embedding if configured</span>
1822
+ <span class="cstat-no" title="statement not covered" > if (this.config.generateEmbeddings &amp;&amp; this.embeddingGenerator) {</span>
1823
+ <span class="cstat-no" title="statement not covered" > try {</span>
1824
+ <span class="cstat-no" title="statement not covered" > entry.embedding = await this.embeddingGenerator(content);</span>
1825
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1826
+ <span class="cstat-no" title="statement not covered" > // Log but don't fail</span>
1827
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:warning', {</span>
1828
+ <span class="cstat-no" title="statement not covered" > message: `Failed to generate embedding for ${legacy.key}: ${(error as Error).message}`,</span>
1829
+ <span class="cstat-no" title="statement not covered" > });</span>
1830
+ <span class="cstat-no" title="statement not covered" > }</span>
1831
+ <span class="cstat-no" title="statement not covered" > }</span>
1832
+ <span class="cstat-no" title="statement not covered" ></span>
1833
+ <span class="cstat-no" title="statement not covered" > return entry;</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" > // ===== Helper Methods =====</span>
1837
+ <span class="cstat-no" title="statement not covered" ></span>
1838
+ <span class="cstat-no" title="statement not covered" > private initializeProgress(): MigrationProgress {</span>
1839
+ <span class="cstat-no" title="statement not covered" > return {</span>
1840
+ <span class="cstat-no" title="statement not covered" > total: 0,</span>
1841
+ <span class="cstat-no" title="statement not covered" > migrated: 0,</span>
1842
+ <span class="cstat-no" title="statement not covered" > failed: 0,</span>
1843
+ <span class="cstat-no" title="statement not covered" > skipped: 0,</span>
1844
+ <span class="cstat-no" title="statement not covered" > currentBatch: 0,</span>
1845
+ <span class="cstat-no" title="statement not covered" > totalBatches: 0,</span>
1846
+ <span class="cstat-no" title="statement not covered" > percentage: 0,</span>
1847
+ <span class="cstat-no" title="statement not covered" > estimatedTimeRemaining: 0,</span>
1848
+ <span class="cstat-no" title="statement not covered" > errors: [],</span>
1849
+ <span class="cstat-no" title="statement not covered" > };</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" > private validateEntry(entry: LegacyEntry): { valid: boolean; reason?: string } {</span>
1853
+ <span class="cstat-no" title="statement not covered" > if (!entry.key || typeof entry.key !== 'string') {</span>
1854
+ <span class="cstat-no" title="statement not covered" > return { valid: false, reason: 'Missing or invalid key' };</span>
1855
+ <span class="cstat-no" title="statement not covered" > }</span>
1856
+ <span class="cstat-no" title="statement not covered" ></span>
1857
+ <span class="cstat-no" title="statement not covered" > if (entry.value === undefined) {</span>
1858
+ <span class="cstat-no" title="statement not covered" > return { valid: false, reason: 'Missing value' };</span>
1859
+ <span class="cstat-no" title="statement not covered" > }</span>
1860
+ <span class="cstat-no" title="statement not covered" ></span>
1861
+ <span class="cstat-no" title="statement not covered" > if (entry.key.length &gt; 500) {</span>
1862
+ <span class="cstat-no" title="statement not covered" > return { valid: false, reason: 'Key too long (max 500 chars)' };</span>
1863
+ <span class="cstat-no" title="statement not covered" > }</span>
1864
+ <span class="cstat-no" title="statement not covered" ></span>
1865
+ <span class="cstat-no" title="statement not covered" > return { valid: true };</span>
1866
+ <span class="cstat-no" title="statement not covered" > }</span>
1867
+ <span class="cstat-no" title="statement not covered" ></span>
1868
+ <span class="cstat-no" title="statement not covered" > private addError(</span>
1869
+ <span class="cstat-no" title="statement not covered" > entryId: string,</span>
1870
+ <span class="cstat-no" title="statement not covered" > message: string,</span>
1871
+ <span class="cstat-no" title="statement not covered" > code: string,</span>
1872
+ <span class="cstat-no" title="statement not covered" > recoverable: boolean</span>
1873
+ <span class="cstat-no" title="statement not covered" > ): void {</span>
1874
+ <span class="cstat-no" title="statement not covered" > const error: MigrationError = {</span>
1875
+ <span class="cstat-no" title="statement not covered" > entryId,</span>
1876
+ <span class="cstat-no" title="statement not covered" > message,</span>
1877
+ <span class="cstat-no" title="statement not covered" > code,</span>
1878
+ <span class="cstat-no" title="statement not covered" > recoverable,</span>
1879
+ <span class="cstat-no" title="statement not covered" > };</span>
1880
+ <span class="cstat-no" title="statement not covered" > this.progress.errors.push(error);</span>
1881
+ <span class="cstat-no" title="statement not covered" > this.emit('migration:error', error);</span>
1882
+ <span class="cstat-no" title="statement not covered" > }</span>
1883
+ <span class="cstat-no" title="statement not covered" ></span>
1884
+ <span class="cstat-no" title="statement not covered" > private parseTimestamp(value: string | number | undefined): number {</span>
1885
+ <span class="cstat-no" title="statement not covered" > if (!value) return Date.now();</span>
1886
+ <span class="cstat-no" title="statement not covered" ></span>
1887
+ <span class="cstat-no" title="statement not covered" > if (typeof value === 'number') {</span>
1888
+ <span class="cstat-no" title="statement not covered" > // Handle both milliseconds and seconds</span>
1889
+ <span class="cstat-no" title="statement not covered" > return value &gt; 1e12 ? value : value * 1000;</span>
1890
+ <span class="cstat-no" title="statement not covered" > }</span>
1891
+ <span class="cstat-no" title="statement not covered" ></span>
1892
+ <span class="cstat-no" title="statement not covered" > const parsed = Date.parse(value);</span>
1893
+ <span class="cstat-no" title="statement not covered" > return isNaN(parsed) ? Date.now() : parsed;</span>
1894
+ <span class="cstat-no" title="statement not covered" > }</span>
1895
+ <span class="cstat-no" title="statement not covered" ></span>
1896
+ <span class="cstat-no" title="statement not covered" > private isValidMemoryType(type: string): boolean {</span>
1897
+ <span class="cstat-no" title="statement not covered" > return ['episodic', 'semantic', 'procedural', 'working', 'cache'].includes(type);</span>
1898
+ <span class="cstat-no" title="statement not covered" > }</span>
1899
+ <span class="cstat-no" title="statement not covered" ></span>
1900
+ <span class="cstat-no" title="statement not covered" > private estimateTimeRemaining(</span>
1901
+ <span class="cstat-no" title="statement not covered" > startTime: number,</span>
1902
+ <span class="cstat-no" title="statement not covered" > completed: number,</span>
1903
+ <span class="cstat-no" title="statement not covered" > total: number</span>
1904
+ <span class="cstat-no" title="statement not covered" > ): number {</span>
1905
+ <span class="cstat-no" title="statement not covered" > if (completed === 0) return 0;</span>
1906
+ <span class="cstat-no" title="statement not covered" ></span>
1907
+ <span class="cstat-no" title="statement not covered" > const elapsed = Date.now() - startTime;</span>
1908
+ <span class="cstat-no" title="statement not covered" > const rate = completed / elapsed;</span>
1909
+ <span class="cstat-no" title="statement not covered" > const remaining = total - completed;</span>
1910
+ <span class="cstat-no" title="statement not covered" ></span>
1911
+ <span class="cstat-no" title="statement not covered" > return Math.round(remaining / rate);</span>
1912
+ <span class="cstat-no" title="statement not covered" > }</span>
1913
+ <span class="cstat-no" title="statement not covered" ></span>
1914
+ <span class="cstat-no" title="statement not covered" > private generateSummary(): string {</span>
1915
+ <span class="cstat-no" title="statement not covered" > const { migrated, failed, skipped, total, errors } = this.progress;</span>
1916
+ <span class="cstat-no" title="statement not covered" ></span>
1917
+ <span class="cstat-no" title="statement not covered" > let summary = `Migrated ${migrated}/${total} entries`;</span>
1918
+ <span class="cstat-no" title="statement not covered" ></span>
1919
+ <span class="cstat-no" title="statement not covered" > if (failed &gt; 0) {</span>
1920
+ <span class="cstat-no" title="statement not covered" > summary += `, ${failed} failed`;</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" > if (skipped &gt; 0) {</span>
1924
+ <span class="cstat-no" title="statement not covered" > summary += `, ${skipped} skipped`;</span>
1925
+ <span class="cstat-no" title="statement not covered" > }</span>
1926
+ <span class="cstat-no" title="statement not covered" ></span>
1927
+ <span class="cstat-no" title="statement not covered" > if (errors.length &gt; 0) {</span>
1928
+ <span class="cstat-no" title="statement not covered" > const errorTypes = new Map&lt;string, number&gt;();</span>
1929
+ <span class="cstat-no" title="statement not covered" > for (const error of errors) {</span>
1930
+ <span class="cstat-no" title="statement not covered" > errorTypes.set(error.code, (errorTypes.get(error.code) || 0) + 1);</span>
1931
+ <span class="cstat-no" title="statement not covered" > }</span>
1932
+ <span class="cstat-no" title="statement not covered" ></span>
1933
+ <span class="cstat-no" title="statement not covered" > const errorSummary = Array.from(errorTypes.entries())</span>
1934
+ <span class="cstat-no" title="statement not covered" > .map(([code, count]) =&gt; `${code}: ${count}`)</span>
1935
+ <span class="cstat-no" title="statement not covered" > .join(', ');</span>
1936
+ <span class="cstat-no" title="statement not covered" ></span>
1937
+ <span class="cstat-no" title="statement not covered" > summary += `. Errors: ${errorSummary}`;</span>
1938
+ <span class="cstat-no" title="statement not covered" > }</span>
1939
+ <span class="cstat-no" title="statement not covered" ></span>
1940
+ <span class="cstat-no" title="statement not covered" > return summary;</span>
1941
+ <span class="cstat-no" title="statement not covered" > }</span>
1942
+ <span class="cstat-no" title="statement not covered" ></span>
1943
+ <span class="cstat-no" title="statement not covered" > private async walkDirectory(dir: string, extension: string): Promise&lt;string[]&gt; {</span>
1944
+ <span class="cstat-no" title="statement not covered" > const files: string[] = [];</span>
1945
+ <span class="cstat-no" title="statement not covered" ></span>
1946
+ <span class="cstat-no" title="statement not covered" > try {</span>
1947
+ <span class="cstat-no" title="statement not covered" > const entries = await fs.readdir(dir, { withFileTypes: true });</span>
1948
+ <span class="cstat-no" title="statement not covered" ></span>
1949
+ <span class="cstat-no" title="statement not covered" > for (const entry of entries) {</span>
1950
+ <span class="cstat-no" title="statement not covered" > const fullPath = path.join(dir, entry.name);</span>
1951
+ <span class="cstat-no" title="statement not covered" ></span>
1952
+ <span class="cstat-no" title="statement not covered" > if (entry.isDirectory()) {</span>
1953
+ <span class="cstat-no" title="statement not covered" > const subFiles = await this.walkDirectory(fullPath, extension);</span>
1954
+ <span class="cstat-no" title="statement not covered" > files.push(...subFiles);</span>
1955
+ <span class="cstat-no" title="statement not covered" > } else if (entry.isFile() &amp;&amp; entry.name.endsWith(extension)) {</span>
1956
+ <span class="cstat-no" title="statement not covered" > files.push(fullPath);</span>
1957
+ <span class="cstat-no" title="statement not covered" > }</span>
1958
+ <span class="cstat-no" title="statement not covered" > }</span>
1959
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1960
+ <span class="cstat-no" title="statement not covered" > // Directory doesn't exist or isn't readable</span>
1961
+ <span class="cstat-no" title="statement not covered" > }</span>
1962
+ <span class="cstat-no" title="statement not covered" ></span>
1963
+ <span class="cstat-no" title="statement not covered" > return files;</span>
1964
+ <span class="cstat-no" title="statement not covered" > }</span>
1965
+ <span class="cstat-no" title="statement not covered" ></span>
1966
+ <span class="cstat-no" title="statement not covered" > private parseMarkdownEntry(</span>
1967
+ <span class="cstat-no" title="statement not covered" > filePath: string,</span>
1968
+ <span class="cstat-no" title="statement not covered" > content: string,</span>
1969
+ <span class="cstat-no" title="statement not covered" > basePath: string</span>
1970
+ <span class="cstat-no" title="statement not covered" > ): LegacyEntry | null {</span>
1971
+ <span class="cstat-no" title="statement not covered" > // Extract frontmatter if present</span>
1972
+ <span class="cstat-no" title="statement not covered" > const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);</span>
1973
+ <span class="cstat-no" title="statement not covered" ></span>
1974
+ <span class="cstat-no" title="statement not covered" > let metadata: Record&lt;string, unknown&gt; = {};</span>
1975
+ <span class="cstat-no" title="statement not covered" > let body = content;</span>
1976
+ <span class="cstat-no" title="statement not covered" ></span>
1977
+ <span class="cstat-no" title="statement not covered" > if (frontmatterMatch) {</span>
1978
+ <span class="cstat-no" title="statement not covered" > try {</span>
1979
+ <span class="cstat-no" title="statement not covered" > // Simple YAML-like parsing</span>
1980
+ <span class="cstat-no" title="statement not covered" > const frontmatter = frontmatterMatch[1];</span>
1981
+ <span class="cstat-no" title="statement not covered" > for (const line of frontmatter.split('\n')) {</span>
1982
+ <span class="cstat-no" title="statement not covered" > const colonIndex = line.indexOf(':');</span>
1983
+ <span class="cstat-no" title="statement not covered" > if (colonIndex &gt; 0) {</span>
1984
+ <span class="cstat-no" title="statement not covered" > const key = line.substring(0, colonIndex).trim();</span>
1985
+ <span class="cstat-no" title="statement not covered" > let value: unknown = line.substring(colonIndex + 1).trim();</span>
1986
+ <span class="cstat-no" title="statement not covered" ></span>
1987
+ <span class="cstat-no" title="statement not covered" > // Parse common types</span>
1988
+ <span class="cstat-no" title="statement not covered" > if (value === 'true') value = true;</span>
1989
+ <span class="cstat-no" title="statement not covered" > else if (value === 'false') value = false;</span>
1990
+ <span class="cstat-no" title="statement not covered" > else if (typeof value === 'string' &amp;&amp; /^\d+$/.test(value)) value = parseInt(value, 10);</span>
1991
+ <span class="cstat-no" title="statement not covered" > else if (typeof value === 'string' &amp;&amp; value.startsWith('[') &amp;&amp; value.endsWith(']')) {</span>
1992
+ <span class="cstat-no" title="statement not covered" > try {</span>
1993
+ <span class="cstat-no" title="statement not covered" > value = JSON.parse(value.replace(/'/g, '"'));</span>
1994
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
1995
+ <span class="cstat-no" title="statement not covered" > // Keep as string</span>
1996
+ <span class="cstat-no" title="statement not covered" > }</span>
1997
+ <span class="cstat-no" title="statement not covered" > }</span>
1998
+ <span class="cstat-no" title="statement not covered" ></span>
1999
+ <span class="cstat-no" title="statement not covered" > metadata[key] = value;</span>
2000
+ <span class="cstat-no" title="statement not covered" > }</span>
2001
+ <span class="cstat-no" title="statement not covered" > }</span>
2002
+ <span class="cstat-no" title="statement not covered" > body = frontmatterMatch[2];</span>
2003
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
2004
+ <span class="cstat-no" title="statement not covered" > // Failed to parse frontmatter, use whole content</span>
2005
+ <span class="cstat-no" title="statement not covered" > }</span>
2006
+ <span class="cstat-no" title="statement not covered" > }</span>
2007
+ <span class="cstat-no" title="statement not covered" ></span>
2008
+ <span class="cstat-no" title="statement not covered" > // Derive key from file path</span>
2009
+ <span class="cstat-no" title="statement not covered" > const relativePath = path.relative(basePath, filePath);</span>
2010
+ <span class="cstat-no" title="statement not covered" > const key = relativePath</span>
2011
+ <span class="cstat-no" title="statement not covered" > .replace(/\\/g, '/')</span>
2012
+ <span class="cstat-no" title="statement not covered" > .replace(/\.md$/, '')</span>
2013
+ <span class="cstat-no" title="statement not covered" > .replace(/\//g, ':');</span>
2014
+ <span class="cstat-no" title="statement not covered" ></span>
2015
+ <span class="cstat-no" title="statement not covered" > // Derive namespace from directory structure</span>
2016
+ <span class="cstat-no" title="statement not covered" > const namespace = path.dirname(relativePath).replace(/\\/g, '/') || 'default';</span>
2017
+ <span class="cstat-no" title="statement not covered" ></span>
2018
+ <span class="cstat-no" title="statement not covered" > return {</span>
2019
+ <span class="cstat-no" title="statement not covered" > key,</span>
2020
+ <span class="cstat-no" title="statement not covered" > value: body.trim(),</span>
2021
+ <span class="cstat-no" title="statement not covered" > namespace,</span>
2022
+ <span class="cstat-no" title="statement not covered" > tags: Array.isArray(metadata.tags) ? metadata.tags : [],</span>
2023
+ <span class="cstat-no" title="statement not covered" > metadata,</span>
2024
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</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" >/**</span>
2030
+ <span class="cstat-no" title="statement not covered" > * Convenience function to create a migrator</span>
2031
+ <span class="cstat-no" title="statement not covered" > */</span>
2032
+ <span class="cstat-no" title="statement not covered" >export function createMigrator(</span>
2033
+ <span class="cstat-no" title="statement not covered" > target: AgentDBAdapter,</span>
2034
+ <span class="cstat-no" title="statement not covered" > source: MigrationSource,</span>
2035
+ <span class="cstat-no" title="statement not covered" > sourcePath: string,</span>
2036
+ <span class="cstat-no" title="statement not covered" > options: Partial&lt;MigrationConfig&gt; = {},</span>
2037
+ <span class="cstat-no" title="statement not covered" > embeddingGenerator?: EmbeddingGenerator</span>
2038
+ <span class="cstat-no" title="statement not covered" >): MemoryMigrator {</span>
2039
+ <span class="cstat-no" title="statement not covered" > return new MemoryMigrator(</span>
2040
+ <span class="cstat-no" title="statement not covered" > target,</span>
2041
+ <span class="cstat-no" title="statement not covered" > { source, sourcePath, ...options },</span>
2042
+ <span class="cstat-no" title="statement not covered" > embeddingGenerator</span>
2043
+ <span class="cstat-no" title="statement not covered" > );</span>
2044
+ <span class="cstat-no" title="statement not covered" >}</span>
2045
+ <span class="cstat-no" title="statement not covered" ></span>
2046
+ <span class="cstat-no" title="statement not covered" >/**</span>
2047
+ <span class="cstat-no" title="statement not covered" > * Migrate from multiple sources</span>
2048
+ <span class="cstat-no" title="statement not covered" > */</span>
2049
+ <span class="cstat-no" title="statement not covered" >export async function migrateMultipleSources(</span>
2050
+ <span class="cstat-no" title="statement not covered" > target: AgentDBAdapter,</span>
2051
+ <span class="cstat-no" title="statement not covered" > sources: Array&lt;{ source: MigrationSource; path: string }&gt;,</span>
2052
+ <span class="cstat-no" title="statement not covered" > options: Partial&lt;MigrationConfig&gt; = {},</span>
2053
+ <span class="cstat-no" title="statement not covered" > embeddingGenerator?: EmbeddingGenerator</span>
2054
+ <span class="cstat-no" title="statement not covered" >): Promise&lt;MigrationResult[]&gt; {</span>
2055
+ <span class="cstat-no" title="statement not covered" > const results: MigrationResult[] = [];</span>
2056
+ <span class="cstat-no" title="statement not covered" ></span>
2057
+ <span class="cstat-no" title="statement not covered" > for (const { source, path: sourcePath } of sources) {</span>
2058
+ <span class="cstat-no" title="statement not covered" > const migrator = createMigrator(</span>
2059
+ <span class="cstat-no" title="statement not covered" > target,</span>
2060
+ <span class="cstat-no" title="statement not covered" > source,</span>
2061
+ <span class="cstat-no" title="statement not covered" > sourcePath,</span>
2062
+ <span class="cstat-no" title="statement not covered" > options,</span>
2063
+ <span class="cstat-no" title="statement not covered" > embeddingGenerator</span>
2064
+ <span class="cstat-no" title="statement not covered" > );</span>
2065
+ <span class="cstat-no" title="statement not covered" > const result = await migrator.migrate();</span>
2066
+ <span class="cstat-no" title="statement not covered" > results.push(result);</span>
2067
+ <span class="cstat-no" title="statement not covered" > }</span>
2068
+ <span class="cstat-no" title="statement not covered" ></span>
2069
+ <span class="cstat-no" title="statement not covered" > return results;</span>
2070
+ <span class="cstat-no" title="statement not covered" >}</span>
2071
+ <span class="cstat-no" title="statement not covered" ></span>
2072
+ <span class="cstat-no" title="statement not covered" >export default MemoryMigrator;</span>
2073
+ &nbsp;</pre></td></tr></table></pre>
2074
+
2075
+ <div class='push'></div><!-- for sticky footer -->
2076
+ </div><!-- /wrapper -->
2077
+ <div class='footer quiet pad2 space-top1 center small'>
2078
+ Code coverage generated by
2079
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2080
+ at 2026-01-05T21:16:54.220Z
2081
+ </div>
2082
+ <script src="../prettify.js"></script>
2083
+ <script>
2084
+ window.onload = function () {
2085
+ prettyPrint();
2086
+ };
2087
+ </script>
2088
+ <script src="../sorter.js"></script>
2089
+ <script src="../block-navigation.js"></script>
2090
+ </body>
2091
+ </html>
2092
+