@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,2737 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/agentdb-adapter.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> agentdb-adapter.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/884</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/884</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-no">&nbsp;</span>
957
+ <span class="cline-any cline-no">&nbsp;</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-no">&nbsp;</span>
964
+ <span class="cline-any cline-no">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&nbsp;</span>
971
+ <span class="cline-any cline-no">&nbsp;</span>
972
+ <span class="cline-any cline-no">&nbsp;</span>
973
+ <span class="cline-any cline-no">&nbsp;</span>
974
+ <span class="cline-any cline-no">&nbsp;</span>
975
+ <span class="cline-any cline-no">&nbsp;</span>
976
+ <span class="cline-any cline-no">&nbsp;</span>
977
+ <span class="cline-any cline-no">&nbsp;</span>
978
+ <span class="cline-any cline-no">&nbsp;</span>
979
+ <span class="cline-any cline-no">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-no">&nbsp;</span>
985
+ <span class="cline-any cline-no">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-no">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-no">&nbsp;</span>
995
+ <span class="cline-any cline-no">&nbsp;</span>
996
+ <span class="cline-any cline-no">&nbsp;</span>
997
+ <span class="cline-any cline-no">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-no">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-no">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-no">&nbsp;</span>
1021
+ <span class="cline-any cline-no">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-no">&nbsp;</span>
1031
+ <span class="cline-any cline-no">&nbsp;</span>
1032
+ <span class="cline-any cline-no">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-no">&nbsp;</span>
1036
+ <span class="cline-any cline-no">&nbsp;</span>
1037
+ <span class="cline-any cline-no">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-no">&nbsp;</span>
1044
+ <span class="cline-any cline-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&nbsp;</span>
1047
+ <span class="cline-any cline-no">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-no">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</span>
1053
+ <span class="cline-any cline-no">&nbsp;</span>
1054
+ <span class="cline-any cline-no">&nbsp;</span>
1055
+ <span class="cline-any cline-no">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-no">&nbsp;</span>
1061
+ <span class="cline-any cline-no">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-no">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-no">&nbsp;</span>
1071
+ <span class="cline-any cline-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-no">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-no">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-no">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-no">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-no">&nbsp;</span>
1113
+ <span class="cline-any cline-no">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-no">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&nbsp;</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-no">&nbsp;</span>
1121
+ <span class="cline-any cline-no">&nbsp;</span>
1122
+ <span class="cline-any cline-no">&nbsp;</span>
1123
+ <span class="cline-any cline-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-no">&nbsp;</span>
1129
+ <span class="cline-any cline-no">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-no">&nbsp;</span>
1149
+ <span class="cline-any cline-no">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&nbsp;</span>
1152
+ <span class="cline-any cline-no">&nbsp;</span>
1153
+ <span class="cline-any cline-no">&nbsp;</span>
1154
+ <span class="cline-any cline-no">&nbsp;</span>
1155
+ <span class="cline-any cline-no">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-no">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-no">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-no">&nbsp;</span>
1172
+ <span class="cline-any cline-no">&nbsp;</span>
1173
+ <span class="cline-any cline-no">&nbsp;</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-no">&nbsp;</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-no">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-no">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-no">&nbsp;</span>
1197
+ <span class="cline-any cline-no">&nbsp;</span>
1198
+ <span class="cline-any cline-no">&nbsp;</span>
1199
+ <span class="cline-any cline-no">&nbsp;</span>
1200
+ <span class="cline-any cline-no">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-no">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-no">&nbsp;</span>
1210
+ <span class="cline-any cline-no">&nbsp;</span>
1211
+ <span class="cline-any cline-no">&nbsp;</span>
1212
+ <span class="cline-any cline-no">&nbsp;</span>
1213
+ <span class="cline-any cline-no">&nbsp;</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-no">&nbsp;</span>
1217
+ <span class="cline-any cline-no">&nbsp;</span>
1218
+ <span class="cline-any cline-no">&nbsp;</span>
1219
+ <span class="cline-any cline-no">&nbsp;</span>
1220
+ <span class="cline-any cline-no">&nbsp;</span>
1221
+ <span class="cline-any cline-no">&nbsp;</span>
1222
+ <span class="cline-any cline-no">&nbsp;</span>
1223
+ <span class="cline-any cline-no">&nbsp;</span>
1224
+ <span class="cline-any cline-no">&nbsp;</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-no">&nbsp;</span>
1229
+ <span class="cline-any cline-no">&nbsp;</span>
1230
+ <span class="cline-any cline-no">&nbsp;</span>
1231
+ <span class="cline-any cline-no">&nbsp;</span>
1232
+ <span class="cline-any cline-no">&nbsp;</span>
1233
+ <span class="cline-any cline-no">&nbsp;</span>
1234
+ <span class="cline-any cline-no">&nbsp;</span>
1235
+ <span class="cline-any cline-no">&nbsp;</span>
1236
+ <span class="cline-any cline-no">&nbsp;</span>
1237
+ <span class="cline-any cline-no">&nbsp;</span>
1238
+ <span class="cline-any cline-no">&nbsp;</span>
1239
+ <span class="cline-any cline-no">&nbsp;</span>
1240
+ <span class="cline-any cline-no">&nbsp;</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-no">&nbsp;</span>
1283
+ <span class="cline-any cline-no">&nbsp;</span>
1284
+ <span class="cline-any cline-no">&nbsp;</span>
1285
+ <span class="cline-any cline-no">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-no">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-no">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-no">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-no">&nbsp;</span>
1313
+ <span class="cline-any cline-no">&nbsp;</span>
1314
+ <span class="cline-any cline-no">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-no">&nbsp;</span>
1318
+ <span class="cline-any cline-no">&nbsp;</span>
1319
+ <span class="cline-any cline-no">&nbsp;</span>
1320
+ <span class="cline-any cline-no">&nbsp;</span>
1321
+ <span class="cline-any cline-no">&nbsp;</span>
1322
+ <span class="cline-any cline-no">&nbsp;</span>
1323
+ <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-no">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-no">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
1335
+ <span class="cline-any cline-no">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-no">&nbsp;</span>
1343
+ <span class="cline-any cline-no">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-no">&nbsp;</span>
1346
+ <span class="cline-any cline-no">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-no">&nbsp;</span>
1350
+ <span class="cline-any cline-no">&nbsp;</span>
1351
+ <span class="cline-any cline-no">&nbsp;</span>
1352
+ <span class="cline-any cline-no">&nbsp;</span>
1353
+ <span class="cline-any cline-no">&nbsp;</span>
1354
+ <span class="cline-any cline-no">&nbsp;</span>
1355
+ <span class="cline-any cline-no">&nbsp;</span>
1356
+ <span class="cline-any cline-no">&nbsp;</span>
1357
+ <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-no">&nbsp;</span>
1359
+ <span class="cline-any cline-no">&nbsp;</span>
1360
+ <span class="cline-any cline-no">&nbsp;</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-no">&nbsp;</span>
1363
+ <span class="cline-any cline-no">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-no">&nbsp;</span>
1366
+ <span class="cline-any cline-no">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-no">&nbsp;</span>
1369
+ <span class="cline-any cline-no">&nbsp;</span>
1370
+ <span class="cline-any cline-no">&nbsp;</span>
1371
+ <span class="cline-any cline-no">&nbsp;</span>
1372
+ <span class="cline-any cline-no">&nbsp;</span>
1373
+ <span class="cline-any cline-no">&nbsp;</span>
1374
+ <span class="cline-any cline-no">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-no">&nbsp;</span>
1377
+ <span class="cline-any cline-no">&nbsp;</span>
1378
+ <span class="cline-any cline-no">&nbsp;</span>
1379
+ <span class="cline-any cline-no">&nbsp;</span>
1380
+ <span class="cline-any cline-no">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-no">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-no">&nbsp;</span>
1385
+ <span class="cline-any cline-no">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-no">&nbsp;</span>
1398
+ <span class="cline-any cline-no">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-no">&nbsp;</span>
1404
+ <span class="cline-any cline-no">&nbsp;</span>
1405
+ <span class="cline-any cline-no">&nbsp;</span>
1406
+ <span class="cline-any cline-no">&nbsp;</span>
1407
+ <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-no">&nbsp;</span>
1409
+ <span class="cline-any cline-no">&nbsp;</span>
1410
+ <span class="cline-any cline-no">&nbsp;</span>
1411
+ <span class="cline-any cline-no">&nbsp;</span>
1412
+ <span class="cline-any cline-no">&nbsp;</span>
1413
+ <span class="cline-any cline-no">&nbsp;</span>
1414
+ <span class="cline-any cline-no">&nbsp;</span>
1415
+ <span class="cline-any cline-no">&nbsp;</span>
1416
+ <span class="cline-any cline-no">&nbsp;</span>
1417
+ <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-no">&nbsp;</span>
1422
+ <span class="cline-any cline-no">&nbsp;</span>
1423
+ <span class="cline-any cline-no">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-no">&nbsp;</span>
1426
+ <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-no">&nbsp;</span>
1429
+ <span class="cline-any cline-no">&nbsp;</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-no">&nbsp;</span>
1432
+ <span class="cline-any cline-no">&nbsp;</span>
1433
+ <span class="cline-any cline-no">&nbsp;</span>
1434
+ <span class="cline-any cline-no">&nbsp;</span>
1435
+ <span class="cline-any cline-no">&nbsp;</span>
1436
+ <span class="cline-any cline-no">&nbsp;</span>
1437
+ <span class="cline-any cline-no">&nbsp;</span>
1438
+ <span class="cline-any cline-no">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-no">&nbsp;</span>
1441
+ <span class="cline-any cline-no">&nbsp;</span>
1442
+ <span class="cline-any cline-no">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-no">&nbsp;</span>
1446
+ <span class="cline-any cline-no">&nbsp;</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-no">&nbsp;</span>
1450
+ <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-no">&nbsp;</span>
1454
+ <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
1457
+ <span class="cline-any cline-no">&nbsp;</span>
1458
+ <span class="cline-any cline-no">&nbsp;</span>
1459
+ <span class="cline-any cline-no">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-no">&nbsp;</span>
1462
+ <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-no">&nbsp;</span>
1464
+ <span class="cline-any cline-no">&nbsp;</span>
1465
+ <span class="cline-any cline-no">&nbsp;</span>
1466
+ <span class="cline-any cline-no">&nbsp;</span>
1467
+ <span class="cline-any cline-no">&nbsp;</span>
1468
+ <span class="cline-any cline-no">&nbsp;</span>
1469
+ <span class="cline-any cline-no">&nbsp;</span>
1470
+ <span class="cline-any cline-no">&nbsp;</span>
1471
+ <span class="cline-any cline-no">&nbsp;</span>
1472
+ <span class="cline-any cline-no">&nbsp;</span>
1473
+ <span class="cline-any cline-no">&nbsp;</span>
1474
+ <span class="cline-any cline-no">&nbsp;</span>
1475
+ <span class="cline-any cline-no">&nbsp;</span>
1476
+ <span class="cline-any cline-no">&nbsp;</span>
1477
+ <span class="cline-any cline-no">&nbsp;</span>
1478
+ <span class="cline-any cline-no">&nbsp;</span>
1479
+ <span class="cline-any cline-no">&nbsp;</span>
1480
+ <span class="cline-any cline-no">&nbsp;</span>
1481
+ <span class="cline-any cline-no">&nbsp;</span>
1482
+ <span class="cline-any cline-no">&nbsp;</span>
1483
+ <span class="cline-any cline-no">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-no">&nbsp;</span>
1487
+ <span class="cline-any cline-no">&nbsp;</span>
1488
+ <span class="cline-any cline-no">&nbsp;</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-no">&nbsp;</span>
1491
+ <span class="cline-any cline-no">&nbsp;</span>
1492
+ <span class="cline-any cline-no">&nbsp;</span>
1493
+ <span class="cline-any cline-no">&nbsp;</span>
1494
+ <span class="cline-any cline-no">&nbsp;</span>
1495
+ <span class="cline-any cline-no">&nbsp;</span>
1496
+ <span class="cline-any cline-no">&nbsp;</span>
1497
+ <span class="cline-any cline-no">&nbsp;</span>
1498
+ <span class="cline-any cline-no">&nbsp;</span>
1499
+ <span class="cline-any cline-no">&nbsp;</span>
1500
+ <span class="cline-any cline-no">&nbsp;</span>
1501
+ <span class="cline-any cline-no">&nbsp;</span>
1502
+ <span class="cline-any cline-no">&nbsp;</span>
1503
+ <span class="cline-any cline-no">&nbsp;</span>
1504
+ <span class="cline-any cline-no">&nbsp;</span>
1505
+ <span class="cline-any cline-no">&nbsp;</span>
1506
+ <span class="cline-any cline-no">&nbsp;</span>
1507
+ <span class="cline-any cline-no">&nbsp;</span>
1508
+ <span class="cline-any cline-no">&nbsp;</span>
1509
+ <span class="cline-any cline-no">&nbsp;</span>
1510
+ <span class="cline-any cline-no">&nbsp;</span>
1511
+ <span class="cline-any cline-no">&nbsp;</span>
1512
+ <span class="cline-any cline-no">&nbsp;</span>
1513
+ <span class="cline-any cline-no">&nbsp;</span>
1514
+ <span class="cline-any cline-no">&nbsp;</span>
1515
+ <span class="cline-any cline-no">&nbsp;</span>
1516
+ <span class="cline-any cline-no">&nbsp;</span>
1517
+ <span class="cline-any cline-no">&nbsp;</span>
1518
+ <span class="cline-any cline-no">&nbsp;</span>
1519
+ <span class="cline-any cline-no">&nbsp;</span>
1520
+ <span class="cline-any cline-no">&nbsp;</span>
1521
+ <span class="cline-any cline-no">&nbsp;</span>
1522
+ <span class="cline-any cline-no">&nbsp;</span>
1523
+ <span class="cline-any cline-no">&nbsp;</span>
1524
+ <span class="cline-any cline-no">&nbsp;</span>
1525
+ <span class="cline-any cline-no">&nbsp;</span>
1526
+ <span class="cline-any cline-no">&nbsp;</span>
1527
+ <span class="cline-any cline-no">&nbsp;</span>
1528
+ <span class="cline-any cline-no">&nbsp;</span>
1529
+ <span class="cline-any cline-no">&nbsp;</span>
1530
+ <span class="cline-any cline-no">&nbsp;</span>
1531
+ <span class="cline-any cline-no">&nbsp;</span>
1532
+ <span class="cline-any cline-no">&nbsp;</span>
1533
+ <span class="cline-any cline-no">&nbsp;</span>
1534
+ <span class="cline-any cline-no">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
1536
+ <span class="cline-any cline-no">&nbsp;</span>
1537
+ <span class="cline-any cline-no">&nbsp;</span>
1538
+ <span class="cline-any cline-no">&nbsp;</span>
1539
+ <span class="cline-any cline-no">&nbsp;</span>
1540
+ <span class="cline-any cline-no">&nbsp;</span>
1541
+ <span class="cline-any cline-no">&nbsp;</span>
1542
+ <span class="cline-any cline-no">&nbsp;</span>
1543
+ <span class="cline-any cline-no">&nbsp;</span>
1544
+ <span class="cline-any cline-no">&nbsp;</span>
1545
+ <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-no">&nbsp;</span>
1547
+ <span class="cline-any cline-no">&nbsp;</span>
1548
+ <span class="cline-any cline-no">&nbsp;</span>
1549
+ <span class="cline-any cline-no">&nbsp;</span>
1550
+ <span class="cline-any cline-no">&nbsp;</span>
1551
+ <span class="cline-any cline-no">&nbsp;</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-no">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-no">&nbsp;</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-no">&nbsp;</span>
1563
+ <span class="cline-any cline-no">&nbsp;</span>
1564
+ <span class="cline-any cline-no">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-no">&nbsp;</span>
1567
+ <span class="cline-any cline-no">&nbsp;</span>
1568
+ <span class="cline-any cline-no">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&nbsp;</span>
1570
+ <span class="cline-any cline-no">&nbsp;</span>
1571
+ <span class="cline-any cline-no">&nbsp;</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-no">&nbsp;</span>
1574
+ <span class="cline-any cline-no">&nbsp;</span>
1575
+ <span class="cline-any cline-no">&nbsp;</span>
1576
+ <span class="cline-any cline-no">&nbsp;</span>
1577
+ <span class="cline-any cline-no">&nbsp;</span>
1578
+ <span class="cline-any cline-no">&nbsp;</span>
1579
+ <span class="cline-any cline-no">&nbsp;</span>
1580
+ <span class="cline-any cline-no">&nbsp;</span>
1581
+ <span class="cline-any cline-no">&nbsp;</span>
1582
+ <span class="cline-any cline-no">&nbsp;</span>
1583
+ <span class="cline-any cline-no">&nbsp;</span>
1584
+ <span class="cline-any cline-no">&nbsp;</span>
1585
+ <span class="cline-any cline-no">&nbsp;</span>
1586
+ <span class="cline-any cline-no">&nbsp;</span>
1587
+ <span class="cline-any cline-no">&nbsp;</span>
1588
+ <span class="cline-any cline-no">&nbsp;</span>
1589
+ <span class="cline-any cline-no">&nbsp;</span>
1590
+ <span class="cline-any cline-no">&nbsp;</span>
1591
+ <span class="cline-any cline-no">&nbsp;</span>
1592
+ <span class="cline-any cline-no">&nbsp;</span>
1593
+ <span class="cline-any cline-no">&nbsp;</span>
1594
+ <span class="cline-any cline-no">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1596
+ <span class="cline-any cline-no">&nbsp;</span>
1597
+ <span class="cline-any cline-no">&nbsp;</span>
1598
+ <span class="cline-any cline-no">&nbsp;</span>
1599
+ <span class="cline-any cline-no">&nbsp;</span>
1600
+ <span class="cline-any cline-no">&nbsp;</span>
1601
+ <span class="cline-any cline-no">&nbsp;</span>
1602
+ <span class="cline-any cline-no">&nbsp;</span>
1603
+ <span class="cline-any cline-no">&nbsp;</span>
1604
+ <span class="cline-any cline-no">&nbsp;</span>
1605
+ <span class="cline-any cline-no">&nbsp;</span>
1606
+ <span class="cline-any cline-no">&nbsp;</span>
1607
+ <span class="cline-any cline-no">&nbsp;</span>
1608
+ <span class="cline-any cline-no">&nbsp;</span>
1609
+ <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-no">&nbsp;</span>
1611
+ <span class="cline-any cline-no">&nbsp;</span>
1612
+ <span class="cline-any cline-no">&nbsp;</span>
1613
+ <span class="cline-any cline-no">&nbsp;</span>
1614
+ <span class="cline-any cline-no">&nbsp;</span>
1615
+ <span class="cline-any cline-no">&nbsp;</span>
1616
+ <span class="cline-any cline-no">&nbsp;</span>
1617
+ <span class="cline-any cline-no">&nbsp;</span>
1618
+ <span class="cline-any cline-no">&nbsp;</span>
1619
+ <span class="cline-any cline-no">&nbsp;</span>
1620
+ <span class="cline-any cline-no">&nbsp;</span>
1621
+ <span class="cline-any cline-no">&nbsp;</span>
1622
+ <span class="cline-any cline-no">&nbsp;</span>
1623
+ <span class="cline-any cline-no">&nbsp;</span>
1624
+ <span class="cline-any cline-no">&nbsp;</span>
1625
+ <span class="cline-any cline-no">&nbsp;</span>
1626
+ <span class="cline-any cline-no">&nbsp;</span>
1627
+ <span class="cline-any cline-no">&nbsp;</span>
1628
+ <span class="cline-any cline-no">&nbsp;</span>
1629
+ <span class="cline-any cline-no">&nbsp;</span>
1630
+ <span class="cline-any cline-no">&nbsp;</span>
1631
+ <span class="cline-any cline-no">&nbsp;</span>
1632
+ <span class="cline-any cline-no">&nbsp;</span>
1633
+ <span class="cline-any cline-no">&nbsp;</span>
1634
+ <span class="cline-any cline-no">&nbsp;</span>
1635
+ <span class="cline-any cline-no">&nbsp;</span>
1636
+ <span class="cline-any cline-no">&nbsp;</span>
1637
+ <span class="cline-any cline-no">&nbsp;</span>
1638
+ <span class="cline-any cline-no">&nbsp;</span>
1639
+ <span class="cline-any cline-no">&nbsp;</span>
1640
+ <span class="cline-any cline-no">&nbsp;</span>
1641
+ <span class="cline-any cline-no">&nbsp;</span>
1642
+ <span class="cline-any cline-no">&nbsp;</span>
1643
+ <span class="cline-any cline-no">&nbsp;</span>
1644
+ <span class="cline-any cline-no">&nbsp;</span>
1645
+ <span class="cline-any cline-no">&nbsp;</span>
1646
+ <span class="cline-any cline-no">&nbsp;</span>
1647
+ <span class="cline-any cline-no">&nbsp;</span>
1648
+ <span class="cline-any cline-no">&nbsp;</span>
1649
+ <span class="cline-any cline-no">&nbsp;</span>
1650
+ <span class="cline-any cline-no">&nbsp;</span>
1651
+ <span class="cline-any cline-no">&nbsp;</span>
1652
+ <span class="cline-any cline-no">&nbsp;</span>
1653
+ <span class="cline-any cline-no">&nbsp;</span>
1654
+ <span class="cline-any cline-no">&nbsp;</span>
1655
+ <span class="cline-any cline-no">&nbsp;</span>
1656
+ <span class="cline-any cline-no">&nbsp;</span>
1657
+ <span class="cline-any cline-no">&nbsp;</span>
1658
+ <span class="cline-any cline-no">&nbsp;</span>
1659
+ <span class="cline-any cline-no">&nbsp;</span>
1660
+ <span class="cline-any cline-no">&nbsp;</span>
1661
+ <span class="cline-any cline-no">&nbsp;</span>
1662
+ <span class="cline-any cline-no">&nbsp;</span>
1663
+ <span class="cline-any cline-no">&nbsp;</span>
1664
+ <span class="cline-any cline-no">&nbsp;</span>
1665
+ <span class="cline-any cline-no">&nbsp;</span>
1666
+ <span class="cline-any cline-no">&nbsp;</span>
1667
+ <span class="cline-any cline-no">&nbsp;</span>
1668
+ <span class="cline-any cline-no">&nbsp;</span>
1669
+ <span class="cline-any cline-no">&nbsp;</span>
1670
+ <span class="cline-any cline-no">&nbsp;</span>
1671
+ <span class="cline-any cline-no">&nbsp;</span>
1672
+ <span class="cline-any cline-no">&nbsp;</span>
1673
+ <span class="cline-any cline-no">&nbsp;</span>
1674
+ <span class="cline-any cline-no">&nbsp;</span>
1675
+ <span class="cline-any cline-no">&nbsp;</span>
1676
+ <span class="cline-any cline-no">&nbsp;</span>
1677
+ <span class="cline-any cline-no">&nbsp;</span>
1678
+ <span class="cline-any cline-no">&nbsp;</span>
1679
+ <span class="cline-any cline-no">&nbsp;</span>
1680
+ <span class="cline-any cline-no">&nbsp;</span>
1681
+ <span class="cline-any cline-no">&nbsp;</span>
1682
+ <span class="cline-any cline-no">&nbsp;</span>
1683
+ <span class="cline-any cline-no">&nbsp;</span>
1684
+ <span class="cline-any cline-no">&nbsp;</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-no">&nbsp;</span>
1687
+ <span class="cline-any cline-no">&nbsp;</span>
1688
+ <span class="cline-any cline-no">&nbsp;</span>
1689
+ <span class="cline-any cline-no">&nbsp;</span>
1690
+ <span class="cline-any cline-no">&nbsp;</span>
1691
+ <span class="cline-any cline-no">&nbsp;</span>
1692
+ <span class="cline-any cline-no">&nbsp;</span>
1693
+ <span class="cline-any cline-no">&nbsp;</span>
1694
+ <span class="cline-any cline-no">&nbsp;</span>
1695
+ <span class="cline-any cline-no">&nbsp;</span>
1696
+ <span class="cline-any cline-no">&nbsp;</span>
1697
+ <span class="cline-any cline-no">&nbsp;</span>
1698
+ <span class="cline-any cline-no">&nbsp;</span>
1699
+ <span class="cline-any cline-no">&nbsp;</span>
1700
+ <span class="cline-any cline-no">&nbsp;</span>
1701
+ <span class="cline-any cline-no">&nbsp;</span>
1702
+ <span class="cline-any cline-no">&nbsp;</span>
1703
+ <span class="cline-any cline-no">&nbsp;</span>
1704
+ <span class="cline-any cline-no">&nbsp;</span>
1705
+ <span class="cline-any cline-no">&nbsp;</span>
1706
+ <span class="cline-any cline-no">&nbsp;</span>
1707
+ <span class="cline-any cline-no">&nbsp;</span>
1708
+ <span class="cline-any cline-no">&nbsp;</span>
1709
+ <span class="cline-any cline-no">&nbsp;</span>
1710
+ <span class="cline-any cline-no">&nbsp;</span>
1711
+ <span class="cline-any cline-no">&nbsp;</span>
1712
+ <span class="cline-any cline-no">&nbsp;</span>
1713
+ <span class="cline-any cline-no">&nbsp;</span>
1714
+ <span class="cline-any cline-no">&nbsp;</span>
1715
+ <span class="cline-any cline-no">&nbsp;</span>
1716
+ <span class="cline-any cline-no">&nbsp;</span>
1717
+ <span class="cline-any cline-no">&nbsp;</span>
1718
+ <span class="cline-any cline-no">&nbsp;</span>
1719
+ <span class="cline-any cline-no">&nbsp;</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-no">&nbsp;</span>
1722
+ <span class="cline-any cline-no">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-no">&nbsp;</span>
1725
+ <span class="cline-any cline-no">&nbsp;</span>
1726
+ <span class="cline-any cline-no">&nbsp;</span>
1727
+ <span class="cline-any cline-no">&nbsp;</span>
1728
+ <span class="cline-any cline-no">&nbsp;</span>
1729
+ <span class="cline-any cline-no">&nbsp;</span>
1730
+ <span class="cline-any cline-no">&nbsp;</span>
1731
+ <span class="cline-any cline-no">&nbsp;</span>
1732
+ <span class="cline-any cline-no">&nbsp;</span>
1733
+ <span class="cline-any cline-no">&nbsp;</span>
1734
+ <span class="cline-any cline-no">&nbsp;</span>
1735
+ <span class="cline-any cline-no">&nbsp;</span>
1736
+ <span class="cline-any cline-no">&nbsp;</span>
1737
+ <span class="cline-any cline-no">&nbsp;</span>
1738
+ <span class="cline-any cline-no">&nbsp;</span>
1739
+ <span class="cline-any cline-no">&nbsp;</span>
1740
+ <span class="cline-any cline-no">&nbsp;</span>
1741
+ <span class="cline-any cline-no">&nbsp;</span>
1742
+ <span class="cline-any cline-no">&nbsp;</span>
1743
+ <span class="cline-any cline-no">&nbsp;</span>
1744
+ <span class="cline-any cline-no">&nbsp;</span>
1745
+ <span class="cline-any cline-no">&nbsp;</span>
1746
+ <span class="cline-any cline-no">&nbsp;</span>
1747
+ <span class="cline-any cline-no">&nbsp;</span>
1748
+ <span class="cline-any cline-no">&nbsp;</span>
1749
+ <span class="cline-any cline-no">&nbsp;</span>
1750
+ <span class="cline-any cline-no">&nbsp;</span>
1751
+ <span class="cline-any cline-no">&nbsp;</span>
1752
+ <span class="cline-any cline-no">&nbsp;</span>
1753
+ <span class="cline-any cline-no">&nbsp;</span>
1754
+ <span class="cline-any cline-no">&nbsp;</span>
1755
+ <span class="cline-any cline-no">&nbsp;</span>
1756
+ <span class="cline-any cline-no">&nbsp;</span>
1757
+ <span class="cline-any cline-no">&nbsp;</span>
1758
+ <span class="cline-any cline-no">&nbsp;</span>
1759
+ <span class="cline-any cline-no">&nbsp;</span>
1760
+ <span class="cline-any cline-no">&nbsp;</span>
1761
+ <span class="cline-any cline-no">&nbsp;</span>
1762
+ <span class="cline-any cline-no">&nbsp;</span>
1763
+ <span class="cline-any cline-no">&nbsp;</span>
1764
+ <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-no">&nbsp;</span>
1766
+ <span class="cline-any cline-no">&nbsp;</span>
1767
+ <span class="cline-any cline-no">&nbsp;</span>
1768
+ <span class="cline-any cline-no">&nbsp;</span>
1769
+ <span class="cline-any cline-no">&nbsp;</span>
1770
+ <span class="cline-any cline-no">&nbsp;</span>
1771
+ <span class="cline-any cline-no">&nbsp;</span>
1772
+ <span class="cline-any cline-no">&nbsp;</span>
1773
+ <span class="cline-any cline-no">&nbsp;</span>
1774
+ <span class="cline-any cline-no">&nbsp;</span>
1775
+ <span class="cline-any cline-no">&nbsp;</span>
1776
+ <span class="cline-any cline-no">&nbsp;</span>
1777
+ <span class="cline-any cline-no">&nbsp;</span>
1778
+ <span class="cline-any cline-no">&nbsp;</span>
1779
+ <span class="cline-any cline-no">&nbsp;</span>
1780
+ <span class="cline-any cline-no">&nbsp;</span>
1781
+ <span class="cline-any cline-no">&nbsp;</span>
1782
+ <span class="cline-any cline-no">&nbsp;</span>
1783
+ <span class="cline-any cline-no">&nbsp;</span>
1784
+ <span class="cline-any cline-no">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-no">&nbsp;</span>
1788
+ <span class="cline-any cline-no">&nbsp;</span>
1789
+ <span class="cline-any cline-no">&nbsp;</span>
1790
+ <span class="cline-any cline-no">&nbsp;</span>
1791
+ <span class="cline-any cline-no">&nbsp;</span>
1792
+ <span class="cline-any cline-no">&nbsp;</span>
1793
+ <span class="cline-any cline-no">&nbsp;</span>
1794
+ <span class="cline-any cline-no">&nbsp;</span>
1795
+ <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-no">&nbsp;</span>
1797
+ <span class="cline-any cline-no">&nbsp;</span>
1798
+ <span class="cline-any cline-no">&nbsp;</span>
1799
+ <span class="cline-any cline-no">&nbsp;</span>
1800
+ <span class="cline-any cline-no">&nbsp;</span>
1801
+ <span class="cline-any cline-no">&nbsp;</span>
1802
+ <span class="cline-any cline-no">&nbsp;</span>
1803
+ <span class="cline-any cline-no">&nbsp;</span>
1804
+ <span class="cline-any cline-no">&nbsp;</span>
1805
+ <span class="cline-any cline-no">&nbsp;</span>
1806
+ <span class="cline-any cline-no">&nbsp;</span>
1807
+ <span class="cline-any cline-no">&nbsp;</span>
1808
+ <span class="cline-any cline-no">&nbsp;</span>
1809
+ <span class="cline-any cline-no">&nbsp;</span>
1810
+ <span class="cline-any cline-no">&nbsp;</span>
1811
+ <span class="cline-any cline-no">&nbsp;</span>
1812
+ <span class="cline-any cline-no">&nbsp;</span>
1813
+ <span class="cline-any cline-no">&nbsp;</span>
1814
+ <span class="cline-any cline-no">&nbsp;</span>
1815
+ <span class="cline-any cline-no">&nbsp;</span>
1816
+ <span class="cline-any cline-no">&nbsp;</span>
1817
+ <span class="cline-any cline-no">&nbsp;</span>
1818
+ <span class="cline-any cline-no">&nbsp;</span>
1819
+ <span class="cline-any cline-no">&nbsp;</span>
1820
+ <span class="cline-any cline-no">&nbsp;</span>
1821
+ <span class="cline-any cline-no">&nbsp;</span>
1822
+ <span class="cline-any cline-no">&nbsp;</span>
1823
+ <span class="cline-any cline-no">&nbsp;</span>
1824
+ <span class="cline-any cline-no">&nbsp;</span>
1825
+ <span class="cline-any cline-no">&nbsp;</span>
1826
+ <span class="cline-any cline-no">&nbsp;</span>
1827
+ <span class="cline-any cline-no">&nbsp;</span>
1828
+ <span class="cline-any cline-no">&nbsp;</span>
1829
+ <span class="cline-any cline-no">&nbsp;</span>
1830
+ <span class="cline-any cline-no">&nbsp;</span>
1831
+ <span class="cline-any cline-no">&nbsp;</span>
1832
+ <span class="cline-any cline-no">&nbsp;</span>
1833
+ <span class="cline-any cline-no">&nbsp;</span>
1834
+ <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>
1835
+ <span class="cstat-no" title="statement not covered" > * V3 AgentDB Adapter</span>
1836
+ <span class="cstat-no" title="statement not covered" > *</span>
1837
+ <span class="cstat-no" title="statement not covered" > * Unified memory backend implementation using AgentDB with HNSW indexing</span>
1838
+ <span class="cstat-no" title="statement not covered" > * for 150x-12,500x faster vector search. Implements IMemoryBackend interface.</span>
1839
+ <span class="cstat-no" title="statement not covered" > *</span>
1840
+ <span class="cstat-no" title="statement not covered" > * @module v3/memory/agentdb-adapter</span>
1841
+ <span class="cstat-no" title="statement not covered" > */</span>
1842
+ <span class="cstat-no" title="statement not covered" ></span>
1843
+ <span class="cstat-no" title="statement not covered" >import { EventEmitter } from 'node:events';</span>
1844
+ <span class="cstat-no" title="statement not covered" >import {</span>
1845
+ <span class="cstat-no" title="statement not covered" > IMemoryBackend,</span>
1846
+ <span class="cstat-no" title="statement not covered" > MemoryEntry,</span>
1847
+ <span class="cstat-no" title="statement not covered" > MemoryEntryInput,</span>
1848
+ <span class="cstat-no" title="statement not covered" > MemoryEntryUpdate,</span>
1849
+ <span class="cstat-no" title="statement not covered" > MemoryQuery,</span>
1850
+ <span class="cstat-no" title="statement not covered" > SearchOptions,</span>
1851
+ <span class="cstat-no" title="statement not covered" > SearchResult,</span>
1852
+ <span class="cstat-no" title="statement not covered" > BackendStats,</span>
1853
+ <span class="cstat-no" title="statement not covered" > HealthCheckResult,</span>
1854
+ <span class="cstat-no" title="statement not covered" > ComponentHealth,</span>
1855
+ <span class="cstat-no" title="statement not covered" > MemoryType,</span>
1856
+ <span class="cstat-no" title="statement not covered" > EmbeddingGenerator,</span>
1857
+ <span class="cstat-no" title="statement not covered" > generateMemoryId,</span>
1858
+ <span class="cstat-no" title="statement not covered" > createDefaultEntry,</span>
1859
+ <span class="cstat-no" title="statement not covered" > CacheStats,</span>
1860
+ <span class="cstat-no" title="statement not covered" > HNSWStats,</span>
1861
+ <span class="cstat-no" title="statement not covered" >} from './types.js';</span>
1862
+ <span class="cstat-no" title="statement not covered" >import { HNSWIndex } from './hnsw-index.js';</span>
1863
+ <span class="cstat-no" title="statement not covered" >import { CacheManager } from './cache-manager.js';</span>
1864
+ <span class="cstat-no" title="statement not covered" ></span>
1865
+ <span class="cstat-no" title="statement not covered" >/**</span>
1866
+ <span class="cstat-no" title="statement not covered" > * Configuration for AgentDB Adapter</span>
1867
+ <span class="cstat-no" title="statement not covered" > */</span>
1868
+ <span class="cstat-no" title="statement not covered" >export interface AgentDBAdapterConfig {</span>
1869
+ <span class="cstat-no" title="statement not covered" > /** Vector dimensions for embeddings (default: 1536 for OpenAI) */</span>
1870
+ <span class="cstat-no" title="statement not covered" > dimensions: number;</span>
1871
+ <span class="cstat-no" title="statement not covered" ></span>
1872
+ <span class="cstat-no" title="statement not covered" > /** Maximum number of entries */</span>
1873
+ <span class="cstat-no" title="statement not covered" > maxEntries: number;</span>
1874
+ <span class="cstat-no" title="statement not covered" ></span>
1875
+ <span class="cstat-no" title="statement not covered" > /** Enable caching */</span>
1876
+ <span class="cstat-no" title="statement not covered" > cacheEnabled: boolean;</span>
1877
+ <span class="cstat-no" title="statement not covered" ></span>
1878
+ <span class="cstat-no" title="statement not covered" > /** Maximum cache size */</span>
1879
+ <span class="cstat-no" title="statement not covered" > cacheSize: number;</span>
1880
+ <span class="cstat-no" title="statement not covered" ></span>
1881
+ <span class="cstat-no" title="statement not covered" > /** Cache TTL in milliseconds */</span>
1882
+ <span class="cstat-no" title="statement not covered" > cacheTtl: number;</span>
1883
+ <span class="cstat-no" title="statement not covered" ></span>
1884
+ <span class="cstat-no" title="statement not covered" > /** HNSW M parameter (max connections per layer) */</span>
1885
+ <span class="cstat-no" title="statement not covered" > hnswM: number;</span>
1886
+ <span class="cstat-no" title="statement not covered" ></span>
1887
+ <span class="cstat-no" title="statement not covered" > /** HNSW efConstruction parameter */</span>
1888
+ <span class="cstat-no" title="statement not covered" > hnswEfConstruction: number;</span>
1889
+ <span class="cstat-no" title="statement not covered" ></span>
1890
+ <span class="cstat-no" title="statement not covered" > /** Default namespace */</span>
1891
+ <span class="cstat-no" title="statement not covered" > defaultNamespace: string;</span>
1892
+ <span class="cstat-no" title="statement not covered" ></span>
1893
+ <span class="cstat-no" title="statement not covered" > /** Embedding generator function */</span>
1894
+ <span class="cstat-no" title="statement not covered" > embeddingGenerator?: EmbeddingGenerator;</span>
1895
+ <span class="cstat-no" title="statement not covered" ></span>
1896
+ <span class="cstat-no" title="statement not covered" > /** Enable persistence to disk */</span>
1897
+ <span class="cstat-no" title="statement not covered" > persistenceEnabled: boolean;</span>
1898
+ <span class="cstat-no" title="statement not covered" ></span>
1899
+ <span class="cstat-no" title="statement not covered" > /** Persistence path */</span>
1900
+ <span class="cstat-no" title="statement not covered" > persistencePath?: string;</span>
1901
+ <span class="cstat-no" title="statement not covered" >}</span>
1902
+ <span class="cstat-no" title="statement not covered" ></span>
1903
+ <span class="cstat-no" title="statement not covered" >/**</span>
1904
+ <span class="cstat-no" title="statement not covered" > * Default configuration values</span>
1905
+ <span class="cstat-no" title="statement not covered" > */</span>
1906
+ <span class="cstat-no" title="statement not covered" >const DEFAULT_CONFIG: AgentDBAdapterConfig = {</span>
1907
+ <span class="cstat-no" title="statement not covered" > dimensions: 1536,</span>
1908
+ <span class="cstat-no" title="statement not covered" > maxEntries: 1000000,</span>
1909
+ <span class="cstat-no" title="statement not covered" > cacheEnabled: true,</span>
1910
+ <span class="cstat-no" title="statement not covered" > cacheSize: 10000,</span>
1911
+ <span class="cstat-no" title="statement not covered" > cacheTtl: 300000, // 5 minutes</span>
1912
+ <span class="cstat-no" title="statement not covered" > hnswM: 16,</span>
1913
+ <span class="cstat-no" title="statement not covered" > hnswEfConstruction: 200,</span>
1914
+ <span class="cstat-no" title="statement not covered" > defaultNamespace: 'default',</span>
1915
+ <span class="cstat-no" title="statement not covered" > persistenceEnabled: false,</span>
1916
+ <span class="cstat-no" title="statement not covered" >};</span>
1917
+ <span class="cstat-no" title="statement not covered" ></span>
1918
+ <span class="cstat-no" title="statement not covered" >/**</span>
1919
+ <span class="cstat-no" title="statement not covered" > * AgentDB Memory Backend Adapter</span>
1920
+ <span class="cstat-no" title="statement not covered" > *</span>
1921
+ <span class="cstat-no" title="statement not covered" > * Provides unified memory storage with:</span>
1922
+ <span class="cstat-no" title="statement not covered" > * - HNSW-based vector search (150x-12,500x faster than brute force)</span>
1923
+ <span class="cstat-no" title="statement not covered" > * - LRU caching with TTL support</span>
1924
+ <span class="cstat-no" title="statement not covered" > * - Namespace-based organization</span>
1925
+ <span class="cstat-no" title="statement not covered" > * - Full-text and metadata filtering</span>
1926
+ <span class="cstat-no" title="statement not covered" > * - Event-driven architecture</span>
1927
+ <span class="cstat-no" title="statement not covered" > */</span>
1928
+ <span class="cstat-no" title="statement not covered" >export class AgentDBAdapter extends EventEmitter implements IMemoryBackend {</span>
1929
+ <span class="cstat-no" title="statement not covered" > private config: AgentDBAdapterConfig;</span>
1930
+ <span class="cstat-no" title="statement not covered" > private entries: Map&lt;string, MemoryEntry&gt; = new Map();</span>
1931
+ <span class="cstat-no" title="statement not covered" > private index: HNSWIndex;</span>
1932
+ <span class="cstat-no" title="statement not covered" > private cache: CacheManager&lt;MemoryEntry&gt;;</span>
1933
+ <span class="cstat-no" title="statement not covered" > private namespaceIndex: Map&lt;string, Set&lt;string&gt;&gt; = new Map();</span>
1934
+ <span class="cstat-no" title="statement not covered" > private keyIndex: Map&lt;string, string&gt; = new Map(); // namespace:key -&gt; id</span>
1935
+ <span class="cstat-no" title="statement not covered" > private tagIndex: Map&lt;string, Set&lt;string&gt;&gt; = new Map();</span>
1936
+ <span class="cstat-no" title="statement not covered" > private initialized: boolean = false;</span>
1937
+ <span class="cstat-no" title="statement not covered" ></span>
1938
+ <span class="cstat-no" title="statement not covered" > // Performance tracking</span>
1939
+ <span class="cstat-no" title="statement not covered" > private stats = {</span>
1940
+ <span class="cstat-no" title="statement not covered" > queryCount: 0,</span>
1941
+ <span class="cstat-no" title="statement not covered" > totalQueryTime: 0,</span>
1942
+ <span class="cstat-no" title="statement not covered" > searchCount: 0,</span>
1943
+ <span class="cstat-no" title="statement not covered" > totalSearchTime: 0,</span>
1944
+ <span class="cstat-no" title="statement not covered" > writeCount: 0,</span>
1945
+ <span class="cstat-no" title="statement not covered" > totalWriteTime: 0,</span>
1946
+ <span class="cstat-no" title="statement not covered" > };</span>
1947
+ <span class="cstat-no" title="statement not covered" ></span>
1948
+ <span class="cstat-no" title="statement not covered" > constructor(config: Partial&lt;AgentDBAdapterConfig&gt; = {}) {</span>
1949
+ <span class="cstat-no" title="statement not covered" > super();</span>
1950
+ <span class="cstat-no" title="statement not covered" > this.config = { ...DEFAULT_CONFIG, ...config };</span>
1951
+ <span class="cstat-no" title="statement not covered" ></span>
1952
+ <span class="cstat-no" title="statement not covered" > // Initialize HNSW index</span>
1953
+ <span class="cstat-no" title="statement not covered" > this.index = new HNSWIndex({</span>
1954
+ <span class="cstat-no" title="statement not covered" > dimensions: this.config.dimensions,</span>
1955
+ <span class="cstat-no" title="statement not covered" > M: this.config.hnswM,</span>
1956
+ <span class="cstat-no" title="statement not covered" > efConstruction: this.config.hnswEfConstruction,</span>
1957
+ <span class="cstat-no" title="statement not covered" > maxElements: this.config.maxEntries,</span>
1958
+ <span class="cstat-no" title="statement not covered" > metric: 'cosine',</span>
1959
+ <span class="cstat-no" title="statement not covered" > });</span>
1960
+ <span class="cstat-no" title="statement not covered" ></span>
1961
+ <span class="cstat-no" title="statement not covered" > // Initialize cache</span>
1962
+ <span class="cstat-no" title="statement not covered" > this.cache = new CacheManager&lt;MemoryEntry&gt;({</span>
1963
+ <span class="cstat-no" title="statement not covered" > maxSize: this.config.cacheSize,</span>
1964
+ <span class="cstat-no" title="statement not covered" > ttl: this.config.cacheTtl,</span>
1965
+ <span class="cstat-no" title="statement not covered" > lruEnabled: true,</span>
1966
+ <span class="cstat-no" title="statement not covered" > });</span>
1967
+ <span class="cstat-no" title="statement not covered" ></span>
1968
+ <span class="cstat-no" title="statement not covered" > // Forward events</span>
1969
+ <span class="cstat-no" title="statement not covered" > this.index.on('point:added', (data) =&gt; this.emit('index:added', data));</span>
1970
+ <span class="cstat-no" title="statement not covered" > this.cache.on('cache:hit', (data) =&gt; this.emit('cache:hit', data));</span>
1971
+ <span class="cstat-no" title="statement not covered" > this.cache.on('cache:miss', (data) =&gt; this.emit('cache:miss', data));</span>
1972
+ <span class="cstat-no" title="statement not covered" > }</span>
1973
+ <span class="cstat-no" title="statement not covered" ></span>
1974
+ <span class="cstat-no" title="statement not covered" > /**</span>
1975
+ <span class="cstat-no" title="statement not covered" > * Initialize the adapter</span>
1976
+ <span class="cstat-no" title="statement not covered" > */</span>
1977
+ <span class="cstat-no" title="statement not covered" > async initialize(): Promise&lt;void&gt; {</span>
1978
+ <span class="cstat-no" title="statement not covered" > if (this.initialized) return;</span>
1979
+ <span class="cstat-no" title="statement not covered" ></span>
1980
+ <span class="cstat-no" title="statement not covered" > // Load persisted data if enabled</span>
1981
+ <span class="cstat-no" title="statement not covered" > if (this.config.persistenceEnabled &amp;&amp; this.config.persistencePath) {</span>
1982
+ <span class="cstat-no" title="statement not covered" > await this.loadFromDisk();</span>
1983
+ <span class="cstat-no" title="statement not covered" > }</span>
1984
+ <span class="cstat-no" title="statement not covered" ></span>
1985
+ <span class="cstat-no" title="statement not covered" > this.initialized = true;</span>
1986
+ <span class="cstat-no" title="statement not covered" > this.emit('initialized');</span>
1987
+ <span class="cstat-no" title="statement not covered" > }</span>
1988
+ <span class="cstat-no" title="statement not covered" ></span>
1989
+ <span class="cstat-no" title="statement not covered" > /**</span>
1990
+ <span class="cstat-no" title="statement not covered" > * Shutdown the adapter</span>
1991
+ <span class="cstat-no" title="statement not covered" > */</span>
1992
+ <span class="cstat-no" title="statement not covered" > async shutdown(): Promise&lt;void&gt; {</span>
1993
+ <span class="cstat-no" title="statement not covered" > if (!this.initialized) return;</span>
1994
+ <span class="cstat-no" title="statement not covered" ></span>
1995
+ <span class="cstat-no" title="statement not covered" > // Persist data if enabled</span>
1996
+ <span class="cstat-no" title="statement not covered" > if (this.config.persistenceEnabled &amp;&amp; this.config.persistencePath) {</span>
1997
+ <span class="cstat-no" title="statement not covered" > await this.saveToDisk();</span>
1998
+ <span class="cstat-no" title="statement not covered" > }</span>
1999
+ <span class="cstat-no" title="statement not covered" ></span>
2000
+ <span class="cstat-no" title="statement not covered" > this.cache.shutdown();</span>
2001
+ <span class="cstat-no" title="statement not covered" > this.initialized = false;</span>
2002
+ <span class="cstat-no" title="statement not covered" > this.emit('shutdown');</span>
2003
+ <span class="cstat-no" title="statement not covered" > }</span>
2004
+ <span class="cstat-no" title="statement not covered" ></span>
2005
+ <span class="cstat-no" title="statement not covered" > /**</span>
2006
+ <span class="cstat-no" title="statement not covered" > * Store a memory entry</span>
2007
+ <span class="cstat-no" title="statement not covered" > */</span>
2008
+ <span class="cstat-no" title="statement not covered" > async store(entry: MemoryEntry): Promise&lt;void&gt; {</span>
2009
+ <span class="cstat-no" title="statement not covered" > const startTime = performance.now();</span>
2010
+ <span class="cstat-no" title="statement not covered" ></span>
2011
+ <span class="cstat-no" title="statement not covered" > // Generate embedding if content provided but no embedding</span>
2012
+ <span class="cstat-no" title="statement not covered" > if (entry.content &amp;&amp; !entry.embedding &amp;&amp; this.config.embeddingGenerator) {</span>
2013
+ <span class="cstat-no" title="statement not covered" > entry.embedding = await this.config.embeddingGenerator(entry.content);</span>
2014
+ <span class="cstat-no" title="statement not covered" > }</span>
2015
+ <span class="cstat-no" title="statement not covered" ></span>
2016
+ <span class="cstat-no" title="statement not covered" > // Store in main storage</span>
2017
+ <span class="cstat-no" title="statement not covered" > this.entries.set(entry.id, entry);</span>
2018
+ <span class="cstat-no" title="statement not covered" ></span>
2019
+ <span class="cstat-no" title="statement not covered" > // Update namespace index</span>
2020
+ <span class="cstat-no" title="statement not covered" > const namespace = entry.namespace || this.config.defaultNamespace;</span>
2021
+ <span class="cstat-no" title="statement not covered" > if (!this.namespaceIndex.has(namespace)) {</span>
2022
+ <span class="cstat-no" title="statement not covered" > this.namespaceIndex.set(namespace, new Set());</span>
2023
+ <span class="cstat-no" title="statement not covered" > }</span>
2024
+ <span class="cstat-no" title="statement not covered" > this.namespaceIndex.get(namespace)!.add(entry.id);</span>
2025
+ <span class="cstat-no" title="statement not covered" ></span>
2026
+ <span class="cstat-no" title="statement not covered" > // Update key index</span>
2027
+ <span class="cstat-no" title="statement not covered" > const keyIndexKey = `${namespace}:${entry.key}`;</span>
2028
+ <span class="cstat-no" title="statement not covered" > this.keyIndex.set(keyIndexKey, entry.id);</span>
2029
+ <span class="cstat-no" title="statement not covered" ></span>
2030
+ <span class="cstat-no" title="statement not covered" > // Update tag index</span>
2031
+ <span class="cstat-no" title="statement not covered" > for (const tag of entry.tags) {</span>
2032
+ <span class="cstat-no" title="statement not covered" > if (!this.tagIndex.has(tag)) {</span>
2033
+ <span class="cstat-no" title="statement not covered" > this.tagIndex.set(tag, new Set());</span>
2034
+ <span class="cstat-no" title="statement not covered" > }</span>
2035
+ <span class="cstat-no" title="statement not covered" > this.tagIndex.get(tag)!.add(entry.id);</span>
2036
+ <span class="cstat-no" title="statement not covered" > }</span>
2037
+ <span class="cstat-no" title="statement not covered" ></span>
2038
+ <span class="cstat-no" title="statement not covered" > // Index embedding if available</span>
2039
+ <span class="cstat-no" title="statement not covered" > if (entry.embedding) {</span>
2040
+ <span class="cstat-no" title="statement not covered" > await this.index.addPoint(entry.id, entry.embedding);</span>
2041
+ <span class="cstat-no" title="statement not covered" > }</span>
2042
+ <span class="cstat-no" title="statement not covered" ></span>
2043
+ <span class="cstat-no" title="statement not covered" > // Update cache</span>
2044
+ <span class="cstat-no" title="statement not covered" > if (this.config.cacheEnabled) {</span>
2045
+ <span class="cstat-no" title="statement not covered" > this.cache.set(entry.id, entry);</span>
2046
+ <span class="cstat-no" title="statement not covered" > }</span>
2047
+ <span class="cstat-no" title="statement not covered" ></span>
2048
+ <span class="cstat-no" title="statement not covered" > const duration = performance.now() - startTime;</span>
2049
+ <span class="cstat-no" title="statement not covered" > this.stats.writeCount++;</span>
2050
+ <span class="cstat-no" title="statement not covered" > this.stats.totalWriteTime += duration;</span>
2051
+ <span class="cstat-no" title="statement not covered" ></span>
2052
+ <span class="cstat-no" title="statement not covered" > this.emit('entry:stored', { id: entry.id, duration });</span>
2053
+ <span class="cstat-no" title="statement not covered" > }</span>
2054
+ <span class="cstat-no" title="statement not covered" ></span>
2055
+ <span class="cstat-no" title="statement not covered" > /**</span>
2056
+ <span class="cstat-no" title="statement not covered" > * Get a memory entry by ID</span>
2057
+ <span class="cstat-no" title="statement not covered" > */</span>
2058
+ <span class="cstat-no" title="statement not covered" > async get(id: string): Promise&lt;MemoryEntry | null&gt; {</span>
2059
+ <span class="cstat-no" title="statement not covered" > // Check cache first</span>
2060
+ <span class="cstat-no" title="statement not covered" > if (this.config.cacheEnabled) {</span>
2061
+ <span class="cstat-no" title="statement not covered" > const cached = this.cache.get(id);</span>
2062
+ <span class="cstat-no" title="statement not covered" > if (cached) {</span>
2063
+ <span class="cstat-no" title="statement not covered" > this.updateAccessStats(cached);</span>
2064
+ <span class="cstat-no" title="statement not covered" > return cached;</span>
2065
+ <span class="cstat-no" title="statement not covered" > }</span>
2066
+ <span class="cstat-no" title="statement not covered" > }</span>
2067
+ <span class="cstat-no" title="statement not covered" ></span>
2068
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2069
+ <span class="cstat-no" title="statement not covered" > if (entry) {</span>
2070
+ <span class="cstat-no" title="statement not covered" > this.updateAccessStats(entry);</span>
2071
+ <span class="cstat-no" title="statement not covered" > if (this.config.cacheEnabled) {</span>
2072
+ <span class="cstat-no" title="statement not covered" > this.cache.set(id, entry);</span>
2073
+ <span class="cstat-no" title="statement not covered" > }</span>
2074
+ <span class="cstat-no" title="statement not covered" > }</span>
2075
+ <span class="cstat-no" title="statement not covered" ></span>
2076
+ <span class="cstat-no" title="statement not covered" > return entry || null;</span>
2077
+ <span class="cstat-no" title="statement not covered" > }</span>
2078
+ <span class="cstat-no" title="statement not covered" ></span>
2079
+ <span class="cstat-no" title="statement not covered" > /**</span>
2080
+ <span class="cstat-no" title="statement not covered" > * Get a memory entry by key within a namespace</span>
2081
+ <span class="cstat-no" title="statement not covered" > */</span>
2082
+ <span class="cstat-no" title="statement not covered" > async getByKey(namespace: string, key: string): Promise&lt;MemoryEntry | null&gt; {</span>
2083
+ <span class="cstat-no" title="statement not covered" > const keyIndexKey = `${namespace}:${key}`;</span>
2084
+ <span class="cstat-no" title="statement not covered" > const id = this.keyIndex.get(keyIndexKey);</span>
2085
+ <span class="cstat-no" title="statement not covered" > if (!id) return null;</span>
2086
+ <span class="cstat-no" title="statement not covered" > return this.get(id);</span>
2087
+ <span class="cstat-no" title="statement not covered" > }</span>
2088
+ <span class="cstat-no" title="statement not covered" ></span>
2089
+ <span class="cstat-no" title="statement not covered" > /**</span>
2090
+ <span class="cstat-no" title="statement not covered" > * Update a memory entry</span>
2091
+ <span class="cstat-no" title="statement not covered" > */</span>
2092
+ <span class="cstat-no" title="statement not covered" > async update(id: string, update: MemoryEntryUpdate): Promise&lt;MemoryEntry | null&gt; {</span>
2093
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2094
+ <span class="cstat-no" title="statement not covered" > if (!entry) return null;</span>
2095
+ <span class="cstat-no" title="statement not covered" ></span>
2096
+ <span class="cstat-no" title="statement not covered" > // Apply updates</span>
2097
+ <span class="cstat-no" title="statement not covered" > if (update.content !== undefined) {</span>
2098
+ <span class="cstat-no" title="statement not covered" > entry.content = update.content;</span>
2099
+ <span class="cstat-no" title="statement not covered" > // Regenerate embedding if content changed</span>
2100
+ <span class="cstat-no" title="statement not covered" > if (this.config.embeddingGenerator) {</span>
2101
+ <span class="cstat-no" title="statement not covered" > entry.embedding = await this.config.embeddingGenerator(entry.content);</span>
2102
+ <span class="cstat-no" title="statement not covered" > // Re-index</span>
2103
+ <span class="cstat-no" title="statement not covered" > await this.index.removePoint(id);</span>
2104
+ <span class="cstat-no" title="statement not covered" > await this.index.addPoint(id, entry.embedding);</span>
2105
+ <span class="cstat-no" title="statement not covered" > }</span>
2106
+ <span class="cstat-no" title="statement not covered" > }</span>
2107
+ <span class="cstat-no" title="statement not covered" ></span>
2108
+ <span class="cstat-no" title="statement not covered" > if (update.tags !== undefined) {</span>
2109
+ <span class="cstat-no" title="statement not covered" > // Update tag index</span>
2110
+ <span class="cstat-no" title="statement not covered" > for (const oldTag of entry.tags) {</span>
2111
+ <span class="cstat-no" title="statement not covered" > this.tagIndex.get(oldTag)?.delete(id);</span>
2112
+ <span class="cstat-no" title="statement not covered" > }</span>
2113
+ <span class="cstat-no" title="statement not covered" > entry.tags = update.tags;</span>
2114
+ <span class="cstat-no" title="statement not covered" > for (const newTag of update.tags) {</span>
2115
+ <span class="cstat-no" title="statement not covered" > if (!this.tagIndex.has(newTag)) {</span>
2116
+ <span class="cstat-no" title="statement not covered" > this.tagIndex.set(newTag, new Set());</span>
2117
+ <span class="cstat-no" title="statement not covered" > }</span>
2118
+ <span class="cstat-no" title="statement not covered" > this.tagIndex.get(newTag)!.add(id);</span>
2119
+ <span class="cstat-no" title="statement not covered" > }</span>
2120
+ <span class="cstat-no" title="statement not covered" > }</span>
2121
+ <span class="cstat-no" title="statement not covered" ></span>
2122
+ <span class="cstat-no" title="statement not covered" > if (update.metadata !== undefined) {</span>
2123
+ <span class="cstat-no" title="statement not covered" > entry.metadata = { ...entry.metadata, ...update.metadata };</span>
2124
+ <span class="cstat-no" title="statement not covered" > }</span>
2125
+ <span class="cstat-no" title="statement not covered" ></span>
2126
+ <span class="cstat-no" title="statement not covered" > if (update.accessLevel !== undefined) {</span>
2127
+ <span class="cstat-no" title="statement not covered" > entry.accessLevel = update.accessLevel;</span>
2128
+ <span class="cstat-no" title="statement not covered" > }</span>
2129
+ <span class="cstat-no" title="statement not covered" ></span>
2130
+ <span class="cstat-no" title="statement not covered" > if (update.expiresAt !== undefined) {</span>
2131
+ <span class="cstat-no" title="statement not covered" > entry.expiresAt = update.expiresAt;</span>
2132
+ <span class="cstat-no" title="statement not covered" > }</span>
2133
+ <span class="cstat-no" title="statement not covered" ></span>
2134
+ <span class="cstat-no" title="statement not covered" > if (update.references !== undefined) {</span>
2135
+ <span class="cstat-no" title="statement not covered" > entry.references = update.references;</span>
2136
+ <span class="cstat-no" title="statement not covered" > }</span>
2137
+ <span class="cstat-no" title="statement not covered" ></span>
2138
+ <span class="cstat-no" title="statement not covered" > entry.updatedAt = Date.now();</span>
2139
+ <span class="cstat-no" title="statement not covered" > entry.version++;</span>
2140
+ <span class="cstat-no" title="statement not covered" ></span>
2141
+ <span class="cstat-no" title="statement not covered" > // Update cache</span>
2142
+ <span class="cstat-no" title="statement not covered" > if (this.config.cacheEnabled) {</span>
2143
+ <span class="cstat-no" title="statement not covered" > this.cache.set(id, entry);</span>
2144
+ <span class="cstat-no" title="statement not covered" > }</span>
2145
+ <span class="cstat-no" title="statement not covered" ></span>
2146
+ <span class="cstat-no" title="statement not covered" > this.emit('entry:updated', { id });</span>
2147
+ <span class="cstat-no" title="statement not covered" > return entry;</span>
2148
+ <span class="cstat-no" title="statement not covered" > }</span>
2149
+ <span class="cstat-no" title="statement not covered" ></span>
2150
+ <span class="cstat-no" title="statement not covered" > /**</span>
2151
+ <span class="cstat-no" title="statement not covered" > * Delete a memory entry</span>
2152
+ <span class="cstat-no" title="statement not covered" > */</span>
2153
+ <span class="cstat-no" title="statement not covered" > async delete(id: string): Promise&lt;boolean&gt; {</span>
2154
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2155
+ <span class="cstat-no" title="statement not covered" > if (!entry) return false;</span>
2156
+ <span class="cstat-no" title="statement not covered" ></span>
2157
+ <span class="cstat-no" title="statement not covered" > // Remove from main storage</span>
2158
+ <span class="cstat-no" title="statement not covered" > this.entries.delete(id);</span>
2159
+ <span class="cstat-no" title="statement not covered" ></span>
2160
+ <span class="cstat-no" title="statement not covered" > // Remove from namespace index</span>
2161
+ <span class="cstat-no" title="statement not covered" > this.namespaceIndex.get(entry.namespace)?.delete(id);</span>
2162
+ <span class="cstat-no" title="statement not covered" ></span>
2163
+ <span class="cstat-no" title="statement not covered" > // Remove from key index</span>
2164
+ <span class="cstat-no" title="statement not covered" > const keyIndexKey = `${entry.namespace}:${entry.key}`;</span>
2165
+ <span class="cstat-no" title="statement not covered" > this.keyIndex.delete(keyIndexKey);</span>
2166
+ <span class="cstat-no" title="statement not covered" ></span>
2167
+ <span class="cstat-no" title="statement not covered" > // Remove from tag index</span>
2168
+ <span class="cstat-no" title="statement not covered" > for (const tag of entry.tags) {</span>
2169
+ <span class="cstat-no" title="statement not covered" > this.tagIndex.get(tag)?.delete(id);</span>
2170
+ <span class="cstat-no" title="statement not covered" > }</span>
2171
+ <span class="cstat-no" title="statement not covered" ></span>
2172
+ <span class="cstat-no" title="statement not covered" > // Remove from vector index</span>
2173
+ <span class="cstat-no" title="statement not covered" > if (entry.embedding) {</span>
2174
+ <span class="cstat-no" title="statement not covered" > await this.index.removePoint(id);</span>
2175
+ <span class="cstat-no" title="statement not covered" > }</span>
2176
+ <span class="cstat-no" title="statement not covered" ></span>
2177
+ <span class="cstat-no" title="statement not covered" > // Remove from cache</span>
2178
+ <span class="cstat-no" title="statement not covered" > if (this.config.cacheEnabled) {</span>
2179
+ <span class="cstat-no" title="statement not covered" > this.cache.delete(id);</span>
2180
+ <span class="cstat-no" title="statement not covered" > }</span>
2181
+ <span class="cstat-no" title="statement not covered" ></span>
2182
+ <span class="cstat-no" title="statement not covered" > this.emit('entry:deleted', { id });</span>
2183
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2184
+ <span class="cstat-no" title="statement not covered" > }</span>
2185
+ <span class="cstat-no" title="statement not covered" ></span>
2186
+ <span class="cstat-no" title="statement not covered" > /**</span>
2187
+ <span class="cstat-no" title="statement not covered" > * Query memory entries with filters</span>
2188
+ <span class="cstat-no" title="statement not covered" > */</span>
2189
+ <span class="cstat-no" title="statement not covered" > async query(query: MemoryQuery): Promise&lt;MemoryEntry[]&gt; {</span>
2190
+ <span class="cstat-no" title="statement not covered" > const startTime = performance.now();</span>
2191
+ <span class="cstat-no" title="statement not covered" > let results: MemoryEntry[] = [];</span>
2192
+ <span class="cstat-no" title="statement not covered" ></span>
2193
+ <span class="cstat-no" title="statement not covered" > switch (query.type) {</span>
2194
+ <span class="cstat-no" title="statement not covered" > case 'exact':</span>
2195
+ <span class="cstat-no" title="statement not covered" > if (query.key &amp;&amp; query.namespace) {</span>
2196
+ <span class="cstat-no" title="statement not covered" > const entry = await this.getByKey(query.namespace, query.key);</span>
2197
+ <span class="cstat-no" title="statement not covered" > if (entry) results = [entry];</span>
2198
+ <span class="cstat-no" title="statement not covered" > }</span>
2199
+ <span class="cstat-no" title="statement not covered" > break;</span>
2200
+ <span class="cstat-no" title="statement not covered" ></span>
2201
+ <span class="cstat-no" title="statement not covered" > case 'prefix':</span>
2202
+ <span class="cstat-no" title="statement not covered" > results = this.queryByPrefix(query);</span>
2203
+ <span class="cstat-no" title="statement not covered" > break;</span>
2204
+ <span class="cstat-no" title="statement not covered" ></span>
2205
+ <span class="cstat-no" title="statement not covered" > case 'tag':</span>
2206
+ <span class="cstat-no" title="statement not covered" > results = this.queryByTags(query);</span>
2207
+ <span class="cstat-no" title="statement not covered" > break;</span>
2208
+ <span class="cstat-no" title="statement not covered" ></span>
2209
+ <span class="cstat-no" title="statement not covered" > case 'semantic':</span>
2210
+ <span class="cstat-no" title="statement not covered" > case 'hybrid':</span>
2211
+ <span class="cstat-no" title="statement not covered" > results = await this.querySemanticWithFilters(query);</span>
2212
+ <span class="cstat-no" title="statement not covered" > break;</span>
2213
+ <span class="cstat-no" title="statement not covered" ></span>
2214
+ <span class="cstat-no" title="statement not covered" > default:</span>
2215
+ <span class="cstat-no" title="statement not covered" > results = this.queryWithFilters(query);</span>
2216
+ <span class="cstat-no" title="statement not covered" > }</span>
2217
+ <span class="cstat-no" title="statement not covered" ></span>
2218
+ <span class="cstat-no" title="statement not covered" > // Apply common filters</span>
2219
+ <span class="cstat-no" title="statement not covered" > results = this.applyFilters(results, query);</span>
2220
+ <span class="cstat-no" title="statement not covered" ></span>
2221
+ <span class="cstat-no" title="statement not covered" > // Apply pagination</span>
2222
+ <span class="cstat-no" title="statement not covered" > const offset = query.offset || 0;</span>
2223
+ <span class="cstat-no" title="statement not covered" > results = results.slice(offset, offset + query.limit);</span>
2224
+ <span class="cstat-no" title="statement not covered" ></span>
2225
+ <span class="cstat-no" title="statement not covered" > const duration = performance.now() - startTime;</span>
2226
+ <span class="cstat-no" title="statement not covered" > this.stats.queryCount++;</span>
2227
+ <span class="cstat-no" title="statement not covered" > this.stats.totalQueryTime += duration;</span>
2228
+ <span class="cstat-no" title="statement not covered" ></span>
2229
+ <span class="cstat-no" title="statement not covered" > return results;</span>
2230
+ <span class="cstat-no" title="statement not covered" > }</span>
2231
+ <span class="cstat-no" title="statement not covered" ></span>
2232
+ <span class="cstat-no" title="statement not covered" > /**</span>
2233
+ <span class="cstat-no" title="statement not covered" > * Semantic vector search</span>
2234
+ <span class="cstat-no" title="statement not covered" > */</span>
2235
+ <span class="cstat-no" title="statement not covered" > async search(</span>
2236
+ <span class="cstat-no" title="statement not covered" > embedding: Float32Array,</span>
2237
+ <span class="cstat-no" title="statement not covered" > options: SearchOptions</span>
2238
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;SearchResult[]&gt; {</span>
2239
+ <span class="cstat-no" title="statement not covered" > const startTime = performance.now();</span>
2240
+ <span class="cstat-no" title="statement not covered" ></span>
2241
+ <span class="cstat-no" title="statement not covered" > const indexResults = await this.index.search(embedding, options.k, options.ef);</span>
2242
+ <span class="cstat-no" title="statement not covered" ></span>
2243
+ <span class="cstat-no" title="statement not covered" > const results: SearchResult[] = [];</span>
2244
+ <span class="cstat-no" title="statement not covered" > for (const { id, distance } of indexResults) {</span>
2245
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2246
+ <span class="cstat-no" title="statement not covered" > if (!entry) continue;</span>
2247
+ <span class="cstat-no" title="statement not covered" ></span>
2248
+ <span class="cstat-no" title="statement not covered" > // Apply threshold filter</span>
2249
+ <span class="cstat-no" title="statement not covered" > const score = 1 - distance; // Convert distance to similarity</span>
2250
+ <span class="cstat-no" title="statement not covered" > if (options.threshold &amp;&amp; score &lt; options.threshold) continue;</span>
2251
+ <span class="cstat-no" title="statement not covered" ></span>
2252
+ <span class="cstat-no" title="statement not covered" > // Apply additional filters if provided</span>
2253
+ <span class="cstat-no" title="statement not covered" > if (options.filters) {</span>
2254
+ <span class="cstat-no" title="statement not covered" > const filtered = this.applyFilters([entry], options.filters);</span>
2255
+ <span class="cstat-no" title="statement not covered" > if (filtered.length === 0) continue;</span>
2256
+ <span class="cstat-no" title="statement not covered" > }</span>
2257
+ <span class="cstat-no" title="statement not covered" ></span>
2258
+ <span class="cstat-no" title="statement not covered" > results.push({ entry, score, distance });</span>
2259
+ <span class="cstat-no" title="statement not covered" > }</span>
2260
+ <span class="cstat-no" title="statement not covered" ></span>
2261
+ <span class="cstat-no" title="statement not covered" > const duration = performance.now() - startTime;</span>
2262
+ <span class="cstat-no" title="statement not covered" > this.stats.searchCount++;</span>
2263
+ <span class="cstat-no" title="statement not covered" > this.stats.totalSearchTime += duration;</span>
2264
+ <span class="cstat-no" title="statement not covered" ></span>
2265
+ <span class="cstat-no" title="statement not covered" > return results;</span>
2266
+ <span class="cstat-no" title="statement not covered" > }</span>
2267
+ <span class="cstat-no" title="statement not covered" ></span>
2268
+ <span class="cstat-no" title="statement not covered" > /**</span>
2269
+ <span class="cstat-no" title="statement not covered" > * Bulk insert entries</span>
2270
+ <span class="cstat-no" title="statement not covered" > */</span>
2271
+ <span class="cstat-no" title="statement not covered" > async bulkInsert(entries: MemoryEntry[]): Promise&lt;void&gt; {</span>
2272
+ <span class="cstat-no" title="statement not covered" > const startTime = performance.now();</span>
2273
+ <span class="cstat-no" title="statement not covered" ></span>
2274
+ <span class="cstat-no" title="statement not covered" > for (const entry of entries) {</span>
2275
+ <span class="cstat-no" title="statement not covered" > await this.store(entry);</span>
2276
+ <span class="cstat-no" title="statement not covered" > }</span>
2277
+ <span class="cstat-no" title="statement not covered" ></span>
2278
+ <span class="cstat-no" title="statement not covered" > const duration = performance.now() - startTime;</span>
2279
+ <span class="cstat-no" title="statement not covered" > this.emit('bulk:inserted', { count: entries.length, duration });</span>
2280
+ <span class="cstat-no" title="statement not covered" > }</span>
2281
+ <span class="cstat-no" title="statement not covered" ></span>
2282
+ <span class="cstat-no" title="statement not covered" > /**</span>
2283
+ <span class="cstat-no" title="statement not covered" > * Bulk delete entries</span>
2284
+ <span class="cstat-no" title="statement not covered" > */</span>
2285
+ <span class="cstat-no" title="statement not covered" > async bulkDelete(ids: string[]): Promise&lt;number&gt; {</span>
2286
+ <span class="cstat-no" title="statement not covered" > let deleted = 0;</span>
2287
+ <span class="cstat-no" title="statement not covered" > for (const id of ids) {</span>
2288
+ <span class="cstat-no" title="statement not covered" > if (await this.delete(id)) {</span>
2289
+ <span class="cstat-no" title="statement not covered" > deleted++;</span>
2290
+ <span class="cstat-no" title="statement not covered" > }</span>
2291
+ <span class="cstat-no" title="statement not covered" > }</span>
2292
+ <span class="cstat-no" title="statement not covered" > return deleted;</span>
2293
+ <span class="cstat-no" title="statement not covered" > }</span>
2294
+ <span class="cstat-no" title="statement not covered" ></span>
2295
+ <span class="cstat-no" title="statement not covered" > /**</span>
2296
+ <span class="cstat-no" title="statement not covered" > * Get entry count</span>
2297
+ <span class="cstat-no" title="statement not covered" > */</span>
2298
+ <span class="cstat-no" title="statement not covered" > async count(namespace?: string): Promise&lt;number&gt; {</span>
2299
+ <span class="cstat-no" title="statement not covered" > if (namespace) {</span>
2300
+ <span class="cstat-no" title="statement not covered" > return this.namespaceIndex.get(namespace)?.size || 0;</span>
2301
+ <span class="cstat-no" title="statement not covered" > }</span>
2302
+ <span class="cstat-no" title="statement not covered" > return this.entries.size;</span>
2303
+ <span class="cstat-no" title="statement not covered" > }</span>
2304
+ <span class="cstat-no" title="statement not covered" ></span>
2305
+ <span class="cstat-no" title="statement not covered" > /**</span>
2306
+ <span class="cstat-no" title="statement not covered" > * List all namespaces</span>
2307
+ <span class="cstat-no" title="statement not covered" > */</span>
2308
+ <span class="cstat-no" title="statement not covered" > async listNamespaces(): Promise&lt;string[]&gt; {</span>
2309
+ <span class="cstat-no" title="statement not covered" > return Array.from(this.namespaceIndex.keys());</span>
2310
+ <span class="cstat-no" title="statement not covered" > }</span>
2311
+ <span class="cstat-no" title="statement not covered" ></span>
2312
+ <span class="cstat-no" title="statement not covered" > /**</span>
2313
+ <span class="cstat-no" title="statement not covered" > * Clear all entries in a namespace</span>
2314
+ <span class="cstat-no" title="statement not covered" > */</span>
2315
+ <span class="cstat-no" title="statement not covered" > async clearNamespace(namespace: string): Promise&lt;number&gt; {</span>
2316
+ <span class="cstat-no" title="statement not covered" > const ids = this.namespaceIndex.get(namespace);</span>
2317
+ <span class="cstat-no" title="statement not covered" > if (!ids) return 0;</span>
2318
+ <span class="cstat-no" title="statement not covered" ></span>
2319
+ <span class="cstat-no" title="statement not covered" > let deleted = 0;</span>
2320
+ <span class="cstat-no" title="statement not covered" > for (const id of ids) {</span>
2321
+ <span class="cstat-no" title="statement not covered" > if (await this.delete(id)) {</span>
2322
+ <span class="cstat-no" title="statement not covered" > deleted++;</span>
2323
+ <span class="cstat-no" title="statement not covered" > }</span>
2324
+ <span class="cstat-no" title="statement not covered" > }</span>
2325
+ <span class="cstat-no" title="statement not covered" ></span>
2326
+ <span class="cstat-no" title="statement not covered" > return deleted;</span>
2327
+ <span class="cstat-no" title="statement not covered" > }</span>
2328
+ <span class="cstat-no" title="statement not covered" ></span>
2329
+ <span class="cstat-no" title="statement not covered" > /**</span>
2330
+ <span class="cstat-no" title="statement not covered" > * Get backend statistics</span>
2331
+ <span class="cstat-no" title="statement not covered" > */</span>
2332
+ <span class="cstat-no" title="statement not covered" > async getStats(): Promise&lt;BackendStats&gt; {</span>
2333
+ <span class="cstat-no" title="statement not covered" > const entriesByNamespace: Record&lt;string, number&gt; = {};</span>
2334
+ <span class="cstat-no" title="statement not covered" > for (const [namespace, ids] of this.namespaceIndex) {</span>
2335
+ <span class="cstat-no" title="statement not covered" > entriesByNamespace[namespace] = ids.size;</span>
2336
+ <span class="cstat-no" title="statement not covered" > }</span>
2337
+ <span class="cstat-no" title="statement not covered" ></span>
2338
+ <span class="cstat-no" title="statement not covered" > const entriesByType: Record&lt;MemoryType, number&gt; = {</span>
2339
+ <span class="cstat-no" title="statement not covered" > episodic: 0,</span>
2340
+ <span class="cstat-no" title="statement not covered" > semantic: 0,</span>
2341
+ <span class="cstat-no" title="statement not covered" > procedural: 0,</span>
2342
+ <span class="cstat-no" title="statement not covered" > working: 0,</span>
2343
+ <span class="cstat-no" title="statement not covered" > cache: 0,</span>
2344
+ <span class="cstat-no" title="statement not covered" > };</span>
2345
+ <span class="cstat-no" title="statement not covered" ></span>
2346
+ <span class="cstat-no" title="statement not covered" > for (const entry of this.entries.values()) {</span>
2347
+ <span class="cstat-no" title="statement not covered" > entriesByType[entry.type]++;</span>
2348
+ <span class="cstat-no" title="statement not covered" > }</span>
2349
+ <span class="cstat-no" title="statement not covered" ></span>
2350
+ <span class="cstat-no" title="statement not covered" > return {</span>
2351
+ <span class="cstat-no" title="statement not covered" > totalEntries: this.entries.size,</span>
2352
+ <span class="cstat-no" title="statement not covered" > entriesByNamespace,</span>
2353
+ <span class="cstat-no" title="statement not covered" > entriesByType,</span>
2354
+ <span class="cstat-no" title="statement not covered" > memoryUsage: this.estimateMemoryUsage(),</span>
2355
+ <span class="cstat-no" title="statement not covered" > hnswStats: this.index.getStats(),</span>
2356
+ <span class="cstat-no" title="statement not covered" > cacheStats: this.cache.getStats(),</span>
2357
+ <span class="cstat-no" title="statement not covered" > avgQueryTime:</span>
2358
+ <span class="cstat-no" title="statement not covered" > this.stats.queryCount &gt; 0</span>
2359
+ <span class="cstat-no" title="statement not covered" > ? this.stats.totalQueryTime / this.stats.queryCount</span>
2360
+ <span class="cstat-no" title="statement not covered" > : 0,</span>
2361
+ <span class="cstat-no" title="statement not covered" > avgSearchTime:</span>
2362
+ <span class="cstat-no" title="statement not covered" > this.stats.searchCount &gt; 0</span>
2363
+ <span class="cstat-no" title="statement not covered" > ? this.stats.totalSearchTime / this.stats.searchCount</span>
2364
+ <span class="cstat-no" title="statement not covered" > : 0,</span>
2365
+ <span class="cstat-no" title="statement not covered" > };</span>
2366
+ <span class="cstat-no" title="statement not covered" > }</span>
2367
+ <span class="cstat-no" title="statement not covered" ></span>
2368
+ <span class="cstat-no" title="statement not covered" > /**</span>
2369
+ <span class="cstat-no" title="statement not covered" > * Perform health check</span>
2370
+ <span class="cstat-no" title="statement not covered" > */</span>
2371
+ <span class="cstat-no" title="statement not covered" > async healthCheck(): Promise&lt;HealthCheckResult&gt; {</span>
2372
+ <span class="cstat-no" title="statement not covered" > const issues: string[] = [];</span>
2373
+ <span class="cstat-no" title="statement not covered" > const recommendations: string[] = [];</span>
2374
+ <span class="cstat-no" title="statement not covered" ></span>
2375
+ <span class="cstat-no" title="statement not covered" > // Check storage health</span>
2376
+ <span class="cstat-no" title="statement not covered" > const storageHealth = this.checkStorageHealth(issues, recommendations);</span>
2377
+ <span class="cstat-no" title="statement not covered" ></span>
2378
+ <span class="cstat-no" title="statement not covered" > // Check index health</span>
2379
+ <span class="cstat-no" title="statement not covered" > const indexHealth = this.checkIndexHealth(issues, recommendations);</span>
2380
+ <span class="cstat-no" title="statement not covered" ></span>
2381
+ <span class="cstat-no" title="statement not covered" > // Check cache health</span>
2382
+ <span class="cstat-no" title="statement not covered" > const cacheHealth = this.checkCacheHealth(issues, recommendations);</span>
2383
+ <span class="cstat-no" title="statement not covered" ></span>
2384
+ <span class="cstat-no" title="statement not covered" > // Determine overall status</span>
2385
+ <span class="cstat-no" title="statement not covered" > let status: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';</span>
2386
+ <span class="cstat-no" title="statement not covered" > if (</span>
2387
+ <span class="cstat-no" title="statement not covered" > storageHealth.status === 'unhealthy' ||</span>
2388
+ <span class="cstat-no" title="statement not covered" > indexHealth.status === 'unhealthy' ||</span>
2389
+ <span class="cstat-no" title="statement not covered" > cacheHealth.status === 'unhealthy'</span>
2390
+ <span class="cstat-no" title="statement not covered" > ) {</span>
2391
+ <span class="cstat-no" title="statement not covered" > status = 'unhealthy';</span>
2392
+ <span class="cstat-no" title="statement not covered" > } else if (</span>
2393
+ <span class="cstat-no" title="statement not covered" > storageHealth.status === 'degraded' ||</span>
2394
+ <span class="cstat-no" title="statement not covered" > indexHealth.status === 'degraded' ||</span>
2395
+ <span class="cstat-no" title="statement not covered" > cacheHealth.status === 'degraded'</span>
2396
+ <span class="cstat-no" title="statement not covered" > ) {</span>
2397
+ <span class="cstat-no" title="statement not covered" > status = 'degraded';</span>
2398
+ <span class="cstat-no" title="statement not covered" > }</span>
2399
+ <span class="cstat-no" title="statement not covered" ></span>
2400
+ <span class="cstat-no" title="statement not covered" > return {</span>
2401
+ <span class="cstat-no" title="statement not covered" > status,</span>
2402
+ <span class="cstat-no" title="statement not covered" > components: {</span>
2403
+ <span class="cstat-no" title="statement not covered" > storage: storageHealth,</span>
2404
+ <span class="cstat-no" title="statement not covered" > index: indexHealth,</span>
2405
+ <span class="cstat-no" title="statement not covered" > cache: cacheHealth,</span>
2406
+ <span class="cstat-no" title="statement not covered" > },</span>
2407
+ <span class="cstat-no" title="statement not covered" > timestamp: Date.now(),</span>
2408
+ <span class="cstat-no" title="statement not covered" > issues,</span>
2409
+ <span class="cstat-no" title="statement not covered" > recommendations,</span>
2410
+ <span class="cstat-no" title="statement not covered" > };</span>
2411
+ <span class="cstat-no" title="statement not covered" > }</span>
2412
+ <span class="cstat-no" title="statement not covered" ></span>
2413
+ <span class="cstat-no" title="statement not covered" > // ===== Convenience Methods =====</span>
2414
+ <span class="cstat-no" title="statement not covered" ></span>
2415
+ <span class="cstat-no" title="statement not covered" > /**</span>
2416
+ <span class="cstat-no" title="statement not covered" > * Store a new entry from input</span>
2417
+ <span class="cstat-no" title="statement not covered" > */</span>
2418
+ <span class="cstat-no" title="statement not covered" > async storeEntry(input: MemoryEntryInput): Promise&lt;MemoryEntry&gt; {</span>
2419
+ <span class="cstat-no" title="statement not covered" > const entry = createDefaultEntry(input);</span>
2420
+ <span class="cstat-no" title="statement not covered" > await this.store(entry);</span>
2421
+ <span class="cstat-no" title="statement not covered" > return entry;</span>
2422
+ <span class="cstat-no" title="statement not covered" > }</span>
2423
+ <span class="cstat-no" title="statement not covered" ></span>
2424
+ <span class="cstat-no" title="statement not covered" > /**</span>
2425
+ <span class="cstat-no" title="statement not covered" > * Semantic search by content string</span>
2426
+ <span class="cstat-no" title="statement not covered" > */</span>
2427
+ <span class="cstat-no" title="statement not covered" > async semanticSearch(</span>
2428
+ <span class="cstat-no" title="statement not covered" > content: string,</span>
2429
+ <span class="cstat-no" title="statement not covered" > k: number = 10,</span>
2430
+ <span class="cstat-no" title="statement not covered" > threshold?: number</span>
2431
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;SearchResult[]&gt; {</span>
2432
+ <span class="cstat-no" title="statement not covered" > if (!this.config.embeddingGenerator) {</span>
2433
+ <span class="cstat-no" title="statement not covered" > throw new Error('Embedding generator not configured');</span>
2434
+ <span class="cstat-no" title="statement not covered" > }</span>
2435
+ <span class="cstat-no" title="statement not covered" ></span>
2436
+ <span class="cstat-no" title="statement not covered" > const embedding = await this.config.embeddingGenerator(content);</span>
2437
+ <span class="cstat-no" title="statement not covered" > return this.search(embedding, { k, threshold });</span>
2438
+ <span class="cstat-no" title="statement not covered" > }</span>
2439
+ <span class="cstat-no" title="statement not covered" ></span>
2440
+ <span class="cstat-no" title="statement not covered" > // ===== Private Methods =====</span>
2441
+ <span class="cstat-no" title="statement not covered" ></span>
2442
+ <span class="cstat-no" title="statement not covered" > private queryByPrefix(query: MemoryQuery): MemoryEntry[] {</span>
2443
+ <span class="cstat-no" title="statement not covered" > const results: MemoryEntry[] = [];</span>
2444
+ <span class="cstat-no" title="statement not covered" > const prefix = query.keyPrefix || '';</span>
2445
+ <span class="cstat-no" title="statement not covered" > const namespace = query.namespace || this.config.defaultNamespace;</span>
2446
+ <span class="cstat-no" title="statement not covered" ></span>
2447
+ <span class="cstat-no" title="statement not covered" > for (const [key, id] of this.keyIndex) {</span>
2448
+ <span class="cstat-no" title="statement not covered" > if (key.startsWith(`${namespace}:${prefix}`)) {</span>
2449
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2450
+ <span class="cstat-no" title="statement not covered" > if (entry) results.push(entry);</span>
2451
+ <span class="cstat-no" title="statement not covered" > }</span>
2452
+ <span class="cstat-no" title="statement not covered" > }</span>
2453
+ <span class="cstat-no" title="statement not covered" ></span>
2454
+ <span class="cstat-no" title="statement not covered" > return results;</span>
2455
+ <span class="cstat-no" title="statement not covered" > }</span>
2456
+ <span class="cstat-no" title="statement not covered" ></span>
2457
+ <span class="cstat-no" title="statement not covered" > private queryByTags(query: MemoryQuery): MemoryEntry[] {</span>
2458
+ <span class="cstat-no" title="statement not covered" > if (!query.tags || query.tags.length === 0) {</span>
2459
+ <span class="cstat-no" title="statement not covered" > return Array.from(this.entries.values());</span>
2460
+ <span class="cstat-no" title="statement not covered" > }</span>
2461
+ <span class="cstat-no" title="statement not covered" ></span>
2462
+ <span class="cstat-no" title="statement not covered" > // Get intersection of entries for all tags</span>
2463
+ <span class="cstat-no" title="statement not covered" > let matchingIds: Set&lt;string&gt; | null = null;</span>
2464
+ <span class="cstat-no" title="statement not covered" ></span>
2465
+ <span class="cstat-no" title="statement not covered" > for (const tag of query.tags) {</span>
2466
+ <span class="cstat-no" title="statement not covered" > const tagIds = this.tagIndex.get(tag);</span>
2467
+ <span class="cstat-no" title="statement not covered" > if (!tagIds) {</span>
2468
+ <span class="cstat-no" title="statement not covered" > return []; // Tag doesn't exist</span>
2469
+ <span class="cstat-no" title="statement not covered" > }</span>
2470
+ <span class="cstat-no" title="statement not covered" ></span>
2471
+ <span class="cstat-no" title="statement not covered" > if (matchingIds === null) {</span>
2472
+ <span class="cstat-no" title="statement not covered" > matchingIds = new Set(tagIds);</span>
2473
+ <span class="cstat-no" title="statement not covered" > } else {</span>
2474
+ <span class="cstat-no" title="statement not covered" > // Intersect with previous results</span>
2475
+ <span class="cstat-no" title="statement not covered" > for (const id of matchingIds) {</span>
2476
+ <span class="cstat-no" title="statement not covered" > if (!tagIds.has(id)) {</span>
2477
+ <span class="cstat-no" title="statement not covered" > matchingIds.delete(id);</span>
2478
+ <span class="cstat-no" title="statement not covered" > }</span>
2479
+ <span class="cstat-no" title="statement not covered" > }</span>
2480
+ <span class="cstat-no" title="statement not covered" > }</span>
2481
+ <span class="cstat-no" title="statement not covered" > }</span>
2482
+ <span class="cstat-no" title="statement not covered" ></span>
2483
+ <span class="cstat-no" title="statement not covered" > if (!matchingIds) return [];</span>
2484
+ <span class="cstat-no" title="statement not covered" ></span>
2485
+ <span class="cstat-no" title="statement not covered" > const results: MemoryEntry[] = [];</span>
2486
+ <span class="cstat-no" title="statement not covered" > for (const id of matchingIds) {</span>
2487
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2488
+ <span class="cstat-no" title="statement not covered" > if (entry) results.push(entry);</span>
2489
+ <span class="cstat-no" title="statement not covered" > }</span>
2490
+ <span class="cstat-no" title="statement not covered" ></span>
2491
+ <span class="cstat-no" title="statement not covered" > return results;</span>
2492
+ <span class="cstat-no" title="statement not covered" > }</span>
2493
+ <span class="cstat-no" title="statement not covered" ></span>
2494
+ <span class="cstat-no" title="statement not covered" > private async querySemanticWithFilters(</span>
2495
+ <span class="cstat-no" title="statement not covered" > query: MemoryQuery</span>
2496
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;MemoryEntry[]&gt; {</span>
2497
+ <span class="cstat-no" title="statement not covered" > if (!query.content &amp;&amp; !query.embedding) {</span>
2498
+ <span class="cstat-no" title="statement not covered" > return this.queryWithFilters(query);</span>
2499
+ <span class="cstat-no" title="statement not covered" > }</span>
2500
+ <span class="cstat-no" title="statement not covered" ></span>
2501
+ <span class="cstat-no" title="statement not covered" > let embedding = query.embedding;</span>
2502
+ <span class="cstat-no" title="statement not covered" > if (!embedding &amp;&amp; query.content &amp;&amp; this.config.embeddingGenerator) {</span>
2503
+ <span class="cstat-no" title="statement not covered" > embedding = await this.config.embeddingGenerator(query.content);</span>
2504
+ <span class="cstat-no" title="statement not covered" > }</span>
2505
+ <span class="cstat-no" title="statement not covered" ></span>
2506
+ <span class="cstat-no" title="statement not covered" > if (!embedding) {</span>
2507
+ <span class="cstat-no" title="statement not covered" > return this.queryWithFilters(query);</span>
2508
+ <span class="cstat-no" title="statement not covered" > }</span>
2509
+ <span class="cstat-no" title="statement not covered" ></span>
2510
+ <span class="cstat-no" title="statement not covered" > const searchResults = await this.search(embedding, {</span>
2511
+ <span class="cstat-no" title="statement not covered" > k: query.limit * 2, // Over-fetch for filtering</span>
2512
+ <span class="cstat-no" title="statement not covered" > threshold: query.threshold,</span>
2513
+ <span class="cstat-no" title="statement not covered" > filters: query,</span>
2514
+ <span class="cstat-no" title="statement not covered" > });</span>
2515
+ <span class="cstat-no" title="statement not covered" ></span>
2516
+ <span class="cstat-no" title="statement not covered" > return searchResults.map((r) =&gt; r.entry);</span>
2517
+ <span class="cstat-no" title="statement not covered" > }</span>
2518
+ <span class="cstat-no" title="statement not covered" ></span>
2519
+ <span class="cstat-no" title="statement not covered" > private queryWithFilters(query: MemoryQuery): MemoryEntry[] {</span>
2520
+ <span class="cstat-no" title="statement not covered" > let entries: MemoryEntry[] = [];</span>
2521
+ <span class="cstat-no" title="statement not covered" ></span>
2522
+ <span class="cstat-no" title="statement not covered" > // Start with namespace filter if provided</span>
2523
+ <span class="cstat-no" title="statement not covered" > if (query.namespace) {</span>
2524
+ <span class="cstat-no" title="statement not covered" > const namespaceIds = this.namespaceIndex.get(query.namespace);</span>
2525
+ <span class="cstat-no" title="statement not covered" > if (!namespaceIds) return [];</span>
2526
+ <span class="cstat-no" title="statement not covered" > for (const id of namespaceIds) {</span>
2527
+ <span class="cstat-no" title="statement not covered" > const entry = this.entries.get(id);</span>
2528
+ <span class="cstat-no" title="statement not covered" > if (entry) entries.push(entry);</span>
2529
+ <span class="cstat-no" title="statement not covered" > }</span>
2530
+ <span class="cstat-no" title="statement not covered" > } else {</span>
2531
+ <span class="cstat-no" title="statement not covered" > entries = Array.from(this.entries.values());</span>
2532
+ <span class="cstat-no" title="statement not covered" > }</span>
2533
+ <span class="cstat-no" title="statement not covered" ></span>
2534
+ <span class="cstat-no" title="statement not covered" > return entries;</span>
2535
+ <span class="cstat-no" title="statement not covered" > }</span>
2536
+ <span class="cstat-no" title="statement not covered" ></span>
2537
+ <span class="cstat-no" title="statement not covered" > private applyFilters(</span>
2538
+ <span class="cstat-no" title="statement not covered" > entries: MemoryEntry[],</span>
2539
+ <span class="cstat-no" title="statement not covered" > query: MemoryQuery</span>
2540
+ <span class="cstat-no" title="statement not covered" > ): MemoryEntry[] {</span>
2541
+ <span class="cstat-no" title="statement not covered" > return entries.filter((entry) =&gt; {</span>
2542
+ <span class="cstat-no" title="statement not covered" > // Namespace filter</span>
2543
+ <span class="cstat-no" title="statement not covered" > if (query.namespace &amp;&amp; entry.namespace !== query.namespace) {</span>
2544
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2545
+ <span class="cstat-no" title="statement not covered" > }</span>
2546
+ <span class="cstat-no" title="statement not covered" ></span>
2547
+ <span class="cstat-no" title="statement not covered" > // Memory type filter</span>
2548
+ <span class="cstat-no" title="statement not covered" > if (query.memoryType &amp;&amp; entry.type !== query.memoryType) {</span>
2549
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2550
+ <span class="cstat-no" title="statement not covered" > }</span>
2551
+ <span class="cstat-no" title="statement not covered" ></span>
2552
+ <span class="cstat-no" title="statement not covered" > // Access level filter</span>
2553
+ <span class="cstat-no" title="statement not covered" > if (query.accessLevel &amp;&amp; entry.accessLevel !== query.accessLevel) {</span>
2554
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2555
+ <span class="cstat-no" title="statement not covered" > }</span>
2556
+ <span class="cstat-no" title="statement not covered" ></span>
2557
+ <span class="cstat-no" title="statement not covered" > // Owner filter</span>
2558
+ <span class="cstat-no" title="statement not covered" > if (query.ownerId &amp;&amp; entry.ownerId !== query.ownerId) {</span>
2559
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2560
+ <span class="cstat-no" title="statement not covered" > }</span>
2561
+ <span class="cstat-no" title="statement not covered" ></span>
2562
+ <span class="cstat-no" title="statement not covered" > // Tags filter</span>
2563
+ <span class="cstat-no" title="statement not covered" > if (query.tags &amp;&amp; query.tags.length &gt; 0) {</span>
2564
+ <span class="cstat-no" title="statement not covered" > if (!query.tags.every((tag) =&gt; entry.tags.includes(tag))) {</span>
2565
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2566
+ <span class="cstat-no" title="statement not covered" > }</span>
2567
+ <span class="cstat-no" title="statement not covered" > }</span>
2568
+ <span class="cstat-no" title="statement not covered" ></span>
2569
+ <span class="cstat-no" title="statement not covered" > // Time range filters</span>
2570
+ <span class="cstat-no" title="statement not covered" > if (query.createdAfter &amp;&amp; entry.createdAt &lt; query.createdAfter) {</span>
2571
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2572
+ <span class="cstat-no" title="statement not covered" > }</span>
2573
+ <span class="cstat-no" title="statement not covered" > if (query.createdBefore &amp;&amp; entry.createdAt &gt; query.createdBefore) {</span>
2574
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2575
+ <span class="cstat-no" title="statement not covered" > }</span>
2576
+ <span class="cstat-no" title="statement not covered" > if (query.updatedAfter &amp;&amp; entry.updatedAt &lt; query.updatedAfter) {</span>
2577
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2578
+ <span class="cstat-no" title="statement not covered" > }</span>
2579
+ <span class="cstat-no" title="statement not covered" > if (query.updatedBefore &amp;&amp; entry.updatedAt &gt; query.updatedBefore) {</span>
2580
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2581
+ <span class="cstat-no" title="statement not covered" > }</span>
2582
+ <span class="cstat-no" title="statement not covered" ></span>
2583
+ <span class="cstat-no" title="statement not covered" > // Expiration filter</span>
2584
+ <span class="cstat-no" title="statement not covered" > if (!query.includeExpired &amp;&amp; entry.expiresAt) {</span>
2585
+ <span class="cstat-no" title="statement not covered" > if (entry.expiresAt &lt; Date.now()) {</span>
2586
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2587
+ <span class="cstat-no" title="statement not covered" > }</span>
2588
+ <span class="cstat-no" title="statement not covered" > }</span>
2589
+ <span class="cstat-no" title="statement not covered" ></span>
2590
+ <span class="cstat-no" title="statement not covered" > // Metadata filters</span>
2591
+ <span class="cstat-no" title="statement not covered" > if (query.metadata) {</span>
2592
+ <span class="cstat-no" title="statement not covered" > for (const [key, value] of Object.entries(query.metadata)) {</span>
2593
+ <span class="cstat-no" title="statement not covered" > if (entry.metadata[key] !== value) {</span>
2594
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2595
+ <span class="cstat-no" title="statement not covered" > }</span>
2596
+ <span class="cstat-no" title="statement not covered" > }</span>
2597
+ <span class="cstat-no" title="statement not covered" > }</span>
2598
+ <span class="cstat-no" title="statement not covered" ></span>
2599
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2600
+ <span class="cstat-no" title="statement not covered" > });</span>
2601
+ <span class="cstat-no" title="statement not covered" > }</span>
2602
+ <span class="cstat-no" title="statement not covered" ></span>
2603
+ <span class="cstat-no" title="statement not covered" > private updateAccessStats(entry: MemoryEntry): void {</span>
2604
+ <span class="cstat-no" title="statement not covered" > entry.accessCount++;</span>
2605
+ <span class="cstat-no" title="statement not covered" > entry.lastAccessedAt = Date.now();</span>
2606
+ <span class="cstat-no" title="statement not covered" > }</span>
2607
+ <span class="cstat-no" title="statement not covered" ></span>
2608
+ <span class="cstat-no" title="statement not covered" > private estimateMemoryUsage(): number {</span>
2609
+ <span class="cstat-no" title="statement not covered" > let total = 0;</span>
2610
+ <span class="cstat-no" title="statement not covered" ></span>
2611
+ <span class="cstat-no" title="statement not covered" > // Estimate entry storage</span>
2612
+ <span class="cstat-no" title="statement not covered" > for (const entry of this.entries.values()) {</span>
2613
+ <span class="cstat-no" title="statement not covered" > total += this.estimateEntrySize(entry);</span>
2614
+ <span class="cstat-no" title="statement not covered" > }</span>
2615
+ <span class="cstat-no" title="statement not covered" ></span>
2616
+ <span class="cstat-no" title="statement not covered" > // Add index memory</span>
2617
+ <span class="cstat-no" title="statement not covered" > total += this.index.getStats().memoryUsage;</span>
2618
+ <span class="cstat-no" title="statement not covered" ></span>
2619
+ <span class="cstat-no" title="statement not covered" > // Add cache memory</span>
2620
+ <span class="cstat-no" title="statement not covered" > total += this.cache.getStats().memoryUsage;</span>
2621
+ <span class="cstat-no" title="statement not covered" ></span>
2622
+ <span class="cstat-no" title="statement not covered" > return total;</span>
2623
+ <span class="cstat-no" title="statement not covered" > }</span>
2624
+ <span class="cstat-no" title="statement not covered" ></span>
2625
+ <span class="cstat-no" title="statement not covered" > private estimateEntrySize(entry: MemoryEntry): number {</span>
2626
+ <span class="cstat-no" title="statement not covered" > let size = 0;</span>
2627
+ <span class="cstat-no" title="statement not covered" ></span>
2628
+ <span class="cstat-no" title="statement not covered" > // Base object overhead</span>
2629
+ <span class="cstat-no" title="statement not covered" > size += 100;</span>
2630
+ <span class="cstat-no" title="statement not covered" ></span>
2631
+ <span class="cstat-no" title="statement not covered" > // String fields</span>
2632
+ <span class="cstat-no" title="statement not covered" > size += (entry.id.length + entry.key.length + entry.content.length) * 2;</span>
2633
+ <span class="cstat-no" title="statement not covered" ></span>
2634
+ <span class="cstat-no" title="statement not covered" > // Embedding (Float32Array)</span>
2635
+ <span class="cstat-no" title="statement not covered" > if (entry.embedding) {</span>
2636
+ <span class="cstat-no" title="statement not covered" > size += entry.embedding.length * 4;</span>
2637
+ <span class="cstat-no" title="statement not covered" > }</span>
2638
+ <span class="cstat-no" title="statement not covered" ></span>
2639
+ <span class="cstat-no" title="statement not covered" > // Tags and references</span>
2640
+ <span class="cstat-no" title="statement not covered" > size += entry.tags.join('').length * 2;</span>
2641
+ <span class="cstat-no" title="statement not covered" > size += entry.references.join('').length * 2;</span>
2642
+ <span class="cstat-no" title="statement not covered" ></span>
2643
+ <span class="cstat-no" title="statement not covered" > // Metadata (rough estimate)</span>
2644
+ <span class="cstat-no" title="statement not covered" > size += JSON.stringify(entry.metadata).length * 2;</span>
2645
+ <span class="cstat-no" title="statement not covered" ></span>
2646
+ <span class="cstat-no" title="statement not covered" > return size;</span>
2647
+ <span class="cstat-no" title="statement not covered" > }</span>
2648
+ <span class="cstat-no" title="statement not covered" ></span>
2649
+ <span class="cstat-no" title="statement not covered" > private checkStorageHealth(</span>
2650
+ <span class="cstat-no" title="statement not covered" > issues: string[],</span>
2651
+ <span class="cstat-no" title="statement not covered" > recommendations: string[]</span>
2652
+ <span class="cstat-no" title="statement not covered" > ): ComponentHealth {</span>
2653
+ <span class="cstat-no" title="statement not covered" > const utilizationPercent =</span>
2654
+ <span class="cstat-no" title="statement not covered" > (this.entries.size / this.config.maxEntries) * 100;</span>
2655
+ <span class="cstat-no" title="statement not covered" ></span>
2656
+ <span class="cstat-no" title="statement not covered" > if (utilizationPercent &gt; 95) {</span>
2657
+ <span class="cstat-no" title="statement not covered" > issues.push('Storage utilization critical (&gt;95%)');</span>
2658
+ <span class="cstat-no" title="statement not covered" > recommendations.push('Increase maxEntries or cleanup old data');</span>
2659
+ <span class="cstat-no" title="statement not covered" > return { status: 'unhealthy', latency: 0, message: 'Storage near capacity' };</span>
2660
+ <span class="cstat-no" title="statement not covered" > }</span>
2661
+ <span class="cstat-no" title="statement not covered" ></span>
2662
+ <span class="cstat-no" title="statement not covered" > if (utilizationPercent &gt; 80) {</span>
2663
+ <span class="cstat-no" title="statement not covered" > issues.push('Storage utilization high (&gt;80%)');</span>
2664
+ <span class="cstat-no" title="statement not covered" > recommendations.push('Consider cleanup or capacity increase');</span>
2665
+ <span class="cstat-no" title="statement not covered" > return { status: 'degraded', latency: 0, message: 'Storage utilization high' };</span>
2666
+ <span class="cstat-no" title="statement not covered" > }</span>
2667
+ <span class="cstat-no" title="statement not covered" ></span>
2668
+ <span class="cstat-no" title="statement not covered" > return { status: 'healthy', latency: 0 };</span>
2669
+ <span class="cstat-no" title="statement not covered" > }</span>
2670
+ <span class="cstat-no" title="statement not covered" ></span>
2671
+ <span class="cstat-no" title="statement not covered" > private checkIndexHealth(</span>
2672
+ <span class="cstat-no" title="statement not covered" > issues: string[],</span>
2673
+ <span class="cstat-no" title="statement not covered" > recommendations: string[]</span>
2674
+ <span class="cstat-no" title="statement not covered" > ): ComponentHealth {</span>
2675
+ <span class="cstat-no" title="statement not covered" > const stats = this.index.getStats();</span>
2676
+ <span class="cstat-no" title="statement not covered" ></span>
2677
+ <span class="cstat-no" title="statement not covered" > if (stats.avgSearchTime &gt; 10) {</span>
2678
+ <span class="cstat-no" title="statement not covered" > issues.push('Index search time degraded (&gt;10ms)');</span>
2679
+ <span class="cstat-no" title="statement not covered" > recommendations.push('Consider rebuilding index or increasing ef');</span>
2680
+ <span class="cstat-no" title="statement not covered" > return { status: 'degraded', latency: stats.avgSearchTime };</span>
2681
+ <span class="cstat-no" title="statement not covered" > }</span>
2682
+ <span class="cstat-no" title="statement not covered" ></span>
2683
+ <span class="cstat-no" title="statement not covered" > return { status: 'healthy', latency: stats.avgSearchTime };</span>
2684
+ <span class="cstat-no" title="statement not covered" > }</span>
2685
+ <span class="cstat-no" title="statement not covered" ></span>
2686
+ <span class="cstat-no" title="statement not covered" > private checkCacheHealth(</span>
2687
+ <span class="cstat-no" title="statement not covered" > issues: string[],</span>
2688
+ <span class="cstat-no" title="statement not covered" > recommendations: string[]</span>
2689
+ <span class="cstat-no" title="statement not covered" > ): ComponentHealth {</span>
2690
+ <span class="cstat-no" title="statement not covered" > const stats = this.cache.getStats();</span>
2691
+ <span class="cstat-no" title="statement not covered" ></span>
2692
+ <span class="cstat-no" title="statement not covered" > if (stats.hitRate &lt; 0.5) {</span>
2693
+ <span class="cstat-no" title="statement not covered" > issues.push('Cache hit rate low (&lt;50%)');</span>
2694
+ <span class="cstat-no" title="statement not covered" > recommendations.push('Consider increasing cache size');</span>
2695
+ <span class="cstat-no" title="statement not covered" > return {</span>
2696
+ <span class="cstat-no" title="statement not covered" > status: 'degraded',</span>
2697
+ <span class="cstat-no" title="statement not covered" > latency: 0,</span>
2698
+ <span class="cstat-no" title="statement not covered" > message: `Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`,</span>
2699
+ <span class="cstat-no" title="statement not covered" > };</span>
2700
+ <span class="cstat-no" title="statement not covered" > }</span>
2701
+ <span class="cstat-no" title="statement not covered" ></span>
2702
+ <span class="cstat-no" title="statement not covered" > return { status: 'healthy', latency: 0 };</span>
2703
+ <span class="cstat-no" title="statement not covered" > }</span>
2704
+ <span class="cstat-no" title="statement not covered" ></span>
2705
+ <span class="cstat-no" title="statement not covered" > private async loadFromDisk(): Promise&lt;void&gt; {</span>
2706
+ <span class="cstat-no" title="statement not covered" > // Placeholder for persistence implementation</span>
2707
+ <span class="cstat-no" title="statement not covered" > // Would use SQLite or file-based storage</span>
2708
+ <span class="cstat-no" title="statement not covered" > this.emit('persistence:loaded');</span>
2709
+ <span class="cstat-no" title="statement not covered" > }</span>
2710
+ <span class="cstat-no" title="statement not covered" ></span>
2711
+ <span class="cstat-no" title="statement not covered" > private async saveToDisk(): Promise&lt;void&gt; {</span>
2712
+ <span class="cstat-no" title="statement not covered" > // Placeholder for persistence implementation</span>
2713
+ <span class="cstat-no" title="statement not covered" > this.emit('persistence:saved');</span>
2714
+ <span class="cstat-no" title="statement not covered" > }</span>
2715
+ <span class="cstat-no" title="statement not covered" >}</span>
2716
+ <span class="cstat-no" title="statement not covered" ></span>
2717
+ <span class="cstat-no" title="statement not covered" >export default AgentDBAdapter;</span>
2718
+ &nbsp;</pre></td></tr></table></pre>
2719
+
2720
+ <div class='push'></div><!-- for sticky footer -->
2721
+ </div><!-- /wrapper -->
2722
+ <div class='footer quiet pad2 space-top1 center small'>
2723
+ Code coverage generated by
2724
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2725
+ at 2026-01-05T21:16:54.220Z
2726
+ </div>
2727
+ <script src="../prettify.js"></script>
2728
+ <script>
2729
+ window.onload = function () {
2730
+ prettyPrint();
2731
+ };
2732
+ </script>
2733
+ <script src="../sorter.js"></script>
2734
+ <script src="../block-navigation.js"></script>
2735
+ </body>
2736
+ </html>
2737
+