@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.
- package/.agentic-flow/intelligence.json +16 -0
- package/README.md +249 -0
- package/__tests__/coverage/base.css +224 -0
- package/__tests__/coverage/block-navigation.js +87 -0
- package/__tests__/coverage/coverage-final.json +19 -0
- package/__tests__/coverage/favicon.png +0 -0
- package/__tests__/coverage/index.html +206 -0
- package/__tests__/coverage/lcov-report/base.css +224 -0
- package/__tests__/coverage/lcov-report/block-navigation.js +87 -0
- package/__tests__/coverage/lcov-report/favicon.png +0 -0
- package/__tests__/coverage/lcov-report/index.html +206 -0
- package/__tests__/coverage/lcov-report/prettify.css +1 -0
- package/__tests__/coverage/lcov-report/prettify.js +2 -0
- package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/lcov-report/sorter.js +210 -0
- package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +2737 -0
- package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +3130 -0
- package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +601 -0
- package/__tests__/coverage/lcov-report/src/application/commands/index.html +131 -0
- package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +394 -0
- package/__tests__/coverage/lcov-report/src/application/queries/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +796 -0
- package/__tests__/coverage/lcov-report/src/application/services/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +793 -0
- package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +1633 -0
- package/__tests__/coverage/lcov-report/src/database-provider.ts.html +1618 -0
- package/__tests__/coverage/lcov-report/src/domain/entities/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +952 -0
- package/__tests__/coverage/lcov-report/src/domain/services/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +1294 -0
- package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +3124 -0
- package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +2167 -0
- package/__tests__/coverage/lcov-report/src/index.html +266 -0
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
- package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/migration.ts.html +2092 -0
- package/__tests__/coverage/lcov-report/src/query-builder.ts.html +1711 -0
- package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +2281 -0
- package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +2374 -0
- package/__tests__/coverage/lcov-report/src/types.ts.html +2266 -0
- package/__tests__/coverage/lcov.info +10238 -0
- package/__tests__/coverage/prettify.css +1 -0
- package/__tests__/coverage/prettify.js +2 -0
- package/__tests__/coverage/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/sorter.js +210 -0
- package/__tests__/coverage/src/agentdb-adapter.ts.html +2737 -0
- package/__tests__/coverage/src/agentdb-backend.ts.html +3130 -0
- package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +601 -0
- package/__tests__/coverage/src/application/commands/index.html +131 -0
- package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +394 -0
- package/__tests__/coverage/src/application/queries/index.html +116 -0
- package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +796 -0
- package/__tests__/coverage/src/application/services/index.html +116 -0
- package/__tests__/coverage/src/application/services/memory-application-service.ts.html +793 -0
- package/__tests__/coverage/src/cache-manager.ts.html +1633 -0
- package/__tests__/coverage/src/database-provider.ts.html +1618 -0
- package/__tests__/coverage/src/domain/entities/index.html +116 -0
- package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +952 -0
- package/__tests__/coverage/src/domain/services/index.html +116 -0
- package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +1294 -0
- package/__tests__/coverage/src/hnsw-index.ts.html +3124 -0
- package/__tests__/coverage/src/hybrid-backend.ts.html +2167 -0
- package/__tests__/coverage/src/index.html +266 -0
- package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +1633 -0
- package/__tests__/coverage/src/infrastructure/repositories/index.html +116 -0
- package/__tests__/coverage/src/migration.ts.html +2092 -0
- package/__tests__/coverage/src/query-builder.ts.html +1711 -0
- package/__tests__/coverage/src/sqlite-backend.ts.html +2281 -0
- package/__tests__/coverage/src/sqljs-backend.ts.html +2374 -0
- package/__tests__/coverage/src/types.ts.html +2266 -0
- package/benchmarks/cache-hit-rate.bench.ts +535 -0
- package/benchmarks/hnsw-indexing.bench.ts +552 -0
- package/benchmarks/memory-write.bench.ts +469 -0
- package/benchmarks/vector-search.bench.ts +449 -0
- package/dist/agentdb-adapter.d.ts +146 -0
- package/dist/agentdb-adapter.d.ts.map +1 -0
- package/dist/agentdb-adapter.js +679 -0
- package/dist/agentdb-adapter.js.map +1 -0
- package/dist/agentdb-backend.d.ts +214 -0
- package/dist/agentdb-backend.d.ts.map +1 -0
- package/dist/agentdb-backend.js +827 -0
- package/dist/agentdb-backend.js.map +1 -0
- package/dist/agentdb-backend.test.d.ts +7 -0
- package/dist/agentdb-backend.test.d.ts.map +1 -0
- package/dist/agentdb-backend.test.js +258 -0
- package/dist/agentdb-backend.test.js.map +1 -0
- package/dist/application/commands/delete-memory.command.d.ts +65 -0
- package/dist/application/commands/delete-memory.command.d.ts.map +1 -0
- package/dist/application/commands/delete-memory.command.js +129 -0
- package/dist/application/commands/delete-memory.command.js.map +1 -0
- package/dist/application/commands/store-memory.command.d.ts +48 -0
- package/dist/application/commands/store-memory.command.d.ts.map +1 -0
- package/dist/application/commands/store-memory.command.js +72 -0
- package/dist/application/commands/store-memory.command.js.map +1 -0
- package/dist/application/index.d.ts +12 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +15 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/queries/search-memory.query.d.ts +72 -0
- package/dist/application/queries/search-memory.query.d.ts.map +1 -0
- package/dist/application/queries/search-memory.query.js +143 -0
- package/dist/application/queries/search-memory.query.js.map +1 -0
- package/dist/application/services/memory-application-service.d.ts +121 -0
- package/dist/application/services/memory-application-service.d.ts.map +1 -0
- package/dist/application/services/memory-application-service.js +190 -0
- package/dist/application/services/memory-application-service.js.map +1 -0
- package/dist/cache-manager.d.ts +134 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +407 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/database-provider.d.ts +86 -0
- package/dist/database-provider.d.ts.map +1 -0
- package/dist/database-provider.js +385 -0
- package/dist/database-provider.js.map +1 -0
- package/dist/database-provider.test.d.ts +7 -0
- package/dist/database-provider.test.d.ts.map +1 -0
- package/dist/database-provider.test.js +285 -0
- package/dist/database-provider.test.js.map +1 -0
- package/dist/domain/entities/memory-entry.d.ts +143 -0
- package/dist/domain/entities/memory-entry.d.ts.map +1 -0
- package/dist/domain/entities/memory-entry.js +226 -0
- package/dist/domain/entities/memory-entry.js.map +1 -0
- package/dist/domain/index.d.ts +11 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +12 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
- package/dist/domain/repositories/memory-repository.interface.d.ts.map +1 -0
- package/dist/domain/repositories/memory-repository.interface.js +11 -0
- package/dist/domain/repositories/memory-repository.interface.js.map +1 -0
- package/dist/domain/services/memory-domain-service.d.ts +105 -0
- package/dist/domain/services/memory-domain-service.d.ts.map +1 -0
- package/dist/domain/services/memory-domain-service.js +297 -0
- package/dist/domain/services/memory-domain-service.js.map +1 -0
- package/dist/hnsw-index.d.ts +111 -0
- package/dist/hnsw-index.d.ts.map +1 -0
- package/dist/hnsw-index.js +781 -0
- package/dist/hnsw-index.js.map +1 -0
- package/dist/hybrid-backend.d.ts +217 -0
- package/dist/hybrid-backend.d.ts.map +1 -0
- package/dist/hybrid-backend.js +491 -0
- package/dist/hybrid-backend.js.map +1 -0
- package/dist/hybrid-backend.test.d.ts +8 -0
- package/dist/hybrid-backend.test.d.ts.map +1 -0
- package/dist/hybrid-backend.test.js +320 -0
- package/dist/hybrid-backend.test.js.map +1 -0
- package/dist/index.d.ts +188 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +345 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +17 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +16 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
- package/dist/infrastructure/repositories/hybrid-memory-repository.js.map +1 -0
- package/dist/migration.d.ts +68 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +513 -0
- package/dist/migration.js.map +1 -0
- package/dist/query-builder.d.ts +211 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +438 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/sqlite-backend.d.ts +121 -0
- package/dist/sqlite-backend.d.ts.map +1 -0
- package/dist/sqlite-backend.js +564 -0
- package/dist/sqlite-backend.js.map +1 -0
- package/dist/sqljs-backend.d.ts +128 -0
- package/dist/sqljs-backend.d.ts.map +1 -0
- package/dist/sqljs-backend.js +598 -0
- package/dist/sqljs-backend.js.map +1 -0
- package/dist/types.d.ts +481 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +58 -0
- package/dist/types.js.map +1 -0
- package/docs/AGENTDB-INTEGRATION.md +388 -0
- package/docs/CROSS_PLATFORM.md +505 -0
- package/docs/WINDOWS_SUPPORT.md +422 -0
- package/examples/agentdb-example.ts +345 -0
- package/examples/cross-platform-usage.ts +326 -0
- package/framework/benchmark.ts +112 -0
- package/package.json +31 -0
- package/src/agentdb-adapter.ts +884 -0
- package/src/agentdb-backend.test.ts +339 -0
- package/src/agentdb-backend.ts +1016 -0
- package/src/application/commands/delete-memory.command.ts +172 -0
- package/src/application/commands/store-memory.command.ts +103 -0
- package/src/application/index.ts +36 -0
- package/src/application/queries/search-memory.query.ts +237 -0
- package/src/application/services/memory-application-service.ts +236 -0
- package/src/cache-manager.ts +516 -0
- package/src/database-provider.test.ts +364 -0
- package/src/database-provider.ts +511 -0
- package/src/domain/entities/memory-entry.ts +289 -0
- package/src/domain/index.ts +35 -0
- package/src/domain/repositories/memory-repository.interface.ts +120 -0
- package/src/domain/services/memory-domain-service.ts +403 -0
- package/src/hnsw-index.ts +1013 -0
- package/src/hybrid-backend.test.ts +399 -0
- package/src/hybrid-backend.ts +694 -0
- package/src/index.ts +515 -0
- package/src/infrastructure/index.ts +23 -0
- package/src/infrastructure/repositories/hybrid-memory-repository.ts +516 -0
- package/src/migration.ts +669 -0
- package/src/query-builder.ts +542 -0
- package/src/sqlite-backend.ts +732 -0
- package/src/sqljs-backend.ts +763 -0
- package/src/types.ts +727 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/verify-cross-platform.ts +170 -0
|
@@ -0,0 +1,3124 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/hnsw-index.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> hnsw-index.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/1013</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/1013</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>
|
|
951
|
+
<a name='L886'></a><a href='#L886'>886</a>
|
|
952
|
+
<a name='L887'></a><a href='#L887'>887</a>
|
|
953
|
+
<a name='L888'></a><a href='#L888'>888</a>
|
|
954
|
+
<a name='L889'></a><a href='#L889'>889</a>
|
|
955
|
+
<a name='L890'></a><a href='#L890'>890</a>
|
|
956
|
+
<a name='L891'></a><a href='#L891'>891</a>
|
|
957
|
+
<a name='L892'></a><a href='#L892'>892</a>
|
|
958
|
+
<a name='L893'></a><a href='#L893'>893</a>
|
|
959
|
+
<a name='L894'></a><a href='#L894'>894</a>
|
|
960
|
+
<a name='L895'></a><a href='#L895'>895</a>
|
|
961
|
+
<a name='L896'></a><a href='#L896'>896</a>
|
|
962
|
+
<a name='L897'></a><a href='#L897'>897</a>
|
|
963
|
+
<a name='L898'></a><a href='#L898'>898</a>
|
|
964
|
+
<a name='L899'></a><a href='#L899'>899</a>
|
|
965
|
+
<a name='L900'></a><a href='#L900'>900</a>
|
|
966
|
+
<a name='L901'></a><a href='#L901'>901</a>
|
|
967
|
+
<a name='L902'></a><a href='#L902'>902</a>
|
|
968
|
+
<a name='L903'></a><a href='#L903'>903</a>
|
|
969
|
+
<a name='L904'></a><a href='#L904'>904</a>
|
|
970
|
+
<a name='L905'></a><a href='#L905'>905</a>
|
|
971
|
+
<a name='L906'></a><a href='#L906'>906</a>
|
|
972
|
+
<a name='L907'></a><a href='#L907'>907</a>
|
|
973
|
+
<a name='L908'></a><a href='#L908'>908</a>
|
|
974
|
+
<a name='L909'></a><a href='#L909'>909</a>
|
|
975
|
+
<a name='L910'></a><a href='#L910'>910</a>
|
|
976
|
+
<a name='L911'></a><a href='#L911'>911</a>
|
|
977
|
+
<a name='L912'></a><a href='#L912'>912</a>
|
|
978
|
+
<a name='L913'></a><a href='#L913'>913</a>
|
|
979
|
+
<a name='L914'></a><a href='#L914'>914</a>
|
|
980
|
+
<a name='L915'></a><a href='#L915'>915</a>
|
|
981
|
+
<a name='L916'></a><a href='#L916'>916</a>
|
|
982
|
+
<a name='L917'></a><a href='#L917'>917</a>
|
|
983
|
+
<a name='L918'></a><a href='#L918'>918</a>
|
|
984
|
+
<a name='L919'></a><a href='#L919'>919</a>
|
|
985
|
+
<a name='L920'></a><a href='#L920'>920</a>
|
|
986
|
+
<a name='L921'></a><a href='#L921'>921</a>
|
|
987
|
+
<a name='L922'></a><a href='#L922'>922</a>
|
|
988
|
+
<a name='L923'></a><a href='#L923'>923</a>
|
|
989
|
+
<a name='L924'></a><a href='#L924'>924</a>
|
|
990
|
+
<a name='L925'></a><a href='#L925'>925</a>
|
|
991
|
+
<a name='L926'></a><a href='#L926'>926</a>
|
|
992
|
+
<a name='L927'></a><a href='#L927'>927</a>
|
|
993
|
+
<a name='L928'></a><a href='#L928'>928</a>
|
|
994
|
+
<a name='L929'></a><a href='#L929'>929</a>
|
|
995
|
+
<a name='L930'></a><a href='#L930'>930</a>
|
|
996
|
+
<a name='L931'></a><a href='#L931'>931</a>
|
|
997
|
+
<a name='L932'></a><a href='#L932'>932</a>
|
|
998
|
+
<a name='L933'></a><a href='#L933'>933</a>
|
|
999
|
+
<a name='L934'></a><a href='#L934'>934</a>
|
|
1000
|
+
<a name='L935'></a><a href='#L935'>935</a>
|
|
1001
|
+
<a name='L936'></a><a href='#L936'>936</a>
|
|
1002
|
+
<a name='L937'></a><a href='#L937'>937</a>
|
|
1003
|
+
<a name='L938'></a><a href='#L938'>938</a>
|
|
1004
|
+
<a name='L939'></a><a href='#L939'>939</a>
|
|
1005
|
+
<a name='L940'></a><a href='#L940'>940</a>
|
|
1006
|
+
<a name='L941'></a><a href='#L941'>941</a>
|
|
1007
|
+
<a name='L942'></a><a href='#L942'>942</a>
|
|
1008
|
+
<a name='L943'></a><a href='#L943'>943</a>
|
|
1009
|
+
<a name='L944'></a><a href='#L944'>944</a>
|
|
1010
|
+
<a name='L945'></a><a href='#L945'>945</a>
|
|
1011
|
+
<a name='L946'></a><a href='#L946'>946</a>
|
|
1012
|
+
<a name='L947'></a><a href='#L947'>947</a>
|
|
1013
|
+
<a name='L948'></a><a href='#L948'>948</a>
|
|
1014
|
+
<a name='L949'></a><a href='#L949'>949</a>
|
|
1015
|
+
<a name='L950'></a><a href='#L950'>950</a>
|
|
1016
|
+
<a name='L951'></a><a href='#L951'>951</a>
|
|
1017
|
+
<a name='L952'></a><a href='#L952'>952</a>
|
|
1018
|
+
<a name='L953'></a><a href='#L953'>953</a>
|
|
1019
|
+
<a name='L954'></a><a href='#L954'>954</a>
|
|
1020
|
+
<a name='L955'></a><a href='#L955'>955</a>
|
|
1021
|
+
<a name='L956'></a><a href='#L956'>956</a>
|
|
1022
|
+
<a name='L957'></a><a href='#L957'>957</a>
|
|
1023
|
+
<a name='L958'></a><a href='#L958'>958</a>
|
|
1024
|
+
<a name='L959'></a><a href='#L959'>959</a>
|
|
1025
|
+
<a name='L960'></a><a href='#L960'>960</a>
|
|
1026
|
+
<a name='L961'></a><a href='#L961'>961</a>
|
|
1027
|
+
<a name='L962'></a><a href='#L962'>962</a>
|
|
1028
|
+
<a name='L963'></a><a href='#L963'>963</a>
|
|
1029
|
+
<a name='L964'></a><a href='#L964'>964</a>
|
|
1030
|
+
<a name='L965'></a><a href='#L965'>965</a>
|
|
1031
|
+
<a name='L966'></a><a href='#L966'>966</a>
|
|
1032
|
+
<a name='L967'></a><a href='#L967'>967</a>
|
|
1033
|
+
<a name='L968'></a><a href='#L968'>968</a>
|
|
1034
|
+
<a name='L969'></a><a href='#L969'>969</a>
|
|
1035
|
+
<a name='L970'></a><a href='#L970'>970</a>
|
|
1036
|
+
<a name='L971'></a><a href='#L971'>971</a>
|
|
1037
|
+
<a name='L972'></a><a href='#L972'>972</a>
|
|
1038
|
+
<a name='L973'></a><a href='#L973'>973</a>
|
|
1039
|
+
<a name='L974'></a><a href='#L974'>974</a>
|
|
1040
|
+
<a name='L975'></a><a href='#L975'>975</a>
|
|
1041
|
+
<a name='L976'></a><a href='#L976'>976</a>
|
|
1042
|
+
<a name='L977'></a><a href='#L977'>977</a>
|
|
1043
|
+
<a name='L978'></a><a href='#L978'>978</a>
|
|
1044
|
+
<a name='L979'></a><a href='#L979'>979</a>
|
|
1045
|
+
<a name='L980'></a><a href='#L980'>980</a>
|
|
1046
|
+
<a name='L981'></a><a href='#L981'>981</a>
|
|
1047
|
+
<a name='L982'></a><a href='#L982'>982</a>
|
|
1048
|
+
<a name='L983'></a><a href='#L983'>983</a>
|
|
1049
|
+
<a name='L984'></a><a href='#L984'>984</a>
|
|
1050
|
+
<a name='L985'></a><a href='#L985'>985</a>
|
|
1051
|
+
<a name='L986'></a><a href='#L986'>986</a>
|
|
1052
|
+
<a name='L987'></a><a href='#L987'>987</a>
|
|
1053
|
+
<a name='L988'></a><a href='#L988'>988</a>
|
|
1054
|
+
<a name='L989'></a><a href='#L989'>989</a>
|
|
1055
|
+
<a name='L990'></a><a href='#L990'>990</a>
|
|
1056
|
+
<a name='L991'></a><a href='#L991'>991</a>
|
|
1057
|
+
<a name='L992'></a><a href='#L992'>992</a>
|
|
1058
|
+
<a name='L993'></a><a href='#L993'>993</a>
|
|
1059
|
+
<a name='L994'></a><a href='#L994'>994</a>
|
|
1060
|
+
<a name='L995'></a><a href='#L995'>995</a>
|
|
1061
|
+
<a name='L996'></a><a href='#L996'>996</a>
|
|
1062
|
+
<a name='L997'></a><a href='#L997'>997</a>
|
|
1063
|
+
<a name='L998'></a><a href='#L998'>998</a>
|
|
1064
|
+
<a name='L999'></a><a href='#L999'>999</a>
|
|
1065
|
+
<a name='L1000'></a><a href='#L1000'>1000</a>
|
|
1066
|
+
<a name='L1001'></a><a href='#L1001'>1001</a>
|
|
1067
|
+
<a name='L1002'></a><a href='#L1002'>1002</a>
|
|
1068
|
+
<a name='L1003'></a><a href='#L1003'>1003</a>
|
|
1069
|
+
<a name='L1004'></a><a href='#L1004'>1004</a>
|
|
1070
|
+
<a name='L1005'></a><a href='#L1005'>1005</a>
|
|
1071
|
+
<a name='L1006'></a><a href='#L1006'>1006</a>
|
|
1072
|
+
<a name='L1007'></a><a href='#L1007'>1007</a>
|
|
1073
|
+
<a name='L1008'></a><a href='#L1008'>1008</a>
|
|
1074
|
+
<a name='L1009'></a><a href='#L1009'>1009</a>
|
|
1075
|
+
<a name='L1010'></a><a href='#L1010'>1010</a>
|
|
1076
|
+
<a name='L1011'></a><a href='#L1011'>1011</a>
|
|
1077
|
+
<a name='L1012'></a><a href='#L1012'>1012</a>
|
|
1078
|
+
<a name='L1013'></a><a href='#L1013'>1013</a>
|
|
1079
|
+
<a name='L1014'></a><a href='#L1014'>1014</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-no"> </span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-no"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-no"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-no"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-no"> </span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-no"> </span>
|
|
1282
|
+
<span class="cline-any cline-no"> </span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-no"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-no"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-no"> </span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-no"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-no"> </span>
|
|
1337
|
+
<span class="cline-any cline-no"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-no"> </span>
|
|
1342
|
+
<span class="cline-any cline-no"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-no"> </span>
|
|
1354
|
+
<span class="cline-any cline-no"> </span>
|
|
1355
|
+
<span class="cline-any cline-no"> </span>
|
|
1356
|
+
<span class="cline-any cline-no"> </span>
|
|
1357
|
+
<span class="cline-any cline-no"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-no"> </span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-no"> </span>
|
|
1379
|
+
<span class="cline-any cline-no"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-no"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-no"> </span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-no"> </span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-no"> </span>
|
|
1397
|
+
<span class="cline-any cline-no"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-no"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-no"> </span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-no"> </span>
|
|
1414
|
+
<span class="cline-any cline-no"> </span>
|
|
1415
|
+
<span class="cline-any cline-no"> </span>
|
|
1416
|
+
<span class="cline-any cline-no"> </span>
|
|
1417
|
+
<span class="cline-any cline-no"> </span>
|
|
1418
|
+
<span class="cline-any cline-no"> </span>
|
|
1419
|
+
<span class="cline-any cline-no"> </span>
|
|
1420
|
+
<span class="cline-any cline-no"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-no"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-no"> </span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-no"> </span>
|
|
1429
|
+
<span class="cline-any cline-no"> </span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-no"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-no"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-no"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-no"> </span>
|
|
1445
|
+
<span class="cline-any cline-no"> </span>
|
|
1446
|
+
<span class="cline-any cline-no"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
|
+
<span class="cline-any cline-no"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-no"> </span>
|
|
1452
|
+
<span class="cline-any cline-no"> </span>
|
|
1453
|
+
<span class="cline-any cline-no"> </span>
|
|
1454
|
+
<span class="cline-any cline-no"> </span>
|
|
1455
|
+
<span class="cline-any cline-no"> </span>
|
|
1456
|
+
<span class="cline-any cline-no"> </span>
|
|
1457
|
+
<span class="cline-any cline-no"> </span>
|
|
1458
|
+
<span class="cline-any cline-no"> </span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-no"> </span>
|
|
1461
|
+
<span class="cline-any cline-no"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </span>
|
|
1465
|
+
<span class="cline-any cline-no"> </span>
|
|
1466
|
+
<span class="cline-any cline-no"> </span>
|
|
1467
|
+
<span class="cline-any cline-no"> </span>
|
|
1468
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
|
+
<span class="cline-any cline-no"> </span>
|
|
1470
|
+
<span class="cline-any cline-no"> </span>
|
|
1471
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
|
+
<span class="cline-any cline-no"> </span>
|
|
1473
|
+
<span class="cline-any cline-no"> </span>
|
|
1474
|
+
<span class="cline-any cline-no"> </span>
|
|
1475
|
+
<span class="cline-any cline-no"> </span>
|
|
1476
|
+
<span class="cline-any cline-no"> </span>
|
|
1477
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-no"> </span>
|
|
1481
|
+
<span class="cline-any cline-no"> </span>
|
|
1482
|
+
<span class="cline-any cline-no"> </span>
|
|
1483
|
+
<span class="cline-any cline-no"> </span>
|
|
1484
|
+
<span class="cline-any cline-no"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-no"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-no"> </span>
|
|
1491
|
+
<span class="cline-any cline-no"> </span>
|
|
1492
|
+
<span class="cline-any cline-no"> </span>
|
|
1493
|
+
<span class="cline-any cline-no"> </span>
|
|
1494
|
+
<span class="cline-any cline-no"> </span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-no"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-no"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-no"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-no"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-no"> </span>
|
|
1513
|
+
<span class="cline-any cline-no"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-no"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-no"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-no"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-no"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-no"> </span>
|
|
1555
|
+
<span class="cline-any cline-no"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-no"> </span>
|
|
1558
|
+
<span class="cline-any cline-no"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-no"> </span>
|
|
1567
|
+
<span class="cline-any cline-no"> </span>
|
|
1568
|
+
<span class="cline-any cline-no"> </span>
|
|
1569
|
+
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-no"> </span>
|
|
1575
|
+
<span class="cline-any cline-no"> </span>
|
|
1576
|
+
<span class="cline-any cline-no"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-no"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
1585
|
+
<span class="cline-any cline-no"> </span>
|
|
1586
|
+
<span class="cline-any cline-no"> </span>
|
|
1587
|
+
<span class="cline-any cline-no"> </span>
|
|
1588
|
+
<span class="cline-any cline-no"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-no"> </span>
|
|
1594
|
+
<span class="cline-any cline-no"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-no"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
1602
|
+
<span class="cline-any cline-no"> </span>
|
|
1603
|
+
<span class="cline-any cline-no"> </span>
|
|
1604
|
+
<span class="cline-any cline-no"> </span>
|
|
1605
|
+
<span class="cline-any cline-no"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-no"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-no"> </span>
|
|
1613
|
+
<span class="cline-any cline-no"> </span>
|
|
1614
|
+
<span class="cline-any cline-no"> </span>
|
|
1615
|
+
<span class="cline-any cline-no"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-no"> </span>
|
|
1618
|
+
<span class="cline-any cline-no"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </span>
|
|
1620
|
+
<span class="cline-any cline-no"> </span>
|
|
1621
|
+
<span class="cline-any cline-no"> </span>
|
|
1622
|
+
<span class="cline-any cline-no"> </span>
|
|
1623
|
+
<span class="cline-any cline-no"> </span>
|
|
1624
|
+
<span class="cline-any cline-no"> </span>
|
|
1625
|
+
<span class="cline-any cline-no"> </span>
|
|
1626
|
+
<span class="cline-any cline-no"> </span>
|
|
1627
|
+
<span class="cline-any cline-no"> </span>
|
|
1628
|
+
<span class="cline-any cline-no"> </span>
|
|
1629
|
+
<span class="cline-any cline-no"> </span>
|
|
1630
|
+
<span class="cline-any cline-no"> </span>
|
|
1631
|
+
<span class="cline-any cline-no"> </span>
|
|
1632
|
+
<span class="cline-any cline-no"> </span>
|
|
1633
|
+
<span class="cline-any cline-no"> </span>
|
|
1634
|
+
<span class="cline-any cline-no"> </span>
|
|
1635
|
+
<span class="cline-any cline-no"> </span>
|
|
1636
|
+
<span class="cline-any cline-no"> </span>
|
|
1637
|
+
<span class="cline-any cline-no"> </span>
|
|
1638
|
+
<span class="cline-any cline-no"> </span>
|
|
1639
|
+
<span class="cline-any cline-no"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-no"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-no"> </span>
|
|
1644
|
+
<span class="cline-any cline-no"> </span>
|
|
1645
|
+
<span class="cline-any cline-no"> </span>
|
|
1646
|
+
<span class="cline-any cline-no"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-no"> </span>
|
|
1649
|
+
<span class="cline-any cline-no"> </span>
|
|
1650
|
+
<span class="cline-any cline-no"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-no"> </span>
|
|
1653
|
+
<span class="cline-any cline-no"> </span>
|
|
1654
|
+
<span class="cline-any cline-no"> </span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-no"> </span>
|
|
1658
|
+
<span class="cline-any cline-no"> </span>
|
|
1659
|
+
<span class="cline-any cline-no"> </span>
|
|
1660
|
+
<span class="cline-any cline-no"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-no"> </span>
|
|
1663
|
+
<span class="cline-any cline-no"> </span>
|
|
1664
|
+
<span class="cline-any cline-no"> </span>
|
|
1665
|
+
<span class="cline-any cline-no"> </span>
|
|
1666
|
+
<span class="cline-any cline-no"> </span>
|
|
1667
|
+
<span class="cline-any cline-no"> </span>
|
|
1668
|
+
<span class="cline-any cline-no"> </span>
|
|
1669
|
+
<span class="cline-any cline-no"> </span>
|
|
1670
|
+
<span class="cline-any cline-no"> </span>
|
|
1671
|
+
<span class="cline-any cline-no"> </span>
|
|
1672
|
+
<span class="cline-any cline-no"> </span>
|
|
1673
|
+
<span class="cline-any cline-no"> </span>
|
|
1674
|
+
<span class="cline-any cline-no"> </span>
|
|
1675
|
+
<span class="cline-any cline-no"> </span>
|
|
1676
|
+
<span class="cline-any cline-no"> </span>
|
|
1677
|
+
<span class="cline-any cline-no"> </span>
|
|
1678
|
+
<span class="cline-any cline-no"> </span>
|
|
1679
|
+
<span class="cline-any cline-no"> </span>
|
|
1680
|
+
<span class="cline-any cline-no"> </span>
|
|
1681
|
+
<span class="cline-any cline-no"> </span>
|
|
1682
|
+
<span class="cline-any cline-no"> </span>
|
|
1683
|
+
<span class="cline-any cline-no"> </span>
|
|
1684
|
+
<span class="cline-any cline-no"> </span>
|
|
1685
|
+
<span class="cline-any cline-no"> </span>
|
|
1686
|
+
<span class="cline-any cline-no"> </span>
|
|
1687
|
+
<span class="cline-any cline-no"> </span>
|
|
1688
|
+
<span class="cline-any cline-no"> </span>
|
|
1689
|
+
<span class="cline-any cline-no"> </span>
|
|
1690
|
+
<span class="cline-any cline-no"> </span>
|
|
1691
|
+
<span class="cline-any cline-no"> </span>
|
|
1692
|
+
<span class="cline-any cline-no"> </span>
|
|
1693
|
+
<span class="cline-any cline-no"> </span>
|
|
1694
|
+
<span class="cline-any cline-no"> </span>
|
|
1695
|
+
<span class="cline-any cline-no"> </span>
|
|
1696
|
+
<span class="cline-any cline-no"> </span>
|
|
1697
|
+
<span class="cline-any cline-no"> </span>
|
|
1698
|
+
<span class="cline-any cline-no"> </span>
|
|
1699
|
+
<span class="cline-any cline-no"> </span>
|
|
1700
|
+
<span class="cline-any cline-no"> </span>
|
|
1701
|
+
<span class="cline-any cline-no"> </span>
|
|
1702
|
+
<span class="cline-any cline-no"> </span>
|
|
1703
|
+
<span class="cline-any cline-no"> </span>
|
|
1704
|
+
<span class="cline-any cline-no"> </span>
|
|
1705
|
+
<span class="cline-any cline-no"> </span>
|
|
1706
|
+
<span class="cline-any cline-no"> </span>
|
|
1707
|
+
<span class="cline-any cline-no"> </span>
|
|
1708
|
+
<span class="cline-any cline-no"> </span>
|
|
1709
|
+
<span class="cline-any cline-no"> </span>
|
|
1710
|
+
<span class="cline-any cline-no"> </span>
|
|
1711
|
+
<span class="cline-any cline-no"> </span>
|
|
1712
|
+
<span class="cline-any cline-no"> </span>
|
|
1713
|
+
<span class="cline-any cline-no"> </span>
|
|
1714
|
+
<span class="cline-any cline-no"> </span>
|
|
1715
|
+
<span class="cline-any cline-no"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-no"> </span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </span>
|
|
1721
|
+
<span class="cline-any cline-no"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-no"> </span>
|
|
1724
|
+
<span class="cline-any cline-no"> </span>
|
|
1725
|
+
<span class="cline-any cline-no"> </span>
|
|
1726
|
+
<span class="cline-any cline-no"> </span>
|
|
1727
|
+
<span class="cline-any cline-no"> </span>
|
|
1728
|
+
<span class="cline-any cline-no"> </span>
|
|
1729
|
+
<span class="cline-any cline-no"> </span>
|
|
1730
|
+
<span class="cline-any cline-no"> </span>
|
|
1731
|
+
<span class="cline-any cline-no"> </span>
|
|
1732
|
+
<span class="cline-any cline-no"> </span>
|
|
1733
|
+
<span class="cline-any cline-no"> </span>
|
|
1734
|
+
<span class="cline-any cline-no"> </span>
|
|
1735
|
+
<span class="cline-any cline-no"> </span>
|
|
1736
|
+
<span class="cline-any cline-no"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-no"> </span>
|
|
1739
|
+
<span class="cline-any cline-no"> </span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-no"> </span>
|
|
1744
|
+
<span class="cline-any cline-no"> </span>
|
|
1745
|
+
<span class="cline-any cline-no"> </span>
|
|
1746
|
+
<span class="cline-any cline-no"> </span>
|
|
1747
|
+
<span class="cline-any cline-no"> </span>
|
|
1748
|
+
<span class="cline-any cline-no"> </span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-no"> </span>
|
|
1751
|
+
<span class="cline-any cline-no"> </span>
|
|
1752
|
+
<span class="cline-any cline-no"> </span>
|
|
1753
|
+
<span class="cline-any cline-no"> </span>
|
|
1754
|
+
<span class="cline-any cline-no"> </span>
|
|
1755
|
+
<span class="cline-any cline-no"> </span>
|
|
1756
|
+
<span class="cline-any cline-no"> </span>
|
|
1757
|
+
<span class="cline-any cline-no"> </span>
|
|
1758
|
+
<span class="cline-any cline-no"> </span>
|
|
1759
|
+
<span class="cline-any cline-no"> </span>
|
|
1760
|
+
<span class="cline-any cline-no"> </span>
|
|
1761
|
+
<span class="cline-any cline-no"> </span>
|
|
1762
|
+
<span class="cline-any cline-no"> </span>
|
|
1763
|
+
<span class="cline-any cline-no"> </span>
|
|
1764
|
+
<span class="cline-any cline-no"> </span>
|
|
1765
|
+
<span class="cline-any cline-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-no"> </span>
|
|
1767
|
+
<span class="cline-any cline-no"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-no"> </span>
|
|
1770
|
+
<span class="cline-any cline-no"> </span>
|
|
1771
|
+
<span class="cline-any cline-no"> </span>
|
|
1772
|
+
<span class="cline-any cline-no"> </span>
|
|
1773
|
+
<span class="cline-any cline-no"> </span>
|
|
1774
|
+
<span class="cline-any cline-no"> </span>
|
|
1775
|
+
<span class="cline-any cline-no"> </span>
|
|
1776
|
+
<span class="cline-any cline-no"> </span>
|
|
1777
|
+
<span class="cline-any cline-no"> </span>
|
|
1778
|
+
<span class="cline-any cline-no"> </span>
|
|
1779
|
+
<span class="cline-any cline-no"> </span>
|
|
1780
|
+
<span class="cline-any cline-no"> </span>
|
|
1781
|
+
<span class="cline-any cline-no"> </span>
|
|
1782
|
+
<span class="cline-any cline-no"> </span>
|
|
1783
|
+
<span class="cline-any cline-no"> </span>
|
|
1784
|
+
<span class="cline-any cline-no"> </span>
|
|
1785
|
+
<span class="cline-any cline-no"> </span>
|
|
1786
|
+
<span class="cline-any cline-no"> </span>
|
|
1787
|
+
<span class="cline-any cline-no"> </span>
|
|
1788
|
+
<span class="cline-any cline-no"> </span>
|
|
1789
|
+
<span class="cline-any cline-no"> </span>
|
|
1790
|
+
<span class="cline-any cline-no"> </span>
|
|
1791
|
+
<span class="cline-any cline-no"> </span>
|
|
1792
|
+
<span class="cline-any cline-no"> </span>
|
|
1793
|
+
<span class="cline-any cline-no"> </span>
|
|
1794
|
+
<span class="cline-any cline-no"> </span>
|
|
1795
|
+
<span class="cline-any cline-no"> </span>
|
|
1796
|
+
<span class="cline-any cline-no"> </span>
|
|
1797
|
+
<span class="cline-any cline-no"> </span>
|
|
1798
|
+
<span class="cline-any cline-no"> </span>
|
|
1799
|
+
<span class="cline-any cline-no"> </span>
|
|
1800
|
+
<span class="cline-any cline-no"> </span>
|
|
1801
|
+
<span class="cline-any cline-no"> </span>
|
|
1802
|
+
<span class="cline-any cline-no"> </span>
|
|
1803
|
+
<span class="cline-any cline-no"> </span>
|
|
1804
|
+
<span class="cline-any cline-no"> </span>
|
|
1805
|
+
<span class="cline-any cline-no"> </span>
|
|
1806
|
+
<span class="cline-any cline-no"> </span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-no"> </span>
|
|
1809
|
+
<span class="cline-any cline-no"> </span>
|
|
1810
|
+
<span class="cline-any cline-no"> </span>
|
|
1811
|
+
<span class="cline-any cline-no"> </span>
|
|
1812
|
+
<span class="cline-any cline-no"> </span>
|
|
1813
|
+
<span class="cline-any cline-no"> </span>
|
|
1814
|
+
<span class="cline-any cline-no"> </span>
|
|
1815
|
+
<span class="cline-any cline-no"> </span>
|
|
1816
|
+
<span class="cline-any cline-no"> </span>
|
|
1817
|
+
<span class="cline-any cline-no"> </span>
|
|
1818
|
+
<span class="cline-any cline-no"> </span>
|
|
1819
|
+
<span class="cline-any cline-no"> </span>
|
|
1820
|
+
<span class="cline-any cline-no"> </span>
|
|
1821
|
+
<span class="cline-any cline-no"> </span>
|
|
1822
|
+
<span class="cline-any cline-no"> </span>
|
|
1823
|
+
<span class="cline-any cline-no"> </span>
|
|
1824
|
+
<span class="cline-any cline-no"> </span>
|
|
1825
|
+
<span class="cline-any cline-no"> </span>
|
|
1826
|
+
<span class="cline-any cline-no"> </span>
|
|
1827
|
+
<span class="cline-any cline-no"> </span>
|
|
1828
|
+
<span class="cline-any cline-no"> </span>
|
|
1829
|
+
<span class="cline-any cline-no"> </span>
|
|
1830
|
+
<span class="cline-any cline-no"> </span>
|
|
1831
|
+
<span class="cline-any cline-no"> </span>
|
|
1832
|
+
<span class="cline-any cline-no"> </span>
|
|
1833
|
+
<span class="cline-any cline-no"> </span>
|
|
1834
|
+
<span class="cline-any cline-no"> </span>
|
|
1835
|
+
<span class="cline-any cline-no"> </span>
|
|
1836
|
+
<span class="cline-any cline-no"> </span>
|
|
1837
|
+
<span class="cline-any cline-no"> </span>
|
|
1838
|
+
<span class="cline-any cline-no"> </span>
|
|
1839
|
+
<span class="cline-any cline-no"> </span>
|
|
1840
|
+
<span class="cline-any cline-no"> </span>
|
|
1841
|
+
<span class="cline-any cline-no"> </span>
|
|
1842
|
+
<span class="cline-any cline-no"> </span>
|
|
1843
|
+
<span class="cline-any cline-no"> </span>
|
|
1844
|
+
<span class="cline-any cline-no"> </span>
|
|
1845
|
+
<span class="cline-any cline-no"> </span>
|
|
1846
|
+
<span class="cline-any cline-no"> </span>
|
|
1847
|
+
<span class="cline-any cline-no"> </span>
|
|
1848
|
+
<span class="cline-any cline-no"> </span>
|
|
1849
|
+
<span class="cline-any cline-no"> </span>
|
|
1850
|
+
<span class="cline-any cline-no"> </span>
|
|
1851
|
+
<span class="cline-any cline-no"> </span>
|
|
1852
|
+
<span class="cline-any cline-no"> </span>
|
|
1853
|
+
<span class="cline-any cline-no"> </span>
|
|
1854
|
+
<span class="cline-any cline-no"> </span>
|
|
1855
|
+
<span class="cline-any cline-no"> </span>
|
|
1856
|
+
<span class="cline-any cline-no"> </span>
|
|
1857
|
+
<span class="cline-any cline-no"> </span>
|
|
1858
|
+
<span class="cline-any cline-no"> </span>
|
|
1859
|
+
<span class="cline-any cline-no"> </span>
|
|
1860
|
+
<span class="cline-any cline-no"> </span>
|
|
1861
|
+
<span class="cline-any cline-no"> </span>
|
|
1862
|
+
<span class="cline-any cline-no"> </span>
|
|
1863
|
+
<span class="cline-any cline-no"> </span>
|
|
1864
|
+
<span class="cline-any cline-no"> </span>
|
|
1865
|
+
<span class="cline-any cline-no"> </span>
|
|
1866
|
+
<span class="cline-any cline-no"> </span>
|
|
1867
|
+
<span class="cline-any cline-no"> </span>
|
|
1868
|
+
<span class="cline-any cline-no"> </span>
|
|
1869
|
+
<span class="cline-any cline-no"> </span>
|
|
1870
|
+
<span class="cline-any cline-no"> </span>
|
|
1871
|
+
<span class="cline-any cline-no"> </span>
|
|
1872
|
+
<span class="cline-any cline-no"> </span>
|
|
1873
|
+
<span class="cline-any cline-no"> </span>
|
|
1874
|
+
<span class="cline-any cline-no"> </span>
|
|
1875
|
+
<span class="cline-any cline-no"> </span>
|
|
1876
|
+
<span class="cline-any cline-no"> </span>
|
|
1877
|
+
<span class="cline-any cline-no"> </span>
|
|
1878
|
+
<span class="cline-any cline-no"> </span>
|
|
1879
|
+
<span class="cline-any cline-no"> </span>
|
|
1880
|
+
<span class="cline-any cline-no"> </span>
|
|
1881
|
+
<span class="cline-any cline-no"> </span>
|
|
1882
|
+
<span class="cline-any cline-no"> </span>
|
|
1883
|
+
<span class="cline-any cline-no"> </span>
|
|
1884
|
+
<span class="cline-any cline-no"> </span>
|
|
1885
|
+
<span class="cline-any cline-no"> </span>
|
|
1886
|
+
<span class="cline-any cline-no"> </span>
|
|
1887
|
+
<span class="cline-any cline-no"> </span>
|
|
1888
|
+
<span class="cline-any cline-no"> </span>
|
|
1889
|
+
<span class="cline-any cline-no"> </span>
|
|
1890
|
+
<span class="cline-any cline-no"> </span>
|
|
1891
|
+
<span class="cline-any cline-no"> </span>
|
|
1892
|
+
<span class="cline-any cline-no"> </span>
|
|
1893
|
+
<span class="cline-any cline-no"> </span>
|
|
1894
|
+
<span class="cline-any cline-no"> </span>
|
|
1895
|
+
<span class="cline-any cline-no"> </span>
|
|
1896
|
+
<span class="cline-any cline-no"> </span>
|
|
1897
|
+
<span class="cline-any cline-no"> </span>
|
|
1898
|
+
<span class="cline-any cline-no"> </span>
|
|
1899
|
+
<span class="cline-any cline-no"> </span>
|
|
1900
|
+
<span class="cline-any cline-no"> </span>
|
|
1901
|
+
<span class="cline-any cline-no"> </span>
|
|
1902
|
+
<span class="cline-any cline-no"> </span>
|
|
1903
|
+
<span class="cline-any cline-no"> </span>
|
|
1904
|
+
<span class="cline-any cline-no"> </span>
|
|
1905
|
+
<span class="cline-any cline-no"> </span>
|
|
1906
|
+
<span class="cline-any cline-no"> </span>
|
|
1907
|
+
<span class="cline-any cline-no"> </span>
|
|
1908
|
+
<span class="cline-any cline-no"> </span>
|
|
1909
|
+
<span class="cline-any cline-no"> </span>
|
|
1910
|
+
<span class="cline-any cline-no"> </span>
|
|
1911
|
+
<span class="cline-any cline-no"> </span>
|
|
1912
|
+
<span class="cline-any cline-no"> </span>
|
|
1913
|
+
<span class="cline-any cline-no"> </span>
|
|
1914
|
+
<span class="cline-any cline-no"> </span>
|
|
1915
|
+
<span class="cline-any cline-no"> </span>
|
|
1916
|
+
<span class="cline-any cline-no"> </span>
|
|
1917
|
+
<span class="cline-any cline-no"> </span>
|
|
1918
|
+
<span class="cline-any cline-no"> </span>
|
|
1919
|
+
<span class="cline-any cline-no"> </span>
|
|
1920
|
+
<span class="cline-any cline-no"> </span>
|
|
1921
|
+
<span class="cline-any cline-no"> </span>
|
|
1922
|
+
<span class="cline-any cline-no"> </span>
|
|
1923
|
+
<span class="cline-any cline-no"> </span>
|
|
1924
|
+
<span class="cline-any cline-no"> </span>
|
|
1925
|
+
<span class="cline-any cline-no"> </span>
|
|
1926
|
+
<span class="cline-any cline-no"> </span>
|
|
1927
|
+
<span class="cline-any cline-no"> </span>
|
|
1928
|
+
<span class="cline-any cline-no"> </span>
|
|
1929
|
+
<span class="cline-any cline-no"> </span>
|
|
1930
|
+
<span class="cline-any cline-no"> </span>
|
|
1931
|
+
<span class="cline-any cline-no"> </span>
|
|
1932
|
+
<span class="cline-any cline-no"> </span>
|
|
1933
|
+
<span class="cline-any cline-no"> </span>
|
|
1934
|
+
<span class="cline-any cline-no"> </span>
|
|
1935
|
+
<span class="cline-any cline-no"> </span>
|
|
1936
|
+
<span class="cline-any cline-no"> </span>
|
|
1937
|
+
<span class="cline-any cline-no"> </span>
|
|
1938
|
+
<span class="cline-any cline-no"> </span>
|
|
1939
|
+
<span class="cline-any cline-no"> </span>
|
|
1940
|
+
<span class="cline-any cline-no"> </span>
|
|
1941
|
+
<span class="cline-any cline-no"> </span>
|
|
1942
|
+
<span class="cline-any cline-no"> </span>
|
|
1943
|
+
<span class="cline-any cline-no"> </span>
|
|
1944
|
+
<span class="cline-any cline-no"> </span>
|
|
1945
|
+
<span class="cline-any cline-no"> </span>
|
|
1946
|
+
<span class="cline-any cline-no"> </span>
|
|
1947
|
+
<span class="cline-any cline-no"> </span>
|
|
1948
|
+
<span class="cline-any cline-no"> </span>
|
|
1949
|
+
<span class="cline-any cline-no"> </span>
|
|
1950
|
+
<span class="cline-any cline-no"> </span>
|
|
1951
|
+
<span class="cline-any cline-no"> </span>
|
|
1952
|
+
<span class="cline-any cline-no"> </span>
|
|
1953
|
+
<span class="cline-any cline-no"> </span>
|
|
1954
|
+
<span class="cline-any cline-no"> </span>
|
|
1955
|
+
<span class="cline-any cline-no"> </span>
|
|
1956
|
+
<span class="cline-any cline-no"> </span>
|
|
1957
|
+
<span class="cline-any cline-no"> </span>
|
|
1958
|
+
<span class="cline-any cline-no"> </span>
|
|
1959
|
+
<span class="cline-any cline-no"> </span>
|
|
1960
|
+
<span class="cline-any cline-no"> </span>
|
|
1961
|
+
<span class="cline-any cline-no"> </span>
|
|
1962
|
+
<span class="cline-any cline-no"> </span>
|
|
1963
|
+
<span class="cline-any cline-no"> </span>
|
|
1964
|
+
<span class="cline-any cline-no"> </span>
|
|
1965
|
+
<span class="cline-any cline-no"> </span>
|
|
1966
|
+
<span class="cline-any cline-no"> </span>
|
|
1967
|
+
<span class="cline-any cline-no"> </span>
|
|
1968
|
+
<span class="cline-any cline-no"> </span>
|
|
1969
|
+
<span class="cline-any cline-no"> </span>
|
|
1970
|
+
<span class="cline-any cline-no"> </span>
|
|
1971
|
+
<span class="cline-any cline-no"> </span>
|
|
1972
|
+
<span class="cline-any cline-no"> </span>
|
|
1973
|
+
<span class="cline-any cline-no"> </span>
|
|
1974
|
+
<span class="cline-any cline-no"> </span>
|
|
1975
|
+
<span class="cline-any cline-no"> </span>
|
|
1976
|
+
<span class="cline-any cline-no"> </span>
|
|
1977
|
+
<span class="cline-any cline-no"> </span>
|
|
1978
|
+
<span class="cline-any cline-no"> </span>
|
|
1979
|
+
<span class="cline-any cline-no"> </span>
|
|
1980
|
+
<span class="cline-any cline-no"> </span>
|
|
1981
|
+
<span class="cline-any cline-no"> </span>
|
|
1982
|
+
<span class="cline-any cline-no"> </span>
|
|
1983
|
+
<span class="cline-any cline-no"> </span>
|
|
1984
|
+
<span class="cline-any cline-no"> </span>
|
|
1985
|
+
<span class="cline-any cline-no"> </span>
|
|
1986
|
+
<span class="cline-any cline-no"> </span>
|
|
1987
|
+
<span class="cline-any cline-no"> </span>
|
|
1988
|
+
<span class="cline-any cline-no"> </span>
|
|
1989
|
+
<span class="cline-any cline-no"> </span>
|
|
1990
|
+
<span class="cline-any cline-no"> </span>
|
|
1991
|
+
<span class="cline-any cline-no"> </span>
|
|
1992
|
+
<span class="cline-any cline-no"> </span>
|
|
1993
|
+
<span class="cline-any cline-no"> </span>
|
|
1994
|
+
<span class="cline-any cline-no"> </span>
|
|
1995
|
+
<span class="cline-any cline-no"> </span>
|
|
1996
|
+
<span class="cline-any cline-no"> </span>
|
|
1997
|
+
<span class="cline-any cline-no"> </span>
|
|
1998
|
+
<span class="cline-any cline-no"> </span>
|
|
1999
|
+
<span class="cline-any cline-no"> </span>
|
|
2000
|
+
<span class="cline-any cline-no"> </span>
|
|
2001
|
+
<span class="cline-any cline-no"> </span>
|
|
2002
|
+
<span class="cline-any cline-no"> </span>
|
|
2003
|
+
<span class="cline-any cline-no"> </span>
|
|
2004
|
+
<span class="cline-any cline-no"> </span>
|
|
2005
|
+
<span class="cline-any cline-no"> </span>
|
|
2006
|
+
<span class="cline-any cline-no"> </span>
|
|
2007
|
+
<span class="cline-any cline-no"> </span>
|
|
2008
|
+
<span class="cline-any cline-no"> </span>
|
|
2009
|
+
<span class="cline-any cline-no"> </span>
|
|
2010
|
+
<span class="cline-any cline-no"> </span>
|
|
2011
|
+
<span class="cline-any cline-no"> </span>
|
|
2012
|
+
<span class="cline-any cline-no"> </span>
|
|
2013
|
+
<span class="cline-any cline-no"> </span>
|
|
2014
|
+
<span class="cline-any cline-no"> </span>
|
|
2015
|
+
<span class="cline-any cline-no"> </span>
|
|
2016
|
+
<span class="cline-any cline-no"> </span>
|
|
2017
|
+
<span class="cline-any cline-no"> </span>
|
|
2018
|
+
<span class="cline-any cline-no"> </span>
|
|
2019
|
+
<span class="cline-any cline-no"> </span>
|
|
2020
|
+
<span class="cline-any cline-no"> </span>
|
|
2021
|
+
<span class="cline-any cline-no"> </span>
|
|
2022
|
+
<span class="cline-any cline-no"> </span>
|
|
2023
|
+
<span class="cline-any cline-no"> </span>
|
|
2024
|
+
<span class="cline-any cline-no"> </span>
|
|
2025
|
+
<span class="cline-any cline-no"> </span>
|
|
2026
|
+
<span class="cline-any cline-no"> </span>
|
|
2027
|
+
<span class="cline-any cline-no"> </span>
|
|
2028
|
+
<span class="cline-any cline-no"> </span>
|
|
2029
|
+
<span class="cline-any cline-no"> </span>
|
|
2030
|
+
<span class="cline-any cline-no"> </span>
|
|
2031
|
+
<span class="cline-any cline-no"> </span>
|
|
2032
|
+
<span class="cline-any cline-no"> </span>
|
|
2033
|
+
<span class="cline-any cline-no"> </span>
|
|
2034
|
+
<span class="cline-any cline-no"> </span>
|
|
2035
|
+
<span class="cline-any cline-no"> </span>
|
|
2036
|
+
<span class="cline-any cline-no"> </span>
|
|
2037
|
+
<span class="cline-any cline-no"> </span>
|
|
2038
|
+
<span class="cline-any cline-no"> </span>
|
|
2039
|
+
<span class="cline-any cline-no"> </span>
|
|
2040
|
+
<span class="cline-any cline-no"> </span>
|
|
2041
|
+
<span class="cline-any cline-no"> </span>
|
|
2042
|
+
<span class="cline-any cline-no"> </span>
|
|
2043
|
+
<span class="cline-any cline-no"> </span>
|
|
2044
|
+
<span class="cline-any cline-no"> </span>
|
|
2045
|
+
<span class="cline-any cline-no"> </span>
|
|
2046
|
+
<span class="cline-any cline-no"> </span>
|
|
2047
|
+
<span class="cline-any cline-no"> </span>
|
|
2048
|
+
<span class="cline-any cline-no"> </span>
|
|
2049
|
+
<span class="cline-any cline-no"> </span>
|
|
2050
|
+
<span class="cline-any cline-no"> </span>
|
|
2051
|
+
<span class="cline-any cline-no"> </span>
|
|
2052
|
+
<span class="cline-any cline-no"> </span>
|
|
2053
|
+
<span class="cline-any cline-no"> </span>
|
|
2054
|
+
<span class="cline-any cline-no"> </span>
|
|
2055
|
+
<span class="cline-any cline-no"> </span>
|
|
2056
|
+
<span class="cline-any cline-no"> </span>
|
|
2057
|
+
<span class="cline-any cline-no"> </span>
|
|
2058
|
+
<span class="cline-any cline-no"> </span>
|
|
2059
|
+
<span class="cline-any cline-no"> </span>
|
|
2060
|
+
<span class="cline-any cline-no"> </span>
|
|
2061
|
+
<span class="cline-any cline-no"> </span>
|
|
2062
|
+
<span class="cline-any cline-no"> </span>
|
|
2063
|
+
<span class="cline-any cline-no"> </span>
|
|
2064
|
+
<span class="cline-any cline-no"> </span>
|
|
2065
|
+
<span class="cline-any cline-no"> </span>
|
|
2066
|
+
<span class="cline-any cline-no"> </span>
|
|
2067
|
+
<span class="cline-any cline-no"> </span>
|
|
2068
|
+
<span class="cline-any cline-no"> </span>
|
|
2069
|
+
<span class="cline-any cline-no"> </span>
|
|
2070
|
+
<span class="cline-any cline-no"> </span>
|
|
2071
|
+
<span class="cline-any cline-no"> </span>
|
|
2072
|
+
<span class="cline-any cline-no"> </span>
|
|
2073
|
+
<span class="cline-any cline-no"> </span>
|
|
2074
|
+
<span class="cline-any cline-no"> </span>
|
|
2075
|
+
<span class="cline-any cline-no"> </span>
|
|
2076
|
+
<span class="cline-any cline-no"> </span>
|
|
2077
|
+
<span class="cline-any cline-no"> </span>
|
|
2078
|
+
<span class="cline-any cline-no"> </span>
|
|
2079
|
+
<span class="cline-any cline-no"> </span>
|
|
2080
|
+
<span class="cline-any cline-no"> </span>
|
|
2081
|
+
<span class="cline-any cline-no"> </span>
|
|
2082
|
+
<span class="cline-any cline-no"> </span>
|
|
2083
|
+
<span class="cline-any cline-no"> </span>
|
|
2084
|
+
<span class="cline-any cline-no"> </span>
|
|
2085
|
+
<span class="cline-any cline-no"> </span>
|
|
2086
|
+
<span class="cline-any cline-no"> </span>
|
|
2087
|
+
<span class="cline-any cline-no"> </span>
|
|
2088
|
+
<span class="cline-any cline-no"> </span>
|
|
2089
|
+
<span class="cline-any cline-no"> </span>
|
|
2090
|
+
<span class="cline-any cline-no"> </span>
|
|
2091
|
+
<span class="cline-any cline-no"> </span>
|
|
2092
|
+
<span class="cline-any cline-neutral"> </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>
|
|
2093
|
+
<span class="cstat-no" title="statement not covered" > * V3 HNSW Vector Index</span>
|
|
2094
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2095
|
+
<span class="cstat-no" title="statement not covered" > * High-performance Hierarchical Navigable Small World (HNSW) index for</span>
|
|
2096
|
+
<span class="cstat-no" title="statement not covered" > * 150x-12,500x faster vector similarity search compared to brute force.</span>
|
|
2097
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" > * OPTIMIZATIONS:</span>
|
|
2099
|
+
<span class="cstat-no" title="statement not covered" > * - BinaryMinHeap/BinaryMaxHeap for O(log n) operations (vs O(n log n) Array.sort)</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" > * - Pre-normalized vectors for O(1) cosine similarity (no sqrt needed)</span>
|
|
2101
|
+
<span class="cstat-no" title="statement not covered" > * - Bounded max-heap for efficient top-k tracking</span>
|
|
2102
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" > * @module v3/memory/hnsw-index</span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" >import { EventEmitter } from 'node:events';</span>
|
|
2107
|
+
<span class="cstat-no" title="statement not covered" >import {</span>
|
|
2108
|
+
<span class="cstat-no" title="statement not covered" > DistanceMetric,</span>
|
|
2109
|
+
<span class="cstat-no" title="statement not covered" > HNSWConfig,</span>
|
|
2110
|
+
<span class="cstat-no" title="statement not covered" > HNSWStats,</span>
|
|
2111
|
+
<span class="cstat-no" title="statement not covered" > QuantizationConfig,</span>
|
|
2112
|
+
<span class="cstat-no" title="statement not covered" > SearchResult,</span>
|
|
2113
|
+
<span class="cstat-no" title="statement not covered" > MemoryEntry,</span>
|
|
2114
|
+
<span class="cstat-no" title="statement not covered" > MemoryEvent,</span>
|
|
2115
|
+
<span class="cstat-no" title="statement not covered" > MemoryEventHandler,</span>
|
|
2116
|
+
<span class="cstat-no" title="statement not covered" >} from './types.js';</span>
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2118
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2119
|
+
<span class="cstat-no" title="statement not covered" > * Binary Min Heap for O(log n) priority queue operations</span>
|
|
2120
|
+
<span class="cstat-no" title="statement not covered" > * Used for candidate selection in HNSW search</span>
|
|
2121
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" >class BinaryMinHeap<T> {</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > private heap: Array<{ item: T; priority: number }> = [];</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2125
|
+
<span class="cstat-no" title="statement not covered" > get size(): number {</span>
|
|
2126
|
+
<span class="cstat-no" title="statement not covered" > return this.heap.length;</span>
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2128
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2129
|
+
<span class="cstat-no" title="statement not covered" > insert(item: T, priority: number): void {</span>
|
|
2130
|
+
<span class="cstat-no" title="statement not covered" > this.heap.push({ item, priority });</span>
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > this.bubbleUp(this.heap.length - 1);</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" > extractMin(): T | undefined {</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap.length === 0) return undefined;</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > const min = this.heap[0].item;</span>
|
|
2137
|
+
<span class="cstat-no" title="statement not covered" > const last = this.heap.pop()!;</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap.length > 0) {</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > this.heap[0] = last;</span>
|
|
2140
|
+
<span class="cstat-no" title="statement not covered" > this.bubbleDown(0);</span>
|
|
2141
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2142
|
+
<span class="cstat-no" title="statement not covered" > return min;</span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2145
|
+
<span class="cstat-no" title="statement not covered" > peek(): T | undefined {</span>
|
|
2146
|
+
<span class="cstat-no" title="statement not covered" > return this.heap[0]?.item;</span>
|
|
2147
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2148
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2149
|
+
<span class="cstat-no" title="statement not covered" > peekPriority(): number | undefined {</span>
|
|
2150
|
+
<span class="cstat-no" title="statement not covered" > return this.heap[0]?.priority;</span>
|
|
2151
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2152
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2153
|
+
<span class="cstat-no" title="statement not covered" > isEmpty(): boolean {</span>
|
|
2154
|
+
<span class="cstat-no" title="statement not covered" > return this.heap.length === 0;</span>
|
|
2155
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2156
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2157
|
+
<span class="cstat-no" title="statement not covered" > toArray(): T[] {</span>
|
|
2158
|
+
<span class="cstat-no" title="statement not covered" > return this.heap</span>
|
|
2159
|
+
<span class="cstat-no" title="statement not covered" > .slice()</span>
|
|
2160
|
+
<span class="cstat-no" title="statement not covered" > .sort((a, b) => a.priority - b.priority)</span>
|
|
2161
|
+
<span class="cstat-no" title="statement not covered" > .map((entry) => entry.item);</span>
|
|
2162
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2163
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2164
|
+
<span class="cstat-no" title="statement not covered" > private bubbleUp(index: number): void {</span>
|
|
2165
|
+
<span class="cstat-no" title="statement not covered" > while (index > 0) {</span>
|
|
2166
|
+
<span class="cstat-no" title="statement not covered" > const parent = Math.floor((index - 1) / 2);</span>
|
|
2167
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap[parent].priority <= this.heap[index].priority) break;</span>
|
|
2168
|
+
<span class="cstat-no" title="statement not covered" > [this.heap[parent], this.heap[index]] = [this.heap[index], this.heap[parent]];</span>
|
|
2169
|
+
<span class="cstat-no" title="statement not covered" > index = parent;</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" ></span>
|
|
2173
|
+
<span class="cstat-no" title="statement not covered" > private bubbleDown(index: number): void {</span>
|
|
2174
|
+
<span class="cstat-no" title="statement not covered" > const length = this.heap.length;</span>
|
|
2175
|
+
<span class="cstat-no" title="statement not covered" > while (true) {</span>
|
|
2176
|
+
<span class="cstat-no" title="statement not covered" > let smallest = index;</span>
|
|
2177
|
+
<span class="cstat-no" title="statement not covered" > const left = 2 * index + 1;</span>
|
|
2178
|
+
<span class="cstat-no" title="statement not covered" > const right = 2 * index + 2;</span>
|
|
2179
|
+
<span class="cstat-no" title="statement not covered" > if (left < length && this.heap[left].priority < this.heap[smallest].priority) {</span>
|
|
2180
|
+
<span class="cstat-no" title="statement not covered" > smallest = left;</span>
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2182
|
+
<span class="cstat-no" title="statement not covered" > if (right < length && this.heap[right].priority < this.heap[smallest].priority) {</span>
|
|
2183
|
+
<span class="cstat-no" title="statement not covered" > smallest = right;</span>
|
|
2184
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" > if (smallest === index) break;</span>
|
|
2186
|
+
<span class="cstat-no" title="statement not covered" > [this.heap[smallest], this.heap[index]] = [this.heap[index], this.heap[smallest]];</span>
|
|
2187
|
+
<span class="cstat-no" title="statement not covered" > index = smallest;</span>
|
|
2188
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2189
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2190
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2191
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2192
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2193
|
+
<span class="cstat-no" title="statement not covered" > * Binary Max Heap for bounded top-k tracking</span>
|
|
2194
|
+
<span class="cstat-no" title="statement not covered" > * Keeps track of k smallest elements by evicting largest when full</span>
|
|
2195
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2196
|
+
<span class="cstat-no" title="statement not covered" >class BinaryMaxHeap<T> {</span>
|
|
2197
|
+
<span class="cstat-no" title="statement not covered" > private heap: Array<{ item: T; priority: number }> = [];</span>
|
|
2198
|
+
<span class="cstat-no" title="statement not covered" > private maxSize: number;</span>
|
|
2199
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2200
|
+
<span class="cstat-no" title="statement not covered" > constructor(maxSize: number = Infinity) {</span>
|
|
2201
|
+
<span class="cstat-no" title="statement not covered" > this.maxSize = maxSize;</span>
|
|
2202
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2203
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2204
|
+
<span class="cstat-no" title="statement not covered" > get size(): number {</span>
|
|
2205
|
+
<span class="cstat-no" title="statement not covered" > return this.heap.length;</span>
|
|
2206
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2207
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2208
|
+
<span class="cstat-no" title="statement not covered" > insert(item: T, priority: number): boolean {</span>
|
|
2209
|
+
<span class="cstat-no" title="statement not covered" > // If at capacity and new item is worse than worst, reject</span>
|
|
2210
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap.length >= this.maxSize && priority >= this.heap[0]?.priority) {</span>
|
|
2211
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
2212
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2213
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2214
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap.length >= this.maxSize) {</span>
|
|
2215
|
+
<span class="cstat-no" title="statement not covered" > // Replace max element</span>
|
|
2216
|
+
<span class="cstat-no" title="statement not covered" > this.heap[0] = { item, priority };</span>
|
|
2217
|
+
<span class="cstat-no" title="statement not covered" > this.bubbleDown(0);</span>
|
|
2218
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2219
|
+
<span class="cstat-no" title="statement not covered" > this.heap.push({ item, priority });</span>
|
|
2220
|
+
<span class="cstat-no" title="statement not covered" > this.bubbleUp(this.heap.length - 1);</span>
|
|
2221
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2222
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
2223
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2224
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2225
|
+
<span class="cstat-no" title="statement not covered" > peekMax(): T | undefined {</span>
|
|
2226
|
+
<span class="cstat-no" title="statement not covered" > return this.heap[0]?.item;</span>
|
|
2227
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2228
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2229
|
+
<span class="cstat-no" title="statement not covered" > peekMaxPriority(): number {</span>
|
|
2230
|
+
<span class="cstat-no" title="statement not covered" > return this.heap[0]?.priority ?? Infinity;</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" > extractMax(): T | undefined {</span>
|
|
2234
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap.length === 0) return undefined;</span>
|
|
2235
|
+
<span class="cstat-no" title="statement not covered" > const max = this.heap[0].item;</span>
|
|
2236
|
+
<span class="cstat-no" title="statement not covered" > const last = this.heap.pop()!;</span>
|
|
2237
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap.length > 0) {</span>
|
|
2238
|
+
<span class="cstat-no" title="statement not covered" > this.heap[0] = last;</span>
|
|
2239
|
+
<span class="cstat-no" title="statement not covered" > this.bubbleDown(0);</span>
|
|
2240
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2241
|
+
<span class="cstat-no" title="statement not covered" > return max;</span>
|
|
2242
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2243
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2244
|
+
<span class="cstat-no" title="statement not covered" > isEmpty(): boolean {</span>
|
|
2245
|
+
<span class="cstat-no" title="statement not covered" > return this.heap.length === 0;</span>
|
|
2246
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2247
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2248
|
+
<span class="cstat-no" title="statement not covered" > toSortedArray(): Array<{ item: T; priority: number }> {</span>
|
|
2249
|
+
<span class="cstat-no" title="statement not covered" > return this.heap.slice().sort((a, b) => a.priority - b.priority);</span>
|
|
2250
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2251
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2252
|
+
<span class="cstat-no" title="statement not covered" > private bubbleUp(index: number): void {</span>
|
|
2253
|
+
<span class="cstat-no" title="statement not covered" > while (index > 0) {</span>
|
|
2254
|
+
<span class="cstat-no" title="statement not covered" > const parent = Math.floor((index - 1) / 2);</span>
|
|
2255
|
+
<span class="cstat-no" title="statement not covered" > if (this.heap[parent].priority >= this.heap[index].priority) break;</span>
|
|
2256
|
+
<span class="cstat-no" title="statement not covered" > [this.heap[parent], this.heap[index]] = [this.heap[index], this.heap[parent]];</span>
|
|
2257
|
+
<span class="cstat-no" title="statement not covered" > index = parent;</span>
|
|
2258
|
+
<span class="cstat-no" title="statement not covered" > }</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" > private bubbleDown(index: number): void {</span>
|
|
2262
|
+
<span class="cstat-no" title="statement not covered" > const length = this.heap.length;</span>
|
|
2263
|
+
<span class="cstat-no" title="statement not covered" > while (true) {</span>
|
|
2264
|
+
<span class="cstat-no" title="statement not covered" > let largest = index;</span>
|
|
2265
|
+
<span class="cstat-no" title="statement not covered" > const left = 2 * index + 1;</span>
|
|
2266
|
+
<span class="cstat-no" title="statement not covered" > const right = 2 * index + 2;</span>
|
|
2267
|
+
<span class="cstat-no" title="statement not covered" > if (left < length && this.heap[left].priority > this.heap[largest].priority) {</span>
|
|
2268
|
+
<span class="cstat-no" title="statement not covered" > largest = left;</span>
|
|
2269
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2270
|
+
<span class="cstat-no" title="statement not covered" > if (right < length && this.heap[right].priority > this.heap[largest].priority) {</span>
|
|
2271
|
+
<span class="cstat-no" title="statement not covered" > largest = right;</span>
|
|
2272
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2273
|
+
<span class="cstat-no" title="statement not covered" > if (largest === index) break;</span>
|
|
2274
|
+
<span class="cstat-no" title="statement not covered" > [this.heap[largest], this.heap[index]] = [this.heap[index], this.heap[largest]];</span>
|
|
2275
|
+
<span class="cstat-no" title="statement not covered" > index = largest;</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" >}</span>
|
|
2279
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2280
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2281
|
+
<span class="cstat-no" title="statement not covered" > * Internal node structure for HNSW graph</span>
|
|
2282
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2283
|
+
<span class="cstat-no" title="statement not covered" >interface HNSWNode {</span>
|
|
2284
|
+
<span class="cstat-no" title="statement not covered" > /** Node ID (memory entry ID) */</span>
|
|
2285
|
+
<span class="cstat-no" title="statement not covered" > id: string;</span>
|
|
2286
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2287
|
+
<span class="cstat-no" title="statement not covered" > /** Vector embedding (original) */</span>
|
|
2288
|
+
<span class="cstat-no" title="statement not covered" > vector: Float32Array;</span>
|
|
2289
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" > /** Pre-normalized vector for O(1) cosine similarity */</span>
|
|
2291
|
+
<span class="cstat-no" title="statement not covered" > normalizedVector: Float32Array | null;</span>
|
|
2292
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2293
|
+
<span class="cstat-no" title="statement not covered" > /** Connections at each layer */</span>
|
|
2294
|
+
<span class="cstat-no" title="statement not covered" > connections: Map<number, Set<string>>;</span>
|
|
2295
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > /** Node level (top layer this node appears in) */</span>
|
|
2297
|
+
<span class="cstat-no" title="statement not covered" > level: number;</span>
|
|
2298
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2299
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2301
|
+
<span class="cstat-no" title="statement not covered" > * HNSW Index implementation for ultra-fast vector similarity search</span>
|
|
2302
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2303
|
+
<span class="cstat-no" title="statement not covered" > * Performance characteristics:</span>
|
|
2304
|
+
<span class="cstat-no" title="statement not covered" > * - Search: O(log n) approximate nearest neighbor</span>
|
|
2305
|
+
<span class="cstat-no" title="statement not covered" > * - Insert: O(log n) amortized</span>
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" > * - Memory: O(n * M * L) where M is max connections, L is layers</span>
|
|
2307
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2308
|
+
<span class="cstat-no" title="statement not covered" >export class HNSWIndex extends EventEmitter {</span>
|
|
2309
|
+
<span class="cstat-no" title="statement not covered" > private config: HNSWConfig;</span>
|
|
2310
|
+
<span class="cstat-no" title="statement not covered" > private nodes: Map<string, HNSWNode> = new Map();</span>
|
|
2311
|
+
<span class="cstat-no" title="statement not covered" > private entryPoint: string | null = null;</span>
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > private maxLevel: number = 0;</span>
|
|
2313
|
+
<span class="cstat-no" title="statement not covered" > private levelMult: number;</span>
|
|
2314
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2315
|
+
<span class="cstat-no" title="statement not covered" > // Performance tracking</span>
|
|
2316
|
+
<span class="cstat-no" title="statement not covered" > private stats: {</span>
|
|
2317
|
+
<span class="cstat-no" title="statement not covered" > searchCount: number;</span>
|
|
2318
|
+
<span class="cstat-no" title="statement not covered" > totalSearchTime: number;</span>
|
|
2319
|
+
<span class="cstat-no" title="statement not covered" > insertCount: number;</span>
|
|
2320
|
+
<span class="cstat-no" title="statement not covered" > totalInsertTime: number;</span>
|
|
2321
|
+
<span class="cstat-no" title="statement not covered" > buildStartTime: number;</span>
|
|
2322
|
+
<span class="cstat-no" title="statement not covered" > } = {</span>
|
|
2323
|
+
<span class="cstat-no" title="statement not covered" > searchCount: 0,</span>
|
|
2324
|
+
<span class="cstat-no" title="statement not covered" > totalSearchTime: 0,</span>
|
|
2325
|
+
<span class="cstat-no" title="statement not covered" > insertCount: 0,</span>
|
|
2326
|
+
<span class="cstat-no" title="statement not covered" > totalInsertTime: 0,</span>
|
|
2327
|
+
<span class="cstat-no" title="statement not covered" > buildStartTime: 0,</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" > // Quantization support</span>
|
|
2331
|
+
<span class="cstat-no" title="statement not covered" > private quantizer: Quantizer | null = null;</span>
|
|
2332
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2333
|
+
<span class="cstat-no" title="statement not covered" > constructor(config: Partial<HNSWConfig> = {}) {</span>
|
|
2334
|
+
<span class="cstat-no" title="statement not covered" > super();</span>
|
|
2335
|
+
<span class="cstat-no" title="statement not covered" > this.config = this.mergeConfig(config);</span>
|
|
2336
|
+
<span class="cstat-no" title="statement not covered" > this.levelMult = 1 / Math.log(this.config.M);</span>
|
|
2337
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2338
|
+
<span class="cstat-no" title="statement not covered" > if (this.config.quantization) {</span>
|
|
2339
|
+
<span class="cstat-no" title="statement not covered" > this.quantizer = new Quantizer(this.config.quantization, this.config.dimensions);</span>
|
|
2340
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2341
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2342
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2343
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2344
|
+
<span class="cstat-no" title="statement not covered" > * Add a vector to the index</span>
|
|
2345
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2346
|
+
<span class="cstat-no" title="statement not covered" > async addPoint(id: string, vector: Float32Array): Promise<void> {</span>
|
|
2347
|
+
<span class="cstat-no" title="statement not covered" > const startTime = performance.now();</span>
|
|
2348
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2349
|
+
<span class="cstat-no" title="statement not covered" > if (vector.length !== this.config.dimensions) {</span>
|
|
2350
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2351
|
+
<span class="cstat-no" title="statement not covered" > `Vector dimension mismatch: expected ${this.config.dimensions}, got ${vector.length}`</span>
|
|
2352
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2353
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2354
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2355
|
+
<span class="cstat-no" title="statement not covered" > if (this.nodes.size >= this.config.maxElements) {</span>
|
|
2356
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Index is full, cannot add more elements');</span>
|
|
2357
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2358
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2359
|
+
<span class="cstat-no" title="statement not covered" > // Quantize if enabled</span>
|
|
2360
|
+
<span class="cstat-no" title="statement not covered" > const storedVector = this.quantizer</span>
|
|
2361
|
+
<span class="cstat-no" title="statement not covered" > ? this.quantizer.encode(vector)</span>
|
|
2362
|
+
<span class="cstat-no" title="statement not covered" > : vector;</span>
|
|
2363
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2364
|
+
<span class="cstat-no" title="statement not covered" > // Pre-normalize vector for O(1) cosine similarity</span>
|
|
2365
|
+
<span class="cstat-no" title="statement not covered" > const normalizedVector = this.config.metric === 'cosine'</span>
|
|
2366
|
+
<span class="cstat-no" title="statement not covered" > ? this.normalizeVector(storedVector)</span>
|
|
2367
|
+
<span class="cstat-no" title="statement not covered" > : null;</span>
|
|
2368
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2369
|
+
<span class="cstat-no" title="statement not covered" > // Generate random level for new node</span>
|
|
2370
|
+
<span class="cstat-no" title="statement not covered" > const level = this.getRandomLevel();</span>
|
|
2371
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2372
|
+
<span class="cstat-no" title="statement not covered" > const node: HNSWNode = {</span>
|
|
2373
|
+
<span class="cstat-no" title="statement not covered" > id,</span>
|
|
2374
|
+
<span class="cstat-no" title="statement not covered" > vector: storedVector,</span>
|
|
2375
|
+
<span class="cstat-no" title="statement not covered" > normalizedVector,</span>
|
|
2376
|
+
<span class="cstat-no" title="statement not covered" > connections: new Map(),</span>
|
|
2377
|
+
<span class="cstat-no" title="statement not covered" > level,</span>
|
|
2378
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2379
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2380
|
+
<span class="cstat-no" title="statement not covered" > // Initialize connection sets for each layer</span>
|
|
2381
|
+
<span class="cstat-no" title="statement not covered" > for (let l = 0; l <= level; l++) {</span>
|
|
2382
|
+
<span class="cstat-no" title="statement not covered" > node.connections.set(l, new Set());</span>
|
|
2383
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2384
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2385
|
+
<span class="cstat-no" title="statement not covered" > if (this.entryPoint === null) {</span>
|
|
2386
|
+
<span class="cstat-no" title="statement not covered" > // First node</span>
|
|
2387
|
+
<span class="cstat-no" title="statement not covered" > this.entryPoint = id;</span>
|
|
2388
|
+
<span class="cstat-no" title="statement not covered" > this.maxLevel = level;</span>
|
|
2389
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.set(id, node);</span>
|
|
2390
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2391
|
+
<span class="cstat-no" title="statement not covered" > // Insert new node into the graph</span>
|
|
2392
|
+
<span class="cstat-no" title="statement not covered" > await this.insertNode(node);</span>
|
|
2393
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2394
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2395
|
+
<span class="cstat-no" title="statement not covered" > const duration = performance.now() - startTime;</span>
|
|
2396
|
+
<span class="cstat-no" title="statement not covered" > this.stats.insertCount++;</span>
|
|
2397
|
+
<span class="cstat-no" title="statement not covered" > this.stats.totalInsertTime += duration;</span>
|
|
2398
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2399
|
+
<span class="cstat-no" title="statement not covered" > this.emit('point:added', { id, level, duration });</span>
|
|
2400
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2401
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2402
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2403
|
+
<span class="cstat-no" title="statement not covered" > * Search for k nearest neighbors</span>
|
|
2404
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2405
|
+
<span class="cstat-no" title="statement not covered" > async search(</span>
|
|
2406
|
+
<span class="cstat-no" title="statement not covered" > query: Float32Array,</span>
|
|
2407
|
+
<span class="cstat-no" title="statement not covered" > k: number,</span>
|
|
2408
|
+
<span class="cstat-no" title="statement not covered" > ef?: number</span>
|
|
2409
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<Array<{ id: string; distance: number }>> {</span>
|
|
2410
|
+
<span class="cstat-no" title="statement not covered" > const startTime = performance.now();</span>
|
|
2411
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2412
|
+
<span class="cstat-no" title="statement not covered" > if (query.length !== this.config.dimensions) {</span>
|
|
2413
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2414
|
+
<span class="cstat-no" title="statement not covered" > `Query dimension mismatch: expected ${this.config.dimensions}, got ${query.length}`</span>
|
|
2415
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2416
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2417
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2418
|
+
<span class="cstat-no" title="statement not covered" > if (this.entryPoint === null) {</span>
|
|
2419
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
2420
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2421
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2422
|
+
<span class="cstat-no" title="statement not covered" > const searchEf = ef || Math.max(k, this.config.efConstruction);</span>
|
|
2423
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2424
|
+
<span class="cstat-no" title="statement not covered" > // Quantize query if needed</span>
|
|
2425
|
+
<span class="cstat-no" title="statement not covered" > const queryVector = this.quantizer</span>
|
|
2426
|
+
<span class="cstat-no" title="statement not covered" > ? this.quantizer.encode(query)</span>
|
|
2427
|
+
<span class="cstat-no" title="statement not covered" > : query;</span>
|
|
2428
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2429
|
+
<span class="cstat-no" title="statement not covered" > // Pre-normalize query for O(1) cosine similarity</span>
|
|
2430
|
+
<span class="cstat-no" title="statement not covered" > const normalizedQuery = this.config.metric === 'cosine'</span>
|
|
2431
|
+
<span class="cstat-no" title="statement not covered" > ? this.normalizeVector(queryVector)</span>
|
|
2432
|
+
<span class="cstat-no" title="statement not covered" > : null;</span>
|
|
2433
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2434
|
+
<span class="cstat-no" title="statement not covered" > // Start from entry point and search down the layers</span>
|
|
2435
|
+
<span class="cstat-no" title="statement not covered" > let currentNode = this.entryPoint;</span>
|
|
2436
|
+
<span class="cstat-no" title="statement not covered" > let currentDist = this.distanceOptimized(</span>
|
|
2437
|
+
<span class="cstat-no" title="statement not covered" > queryVector,</span>
|
|
2438
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery,</span>
|
|
2439
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.get(currentNode)!</span>
|
|
2440
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2441
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2442
|
+
<span class="cstat-no" title="statement not covered" > // Search through layers from top to 1</span>
|
|
2443
|
+
<span class="cstat-no" title="statement not covered" > for (let level = this.maxLevel; level > 0; level--) {</span>
|
|
2444
|
+
<span class="cstat-no" title="statement not covered" > const layerResult = this.searchLayerOptimized(</span>
|
|
2445
|
+
<span class="cstat-no" title="statement not covered" > queryVector,</span>
|
|
2446
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery,</span>
|
|
2447
|
+
<span class="cstat-no" title="statement not covered" > currentNode,</span>
|
|
2448
|
+
<span class="cstat-no" title="statement not covered" > 1,</span>
|
|
2449
|
+
<span class="cstat-no" title="statement not covered" > level</span>
|
|
2450
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2451
|
+
<span class="cstat-no" title="statement not covered" > currentNode = layerResult[0]?.id || currentNode;</span>
|
|
2452
|
+
<span class="cstat-no" title="statement not covered" > currentDist = this.distanceOptimized(</span>
|
|
2453
|
+
<span class="cstat-no" title="statement not covered" > queryVector,</span>
|
|
2454
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery,</span>
|
|
2455
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.get(currentNode)!</span>
|
|
2456
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2457
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2458
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2459
|
+
<span class="cstat-no" title="statement not covered" > // Search layer 0 with ef candidates using heap-based search</span>
|
|
2460
|
+
<span class="cstat-no" title="statement not covered" > const candidates = this.searchLayerOptimized(</span>
|
|
2461
|
+
<span class="cstat-no" title="statement not covered" > queryVector,</span>
|
|
2462
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery,</span>
|
|
2463
|
+
<span class="cstat-no" title="statement not covered" > currentNode,</span>
|
|
2464
|
+
<span class="cstat-no" title="statement not covered" > searchEf,</span>
|
|
2465
|
+
<span class="cstat-no" title="statement not covered" > 0</span>
|
|
2466
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2467
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2468
|
+
<span class="cstat-no" title="statement not covered" > // Return top k results (already sorted by heap)</span>
|
|
2469
|
+
<span class="cstat-no" title="statement not covered" > const results = candidates.slice(0, k);</span>
|
|
2470
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2471
|
+
<span class="cstat-no" title="statement not covered" > const duration = performance.now() - startTime;</span>
|
|
2472
|
+
<span class="cstat-no" title="statement not covered" > this.stats.searchCount++;</span>
|
|
2473
|
+
<span class="cstat-no" title="statement not covered" > this.stats.totalSearchTime += duration;</span>
|
|
2474
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2475
|
+
<span class="cstat-no" title="statement not covered" > return results;</span>
|
|
2476
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2477
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2478
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2479
|
+
<span class="cstat-no" title="statement not covered" > * Search with filters applied post-retrieval</span>
|
|
2480
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2481
|
+
<span class="cstat-no" title="statement not covered" > async searchWithFilters(</span>
|
|
2482
|
+
<span class="cstat-no" title="statement not covered" > query: Float32Array,</span>
|
|
2483
|
+
<span class="cstat-no" title="statement not covered" > k: number,</span>
|
|
2484
|
+
<span class="cstat-no" title="statement not covered" > filter: (id: string) => boolean,</span>
|
|
2485
|
+
<span class="cstat-no" title="statement not covered" > ef?: number</span>
|
|
2486
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<Array<{ id: string; distance: number }>> {</span>
|
|
2487
|
+
<span class="cstat-no" title="statement not covered" > // Over-fetch to account for filtered results</span>
|
|
2488
|
+
<span class="cstat-no" title="statement not covered" > const overFetchFactor = 3;</span>
|
|
2489
|
+
<span class="cstat-no" title="statement not covered" > const candidates = await this.search(query, k * overFetchFactor, ef);</span>
|
|
2490
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2491
|
+
<span class="cstat-no" title="statement not covered" > return candidates</span>
|
|
2492
|
+
<span class="cstat-no" title="statement not covered" > .filter((c) => filter(c.id))</span>
|
|
2493
|
+
<span class="cstat-no" title="statement not covered" > .slice(0, k);</span>
|
|
2494
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2495
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2496
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2497
|
+
<span class="cstat-no" title="statement not covered" > * Remove a point from the index</span>
|
|
2498
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2499
|
+
<span class="cstat-no" title="statement not covered" > async removePoint(id: string): Promise<boolean> {</span>
|
|
2500
|
+
<span class="cstat-no" title="statement not covered" > const node = this.nodes.get(id);</span>
|
|
2501
|
+
<span class="cstat-no" title="statement not covered" > if (!node) {</span>
|
|
2502
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
2503
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2504
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2505
|
+
<span class="cstat-no" title="statement not covered" > // Remove all connections to this node</span>
|
|
2506
|
+
<span class="cstat-no" title="statement not covered" > for (let level = 0; level <= node.level; level++) {</span>
|
|
2507
|
+
<span class="cstat-no" title="statement not covered" > const connections = node.connections.get(level);</span>
|
|
2508
|
+
<span class="cstat-no" title="statement not covered" > if (connections) {</span>
|
|
2509
|
+
<span class="cstat-no" title="statement not covered" > for (const connectedId of connections) {</span>
|
|
2510
|
+
<span class="cstat-no" title="statement not covered" > const connectedNode = this.nodes.get(connectedId);</span>
|
|
2511
|
+
<span class="cstat-no" title="statement not covered" > if (connectedNode) {</span>
|
|
2512
|
+
<span class="cstat-no" title="statement not covered" > connectedNode.connections.get(level)?.delete(id);</span>
|
|
2513
|
+
<span class="cstat-no" title="statement not covered" > }</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" > }</span>
|
|
2517
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2518
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.delete(id);</span>
|
|
2519
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2520
|
+
<span class="cstat-no" title="statement not covered" > // Update entry point if needed</span>
|
|
2521
|
+
<span class="cstat-no" title="statement not covered" > if (this.entryPoint === id) {</span>
|
|
2522
|
+
<span class="cstat-no" title="statement not covered" > if (this.nodes.size === 0) {</span>
|
|
2523
|
+
<span class="cstat-no" title="statement not covered" > this.entryPoint = null;</span>
|
|
2524
|
+
<span class="cstat-no" title="statement not covered" > this.maxLevel = 0;</span>
|
|
2525
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2526
|
+
<span class="cstat-no" title="statement not covered" > // Find new entry point with highest level</span>
|
|
2527
|
+
<span class="cstat-no" title="statement not covered" > let newEntry: string | null = null;</span>
|
|
2528
|
+
<span class="cstat-no" title="statement not covered" > let newMaxLevel = 0;</span>
|
|
2529
|
+
<span class="cstat-no" title="statement not covered" > for (const [nodeId, n] of this.nodes) {</span>
|
|
2530
|
+
<span class="cstat-no" title="statement not covered" > if (newEntry === null || n.level > newMaxLevel) {</span>
|
|
2531
|
+
<span class="cstat-no" title="statement not covered" > newMaxLevel = n.level;</span>
|
|
2532
|
+
<span class="cstat-no" title="statement not covered" > newEntry = nodeId;</span>
|
|
2533
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2534
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2535
|
+
<span class="cstat-no" title="statement not covered" > this.entryPoint = newEntry;</span>
|
|
2536
|
+
<span class="cstat-no" title="statement not covered" > this.maxLevel = newMaxLevel;</span>
|
|
2537
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2538
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2539
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2540
|
+
<span class="cstat-no" title="statement not covered" > this.emit('point:removed', { id });</span>
|
|
2541
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
2542
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2543
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2544
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2545
|
+
<span class="cstat-no" title="statement not covered" > * Rebuild the index from scratch</span>
|
|
2546
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2547
|
+
<span class="cstat-no" title="statement not covered" > async rebuild(</span>
|
|
2548
|
+
<span class="cstat-no" title="statement not covered" > entries: Array<{ id: string; vector: Float32Array }></span>
|
|
2549
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<void> {</span>
|
|
2550
|
+
<span class="cstat-no" title="statement not covered" > this.stats.buildStartTime = performance.now();</span>
|
|
2551
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2552
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.clear();</span>
|
|
2553
|
+
<span class="cstat-no" title="statement not covered" > this.entryPoint = null;</span>
|
|
2554
|
+
<span class="cstat-no" title="statement not covered" > this.maxLevel = 0;</span>
|
|
2555
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2556
|
+
<span class="cstat-no" title="statement not covered" > for (const entry of entries) {</span>
|
|
2557
|
+
<span class="cstat-no" title="statement not covered" > await this.addPoint(entry.id, entry.vector);</span>
|
|
2558
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2559
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2560
|
+
<span class="cstat-no" title="statement not covered" > const buildTime = performance.now() - this.stats.buildStartTime;</span>
|
|
2561
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2562
|
+
<span class="cstat-no" title="statement not covered" > this.emit('index:rebuilt', {</span>
|
|
2563
|
+
<span class="cstat-no" title="statement not covered" > vectorCount: this.nodes.size,</span>
|
|
2564
|
+
<span class="cstat-no" title="statement not covered" > buildTime,</span>
|
|
2565
|
+
<span class="cstat-no" title="statement not covered" > });</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" > * Get index statistics</span>
|
|
2570
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2571
|
+
<span class="cstat-no" title="statement not covered" > getStats(): HNSWStats {</span>
|
|
2572
|
+
<span class="cstat-no" title="statement not covered" > const vectorCount = this.nodes.size;</span>
|
|
2573
|
+
<span class="cstat-no" title="statement not covered" > const avgSearchTime =</span>
|
|
2574
|
+
<span class="cstat-no" title="statement not covered" > this.stats.searchCount > 0</span>
|
|
2575
|
+
<span class="cstat-no" title="statement not covered" > ? this.stats.totalSearchTime / this.stats.searchCount</span>
|
|
2576
|
+
<span class="cstat-no" title="statement not covered" > : 0;</span>
|
|
2577
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2578
|
+
<span class="cstat-no" title="statement not covered" > // Estimate memory usage</span>
|
|
2579
|
+
<span class="cstat-no" title="statement not covered" > const bytesPerVector = this.config.dimensions * 4; // Float32 = 4 bytes</span>
|
|
2580
|
+
<span class="cstat-no" title="statement not covered" > const connectionOverhead = this.config.M * 8 * (this.maxLevel + 1); // Approximate</span>
|
|
2581
|
+
<span class="cstat-no" title="statement not covered" > const memoryUsage = vectorCount * (bytesPerVector + connectionOverhead);</span>
|
|
2582
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2583
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
2584
|
+
<span class="cstat-no" title="statement not covered" > vectorCount,</span>
|
|
2585
|
+
<span class="cstat-no" title="statement not covered" > memoryUsage,</span>
|
|
2586
|
+
<span class="cstat-no" title="statement not covered" > avgSearchTime,</span>
|
|
2587
|
+
<span class="cstat-no" title="statement not covered" > buildTime: performance.now() - this.stats.buildStartTime,</span>
|
|
2588
|
+
<span class="cstat-no" title="statement not covered" > compressionRatio: this.quantizer?.getCompressionRatio() || 1.0,</span>
|
|
2589
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2590
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2591
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2592
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2593
|
+
<span class="cstat-no" title="statement not covered" > * Clear the index</span>
|
|
2594
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2595
|
+
<span class="cstat-no" title="statement not covered" > clear(): void {</span>
|
|
2596
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.clear();</span>
|
|
2597
|
+
<span class="cstat-no" title="statement not covered" > this.entryPoint = null;</span>
|
|
2598
|
+
<span class="cstat-no" title="statement not covered" > this.maxLevel = 0;</span>
|
|
2599
|
+
<span class="cstat-no" title="statement not covered" > this.stats = {</span>
|
|
2600
|
+
<span class="cstat-no" title="statement not covered" > searchCount: 0,</span>
|
|
2601
|
+
<span class="cstat-no" title="statement not covered" > totalSearchTime: 0,</span>
|
|
2602
|
+
<span class="cstat-no" title="statement not covered" > insertCount: 0,</span>
|
|
2603
|
+
<span class="cstat-no" title="statement not covered" > totalInsertTime: 0,</span>
|
|
2604
|
+
<span class="cstat-no" title="statement not covered" > buildStartTime: 0,</span>
|
|
2605
|
+
<span class="cstat-no" title="statement not covered" > };</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" > /**</span>
|
|
2609
|
+
<span class="cstat-no" title="statement not covered" > * Check if an ID exists in the index</span>
|
|
2610
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2611
|
+
<span class="cstat-no" title="statement not covered" > has(id: string): boolean {</span>
|
|
2612
|
+
<span class="cstat-no" title="statement not covered" > return this.nodes.has(id);</span>
|
|
2613
|
+
<span class="cstat-no" title="statement not covered" > }</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" > * Get the number of vectors in the index</span>
|
|
2617
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2618
|
+
<span class="cstat-no" title="statement not covered" > get size(): number {</span>
|
|
2619
|
+
<span class="cstat-no" title="statement not covered" > return this.nodes.size;</span>
|
|
2620
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2621
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2622
|
+
<span class="cstat-no" title="statement not covered" > // ===== Private Methods =====</span>
|
|
2623
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2624
|
+
<span class="cstat-no" title="statement not covered" > private mergeConfig(config: Partial<HNSWConfig>): HNSWConfig {</span>
|
|
2625
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
2626
|
+
<span class="cstat-no" title="statement not covered" > dimensions: config.dimensions || 1536, // OpenAI embedding size</span>
|
|
2627
|
+
<span class="cstat-no" title="statement not covered" > M: config.M || 16,</span>
|
|
2628
|
+
<span class="cstat-no" title="statement not covered" > efConstruction: config.efConstruction || 200,</span>
|
|
2629
|
+
<span class="cstat-no" title="statement not covered" > maxElements: config.maxElements || 1000000,</span>
|
|
2630
|
+
<span class="cstat-no" title="statement not covered" > metric: config.metric || 'cosine',</span>
|
|
2631
|
+
<span class="cstat-no" title="statement not covered" > quantization: config.quantization,</span>
|
|
2632
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2633
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2634
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2635
|
+
<span class="cstat-no" title="statement not covered" > private getRandomLevel(): number {</span>
|
|
2636
|
+
<span class="cstat-no" title="statement not covered" > let level = 0;</span>
|
|
2637
|
+
<span class="cstat-no" title="statement not covered" > while (Math.random() < 0.5 && level < 16) {</span>
|
|
2638
|
+
<span class="cstat-no" title="statement not covered" > level++;</span>
|
|
2639
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2640
|
+
<span class="cstat-no" title="statement not covered" > return level;</span>
|
|
2641
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2642
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2643
|
+
<span class="cstat-no" title="statement not covered" > private async insertNode(node: HNSWNode): Promise<void> {</span>
|
|
2644
|
+
<span class="cstat-no" title="statement not covered" > const query = node.vector;</span>
|
|
2645
|
+
<span class="cstat-no" title="statement not covered" > const normalizedQuery = node.normalizedVector;</span>
|
|
2646
|
+
<span class="cstat-no" title="statement not covered" > let currentNode = this.entryPoint!;</span>
|
|
2647
|
+
<span class="cstat-no" title="statement not covered" > let currentDist = this.distanceOptimized(</span>
|
|
2648
|
+
<span class="cstat-no" title="statement not covered" > query,</span>
|
|
2649
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery,</span>
|
|
2650
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.get(currentNode)!</span>
|
|
2651
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2652
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2653
|
+
<span class="cstat-no" title="statement not covered" > // Find entry point for the node's level</span>
|
|
2654
|
+
<span class="cstat-no" title="statement not covered" > for (let level = this.maxLevel; level > node.level; level--) {</span>
|
|
2655
|
+
<span class="cstat-no" title="statement not covered" > const result = this.searchLayerOptimized(query, normalizedQuery, currentNode, 1, level);</span>
|
|
2656
|
+
<span class="cstat-no" title="statement not covered" > if (result.length > 0 && result[0].distance < currentDist) {</span>
|
|
2657
|
+
<span class="cstat-no" title="statement not covered" > currentNode = result[0].id;</span>
|
|
2658
|
+
<span class="cstat-no" title="statement not covered" > currentDist = result[0].distance;</span>
|
|
2659
|
+
<span class="cstat-no" title="statement not covered" > }</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" > // Insert at each level from node.level down to 0</span>
|
|
2663
|
+
<span class="cstat-no" title="statement not covered" > for (let level = Math.min(node.level, this.maxLevel); level >= 0; level--) {</span>
|
|
2664
|
+
<span class="cstat-no" title="statement not covered" > const neighbors = this.searchLayerOptimized(</span>
|
|
2665
|
+
<span class="cstat-no" title="statement not covered" > query,</span>
|
|
2666
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery,</span>
|
|
2667
|
+
<span class="cstat-no" title="statement not covered" > currentNode,</span>
|
|
2668
|
+
<span class="cstat-no" title="statement not covered" > this.config.efConstruction,</span>
|
|
2669
|
+
<span class="cstat-no" title="statement not covered" > level</span>
|
|
2670
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2671
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2672
|
+
<span class="cstat-no" title="statement not covered" > // Select M best neighbors</span>
|
|
2673
|
+
<span class="cstat-no" title="statement not covered" > const selectedNeighbors = this.selectNeighbors(</span>
|
|
2674
|
+
<span class="cstat-no" title="statement not covered" > node.id,</span>
|
|
2675
|
+
<span class="cstat-no" title="statement not covered" > query,</span>
|
|
2676
|
+
<span class="cstat-no" title="statement not covered" > neighbors,</span>
|
|
2677
|
+
<span class="cstat-no" title="statement not covered" > this.config.M</span>
|
|
2678
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2679
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2680
|
+
<span class="cstat-no" title="statement not covered" > // Add connections</span>
|
|
2681
|
+
<span class="cstat-no" title="statement not covered" > for (const neighbor of selectedNeighbors) {</span>
|
|
2682
|
+
<span class="cstat-no" title="statement not covered" > node.connections.get(level)!.add(neighbor.id);</span>
|
|
2683
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.get(neighbor.id)?.connections.get(level)?.add(node.id);</span>
|
|
2684
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2685
|
+
<span class="cstat-no" title="statement not covered" > // Prune connections if over limit</span>
|
|
2686
|
+
<span class="cstat-no" title="statement not covered" > const neighborNode = this.nodes.get(neighbor.id);</span>
|
|
2687
|
+
<span class="cstat-no" title="statement not covered" > if (neighborNode) {</span>
|
|
2688
|
+
<span class="cstat-no" title="statement not covered" > const neighborConns = neighborNode.connections.get(level)!;</span>
|
|
2689
|
+
<span class="cstat-no" title="statement not covered" > if (neighborConns.size > this.config.M * 2) {</span>
|
|
2690
|
+
<span class="cstat-no" title="statement not covered" > this.pruneConnections(neighborNode, level, this.config.M);</span>
|
|
2691
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2692
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2693
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2694
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2695
|
+
<span class="cstat-no" title="statement not covered" > if (neighbors.length > 0) {</span>
|
|
2696
|
+
<span class="cstat-no" title="statement not covered" > currentNode = neighbors[0].id;</span>
|
|
2697
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2698
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2699
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2700
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.set(node.id, node);</span>
|
|
2701
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2702
|
+
<span class="cstat-no" title="statement not covered" > // Update max level if needed</span>
|
|
2703
|
+
<span class="cstat-no" title="statement not covered" > if (node.level > this.maxLevel) {</span>
|
|
2704
|
+
<span class="cstat-no" title="statement not covered" > this.maxLevel = node.level;</span>
|
|
2705
|
+
<span class="cstat-no" title="statement not covered" > this.entryPoint = node.id;</span>
|
|
2706
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2707
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2708
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2709
|
+
<span class="cstat-no" title="statement not covered" > private async searchLayer(</span>
|
|
2710
|
+
<span class="cstat-no" title="statement not covered" > query: Float32Array,</span>
|
|
2711
|
+
<span class="cstat-no" title="statement not covered" > entryPoint: string,</span>
|
|
2712
|
+
<span class="cstat-no" title="statement not covered" > ef: number,</span>
|
|
2713
|
+
<span class="cstat-no" title="statement not covered" > level: number</span>
|
|
2714
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<Array<{ id: string; distance: number }>> {</span>
|
|
2715
|
+
<span class="cstat-no" title="statement not covered" > const visited = new Set<string>([entryPoint]);</span>
|
|
2716
|
+
<span class="cstat-no" title="statement not covered" > const candidates: Array<{ id: string; distance: number }> = [];</span>
|
|
2717
|
+
<span class="cstat-no" title="statement not covered" > const results: Array<{ id: string; distance: number }> = [];</span>
|
|
2718
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2719
|
+
<span class="cstat-no" title="statement not covered" > const entryDist = this.distance(query, this.nodes.get(entryPoint)!.vector);</span>
|
|
2720
|
+
<span class="cstat-no" title="statement not covered" > candidates.push({ id: entryPoint, distance: entryDist });</span>
|
|
2721
|
+
<span class="cstat-no" title="statement not covered" > results.push({ id: entryPoint, distance: entryDist });</span>
|
|
2722
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2723
|
+
<span class="cstat-no" title="statement not covered" > while (candidates.length > 0) {</span>
|
|
2724
|
+
<span class="cstat-no" title="statement not covered" > // Get closest candidate</span>
|
|
2725
|
+
<span class="cstat-no" title="statement not covered" > candidates.sort((a, b) => a.distance - b.distance);</span>
|
|
2726
|
+
<span class="cstat-no" title="statement not covered" > const current = candidates.shift()!;</span>
|
|
2727
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2728
|
+
<span class="cstat-no" title="statement not covered" > // Check termination condition</span>
|
|
2729
|
+
<span class="cstat-no" title="statement not covered" > const worstResult = results.length > 0</span>
|
|
2730
|
+
<span class="cstat-no" title="statement not covered" > ? Math.max(...results.map((r) => r.distance))</span>
|
|
2731
|
+
<span class="cstat-no" title="statement not covered" > : Infinity;</span>
|
|
2732
|
+
<span class="cstat-no" title="statement not covered" > if (current.distance > worstResult && results.length >= ef) {</span>
|
|
2733
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
2734
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2735
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2736
|
+
<span class="cstat-no" title="statement not covered" > // Explore neighbors</span>
|
|
2737
|
+
<span class="cstat-no" title="statement not covered" > const node = this.nodes.get(current.id);</span>
|
|
2738
|
+
<span class="cstat-no" title="statement not covered" > if (!node) continue;</span>
|
|
2739
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2740
|
+
<span class="cstat-no" title="statement not covered" > const connections = node.connections.get(level);</span>
|
|
2741
|
+
<span class="cstat-no" title="statement not covered" > if (!connections) continue;</span>
|
|
2742
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2743
|
+
<span class="cstat-no" title="statement not covered" > for (const neighborId of connections) {</span>
|
|
2744
|
+
<span class="cstat-no" title="statement not covered" > if (visited.has(neighborId)) continue;</span>
|
|
2745
|
+
<span class="cstat-no" title="statement not covered" > visited.add(neighborId);</span>
|
|
2746
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2747
|
+
<span class="cstat-no" title="statement not covered" > const neighborNode = this.nodes.get(neighborId);</span>
|
|
2748
|
+
<span class="cstat-no" title="statement not covered" > if (!neighborNode) continue;</span>
|
|
2749
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2750
|
+
<span class="cstat-no" title="statement not covered" > const distance = this.distance(query, neighborNode.vector);</span>
|
|
2751
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2752
|
+
<span class="cstat-no" title="statement not covered" > if (results.length < ef || distance < worstResult) {</span>
|
|
2753
|
+
<span class="cstat-no" title="statement not covered" > candidates.push({ id: neighborId, distance });</span>
|
|
2754
|
+
<span class="cstat-no" title="statement not covered" > results.push({ id: neighborId, distance });</span>
|
|
2755
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2756
|
+
<span class="cstat-no" title="statement not covered" > // Keep results bounded</span>
|
|
2757
|
+
<span class="cstat-no" title="statement not covered" > if (results.length > ef) {</span>
|
|
2758
|
+
<span class="cstat-no" title="statement not covered" > results.sort((a, b) => a.distance - b.distance);</span>
|
|
2759
|
+
<span class="cstat-no" title="statement not covered" > results.pop();</span>
|
|
2760
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2761
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2762
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2763
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2764
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2765
|
+
<span class="cstat-no" title="statement not covered" > return results.sort((a, b) => a.distance - b.distance);</span>
|
|
2766
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2767
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2768
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2769
|
+
<span class="cstat-no" title="statement not covered" > * OPTIMIZED searchLayer using heap-based priority queues</span>
|
|
2770
|
+
<span class="cstat-no" title="statement not covered" > * Performance: O(log n) per operation vs O(n log n) for Array.sort()</span>
|
|
2771
|
+
<span class="cstat-no" title="statement not covered" > * Expected speedup: 3-5x for large result sets</span>
|
|
2772
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2773
|
+
<span class="cstat-no" title="statement not covered" > private searchLayerOptimized(</span>
|
|
2774
|
+
<span class="cstat-no" title="statement not covered" > query: Float32Array,</span>
|
|
2775
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery: Float32Array | null,</span>
|
|
2776
|
+
<span class="cstat-no" title="statement not covered" > entryPoint: string,</span>
|
|
2777
|
+
<span class="cstat-no" title="statement not covered" > ef: number,</span>
|
|
2778
|
+
<span class="cstat-no" title="statement not covered" > level: number</span>
|
|
2779
|
+
<span class="cstat-no" title="statement not covered" > ): Array<{ id: string; distance: number }> {</span>
|
|
2780
|
+
<span class="cstat-no" title="statement not covered" > const visited = new Set<string>([entryPoint]);</span>
|
|
2781
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2782
|
+
<span class="cstat-no" title="statement not covered" > // Min-heap for candidates (closest first for expansion)</span>
|
|
2783
|
+
<span class="cstat-no" title="statement not covered" > const candidates = new BinaryMinHeap<string>();</span>
|
|
2784
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2785
|
+
<span class="cstat-no" title="statement not covered" > // Max-heap for results (bounded size, tracks worst distance efficiently)</span>
|
|
2786
|
+
<span class="cstat-no" title="statement not covered" > const results = new BinaryMaxHeap<string>(ef);</span>
|
|
2787
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2788
|
+
<span class="cstat-no" title="statement not covered" > const entryNode = this.nodes.get(entryPoint)!;</span>
|
|
2789
|
+
<span class="cstat-no" title="statement not covered" > const entryDist = this.distanceOptimized(query, normalizedQuery, entryNode);</span>
|
|
2790
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2791
|
+
<span class="cstat-no" title="statement not covered" > candidates.insert(entryPoint, entryDist);</span>
|
|
2792
|
+
<span class="cstat-no" title="statement not covered" > results.insert(entryPoint, entryDist);</span>
|
|
2793
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2794
|
+
<span class="cstat-no" title="statement not covered" > while (!candidates.isEmpty()) {</span>
|
|
2795
|
+
<span class="cstat-no" title="statement not covered" > // Get closest candidate - O(log n)</span>
|
|
2796
|
+
<span class="cstat-no" title="statement not covered" > const currentDist = candidates.peekPriority()!;</span>
|
|
2797
|
+
<span class="cstat-no" title="statement not covered" > const currentId = candidates.extractMin()!;</span>
|
|
2798
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2799
|
+
<span class="cstat-no" title="statement not covered" > // Check termination: if closest candidate is worse than worst result, stop</span>
|
|
2800
|
+
<span class="cstat-no" title="statement not covered" > const worstResultDist = results.peekMaxPriority();</span>
|
|
2801
|
+
<span class="cstat-no" title="statement not covered" > if (currentDist > worstResultDist && results.size >= ef) {</span>
|
|
2802
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
2803
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2804
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2805
|
+
<span class="cstat-no" title="statement not covered" > // Explore neighbors</span>
|
|
2806
|
+
<span class="cstat-no" title="statement not covered" > const node = this.nodes.get(currentId);</span>
|
|
2807
|
+
<span class="cstat-no" title="statement not covered" > if (!node) continue;</span>
|
|
2808
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2809
|
+
<span class="cstat-no" title="statement not covered" > const connections = node.connections.get(level);</span>
|
|
2810
|
+
<span class="cstat-no" title="statement not covered" > if (!connections) continue;</span>
|
|
2811
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2812
|
+
<span class="cstat-no" title="statement not covered" > for (const neighborId of connections) {</span>
|
|
2813
|
+
<span class="cstat-no" title="statement not covered" > if (visited.has(neighborId)) continue;</span>
|
|
2814
|
+
<span class="cstat-no" title="statement not covered" > visited.add(neighborId);</span>
|
|
2815
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2816
|
+
<span class="cstat-no" title="statement not covered" > const neighborNode = this.nodes.get(neighborId);</span>
|
|
2817
|
+
<span class="cstat-no" title="statement not covered" > if (!neighborNode) continue;</span>
|
|
2818
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2819
|
+
<span class="cstat-no" title="statement not covered" > const distance = this.distanceOptimized(query, normalizedQuery, neighborNode);</span>
|
|
2820
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2821
|
+
<span class="cstat-no" title="statement not covered" > // Only add if within threshold or results not full</span>
|
|
2822
|
+
<span class="cstat-no" title="statement not covered" > if (results.size < ef || distance < worstResultDist) {</span>
|
|
2823
|
+
<span class="cstat-no" title="statement not covered" > candidates.insert(neighborId, distance);</span>
|
|
2824
|
+
<span class="cstat-no" title="statement not covered" > // Max-heap handles size bounding automatically - O(log n)</span>
|
|
2825
|
+
<span class="cstat-no" title="statement not covered" > results.insert(neighborId, distance);</span>
|
|
2826
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2827
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2828
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2829
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2830
|
+
<span class="cstat-no" title="statement not covered" > // Return sorted results</span>
|
|
2831
|
+
<span class="cstat-no" title="statement not covered" > return results.toSortedArray().map(({ item, priority }) => ({</span>
|
|
2832
|
+
<span class="cstat-no" title="statement not covered" > id: item,</span>
|
|
2833
|
+
<span class="cstat-no" title="statement not covered" > distance: priority,</span>
|
|
2834
|
+
<span class="cstat-no" title="statement not covered" > }));</span>
|
|
2835
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2836
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2837
|
+
<span class="cstat-no" title="statement not covered" > private selectNeighbors(</span>
|
|
2838
|
+
<span class="cstat-no" title="statement not covered" > nodeId: string,</span>
|
|
2839
|
+
<span class="cstat-no" title="statement not covered" > query: Float32Array,</span>
|
|
2840
|
+
<span class="cstat-no" title="statement not covered" > candidates: Array<{ id: string; distance: number }>,</span>
|
|
2841
|
+
<span class="cstat-no" title="statement not covered" > M: number</span>
|
|
2842
|
+
<span class="cstat-no" title="statement not covered" > ): Array<{ id: string; distance: number }> {</span>
|
|
2843
|
+
<span class="cstat-no" title="statement not covered" > // Simple selection: take M closest</span>
|
|
2844
|
+
<span class="cstat-no" title="statement not covered" > return candidates</span>
|
|
2845
|
+
<span class="cstat-no" title="statement not covered" > .filter((c) => c.id !== nodeId)</span>
|
|
2846
|
+
<span class="cstat-no" title="statement not covered" > .sort((a, b) => a.distance - b.distance)</span>
|
|
2847
|
+
<span class="cstat-no" title="statement not covered" > .slice(0, M);</span>
|
|
2848
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2849
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2850
|
+
<span class="cstat-no" title="statement not covered" > private pruneConnections(node: HNSWNode, level: number, maxConnections: number): void {</span>
|
|
2851
|
+
<span class="cstat-no" title="statement not covered" > const connections = node.connections.get(level);</span>
|
|
2852
|
+
<span class="cstat-no" title="statement not covered" > if (!connections || connections.size <= maxConnections) return;</span>
|
|
2853
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2854
|
+
<span class="cstat-no" title="statement not covered" > // Calculate distances to all connections</span>
|
|
2855
|
+
<span class="cstat-no" title="statement not covered" > const distances: Array<{ id: string; distance: number }> = [];</span>
|
|
2856
|
+
<span class="cstat-no" title="statement not covered" > for (const connId of connections) {</span>
|
|
2857
|
+
<span class="cstat-no" title="statement not covered" > const connNode = this.nodes.get(connId);</span>
|
|
2858
|
+
<span class="cstat-no" title="statement not covered" > if (connNode) {</span>
|
|
2859
|
+
<span class="cstat-no" title="statement not covered" > distances.push({</span>
|
|
2860
|
+
<span class="cstat-no" title="statement not covered" > id: connId,</span>
|
|
2861
|
+
<span class="cstat-no" title="statement not covered" > distance: this.distance(node.vector, connNode.vector),</span>
|
|
2862
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2863
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2864
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2865
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2866
|
+
<span class="cstat-no" title="statement not covered" > // Keep only the closest ones</span>
|
|
2867
|
+
<span class="cstat-no" title="statement not covered" > distances.sort((a, b) => a.distance - b.distance);</span>
|
|
2868
|
+
<span class="cstat-no" title="statement not covered" > const toKeep = new Set(distances.slice(0, maxConnections).map((d) => d.id));</span>
|
|
2869
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2870
|
+
<span class="cstat-no" title="statement not covered" > // Remove excess connections</span>
|
|
2871
|
+
<span class="cstat-no" title="statement not covered" > for (const connId of connections) {</span>
|
|
2872
|
+
<span class="cstat-no" title="statement not covered" > if (!toKeep.has(connId)) {</span>
|
|
2873
|
+
<span class="cstat-no" title="statement not covered" > connections.delete(connId);</span>
|
|
2874
|
+
<span class="cstat-no" title="statement not covered" > this.nodes.get(connId)?.connections.get(level)?.delete(node.id);</span>
|
|
2875
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2876
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2877
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2878
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2879
|
+
<span class="cstat-no" title="statement not covered" > private distance(a: Float32Array, b: Float32Array): number {</span>
|
|
2880
|
+
<span class="cstat-no" title="statement not covered" > switch (this.config.metric) {</span>
|
|
2881
|
+
<span class="cstat-no" title="statement not covered" > case 'cosine':</span>
|
|
2882
|
+
<span class="cstat-no" title="statement not covered" > return this.cosineDistance(a, b);</span>
|
|
2883
|
+
<span class="cstat-no" title="statement not covered" > case 'euclidean':</span>
|
|
2884
|
+
<span class="cstat-no" title="statement not covered" > return this.euclideanDistance(a, b);</span>
|
|
2885
|
+
<span class="cstat-no" title="statement not covered" > case 'dot':</span>
|
|
2886
|
+
<span class="cstat-no" title="statement not covered" > return this.dotProductDistance(a, b);</span>
|
|
2887
|
+
<span class="cstat-no" title="statement not covered" > case 'manhattan':</span>
|
|
2888
|
+
<span class="cstat-no" title="statement not covered" > return this.manhattanDistance(a, b);</span>
|
|
2889
|
+
<span class="cstat-no" title="statement not covered" > default:</span>
|
|
2890
|
+
<span class="cstat-no" title="statement not covered" > return this.cosineDistance(a, b);</span>
|
|
2891
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2892
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2893
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2894
|
+
<span class="cstat-no" title="statement not covered" > private cosineDistance(a: Float32Array, b: Float32Array): number {</span>
|
|
2895
|
+
<span class="cstat-no" title="statement not covered" > let dotProduct = 0;</span>
|
|
2896
|
+
<span class="cstat-no" title="statement not covered" > let normA = 0;</span>
|
|
2897
|
+
<span class="cstat-no" title="statement not covered" > let normB = 0;</span>
|
|
2898
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2899
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < a.length; i++) {</span>
|
|
2900
|
+
<span class="cstat-no" title="statement not covered" > dotProduct += a[i] * b[i];</span>
|
|
2901
|
+
<span class="cstat-no" title="statement not covered" > normA += a[i] * a[i];</span>
|
|
2902
|
+
<span class="cstat-no" title="statement not covered" > normB += b[i] * b[i];</span>
|
|
2903
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2904
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2905
|
+
<span class="cstat-no" title="statement not covered" > const similarity = dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));</span>
|
|
2906
|
+
<span class="cstat-no" title="statement not covered" > return 1 - similarity; // Convert to distance</span>
|
|
2907
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2908
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2909
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2910
|
+
<span class="cstat-no" title="statement not covered" > * OPTIMIZED: Cosine distance using pre-normalized vectors</span>
|
|
2911
|
+
<span class="cstat-no" title="statement not covered" > * Only requires dot product (no sqrt operations)</span>
|
|
2912
|
+
<span class="cstat-no" title="statement not covered" > * Performance: O(n) with ~2x speedup over standard cosine</span>
|
|
2913
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2914
|
+
<span class="cstat-no" title="statement not covered" > private cosineDistanceNormalized(a: Float32Array, b: Float32Array): number {</span>
|
|
2915
|
+
<span class="cstat-no" title="statement not covered" > let dotProduct = 0;</span>
|
|
2916
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < a.length; i++) {</span>
|
|
2917
|
+
<span class="cstat-no" title="statement not covered" > dotProduct += a[i] * b[i];</span>
|
|
2918
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2919
|
+
<span class="cstat-no" title="statement not covered" > // For normalized vectors: cosine_similarity = dot_product</span>
|
|
2920
|
+
<span class="cstat-no" title="statement not covered" > // Return distance (1 - similarity)</span>
|
|
2921
|
+
<span class="cstat-no" title="statement not covered" > return 1 - dotProduct;</span>
|
|
2922
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2923
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2924
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2925
|
+
<span class="cstat-no" title="statement not covered" > * Normalize a vector to unit length for O(1) cosine similarity</span>
|
|
2926
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2927
|
+
<span class="cstat-no" title="statement not covered" > private normalizeVector(vector: Float32Array): Float32Array {</span>
|
|
2928
|
+
<span class="cstat-no" title="statement not covered" > let norm = 0;</span>
|
|
2929
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < vector.length; i++) {</span>
|
|
2930
|
+
<span class="cstat-no" title="statement not covered" > norm += vector[i] * vector[i];</span>
|
|
2931
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2932
|
+
<span class="cstat-no" title="statement not covered" > norm = Math.sqrt(norm);</span>
|
|
2933
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2934
|
+
<span class="cstat-no" title="statement not covered" > if (norm === 0) {</span>
|
|
2935
|
+
<span class="cstat-no" title="statement not covered" > return vector; // Return as-is if zero vector</span>
|
|
2936
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2937
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2938
|
+
<span class="cstat-no" title="statement not covered" > const normalized = new Float32Array(vector.length);</span>
|
|
2939
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < vector.length; i++) {</span>
|
|
2940
|
+
<span class="cstat-no" title="statement not covered" > normalized[i] = vector[i] / norm;</span>
|
|
2941
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2942
|
+
<span class="cstat-no" title="statement not covered" > return normalized;</span>
|
|
2943
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2944
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2945
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2946
|
+
<span class="cstat-no" title="statement not covered" > * OPTIMIZED distance calculation that uses pre-normalized vectors when available</span>
|
|
2947
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2948
|
+
<span class="cstat-no" title="statement not covered" > private distanceOptimized(</span>
|
|
2949
|
+
<span class="cstat-no" title="statement not covered" > query: Float32Array,</span>
|
|
2950
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery: Float32Array | null,</span>
|
|
2951
|
+
<span class="cstat-no" title="statement not covered" > node: HNSWNode</span>
|
|
2952
|
+
<span class="cstat-no" title="statement not covered" > ): number {</span>
|
|
2953
|
+
<span class="cstat-no" title="statement not covered" > // Use optimized path for cosine with pre-normalized vectors</span>
|
|
2954
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
2955
|
+
<span class="cstat-no" title="statement not covered" > this.config.metric === 'cosine' &&</span>
|
|
2956
|
+
<span class="cstat-no" title="statement not covered" > normalizedQuery !== null &&</span>
|
|
2957
|
+
<span class="cstat-no" title="statement not covered" > node.normalizedVector !== null</span>
|
|
2958
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
2959
|
+
<span class="cstat-no" title="statement not covered" > return this.cosineDistanceNormalized(normalizedQuery, node.normalizedVector);</span>
|
|
2960
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2961
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2962
|
+
<span class="cstat-no" title="statement not covered" > // Fall back to standard distance calculation</span>
|
|
2963
|
+
<span class="cstat-no" title="statement not covered" > return this.distance(query, node.vector);</span>
|
|
2964
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2965
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2966
|
+
<span class="cstat-no" title="statement not covered" > private euclideanDistance(a: Float32Array, b: Float32Array): number {</span>
|
|
2967
|
+
<span class="cstat-no" title="statement not covered" > let sum = 0;</span>
|
|
2968
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < a.length; i++) {</span>
|
|
2969
|
+
<span class="cstat-no" title="statement not covered" > const diff = a[i] - b[i];</span>
|
|
2970
|
+
<span class="cstat-no" title="statement not covered" > sum += diff * diff;</span>
|
|
2971
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2972
|
+
<span class="cstat-no" title="statement not covered" > return Math.sqrt(sum);</span>
|
|
2973
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2974
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2975
|
+
<span class="cstat-no" title="statement not covered" > private dotProductDistance(a: Float32Array, b: Float32Array): number {</span>
|
|
2976
|
+
<span class="cstat-no" title="statement not covered" > let dotProduct = 0;</span>
|
|
2977
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < a.length; i++) {</span>
|
|
2978
|
+
<span class="cstat-no" title="statement not covered" > dotProduct += a[i] * b[i];</span>
|
|
2979
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2980
|
+
<span class="cstat-no" title="statement not covered" > // Negative because higher dot product = more similar</span>
|
|
2981
|
+
<span class="cstat-no" title="statement not covered" > return -dotProduct;</span>
|
|
2982
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2983
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2984
|
+
<span class="cstat-no" title="statement not covered" > private manhattanDistance(a: Float32Array, b: Float32Array): number {</span>
|
|
2985
|
+
<span class="cstat-no" title="statement not covered" > let sum = 0;</span>
|
|
2986
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < a.length; i++) {</span>
|
|
2987
|
+
<span class="cstat-no" title="statement not covered" > sum += Math.abs(a[i] - b[i]);</span>
|
|
2988
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2989
|
+
<span class="cstat-no" title="statement not covered" > return sum;</span>
|
|
2990
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2991
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2992
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2993
|
+
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
2994
|
+
<span class="cstat-no" title="statement not covered" > * Quantizer for vector compression</span>
|
|
2995
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2996
|
+
<span class="cstat-no" title="statement not covered" >class Quantizer {</span>
|
|
2997
|
+
<span class="cstat-no" title="statement not covered" > private config: QuantizationConfig;</span>
|
|
2998
|
+
<span class="cstat-no" title="statement not covered" > private dimensions: number;</span>
|
|
2999
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3000
|
+
<span class="cstat-no" title="statement not covered" > constructor(config: QuantizationConfig, dimensions: number) {</span>
|
|
3001
|
+
<span class="cstat-no" title="statement not covered" > this.config = config;</span>
|
|
3002
|
+
<span class="cstat-no" title="statement not covered" > this.dimensions = dimensions;</span>
|
|
3003
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3004
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3005
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3006
|
+
<span class="cstat-no" title="statement not covered" > * Encode a vector using quantization</span>
|
|
3007
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3008
|
+
<span class="cstat-no" title="statement not covered" > encode(vector: Float32Array): Float32Array {</span>
|
|
3009
|
+
<span class="cstat-no" title="statement not covered" > switch (this.config.type) {</span>
|
|
3010
|
+
<span class="cstat-no" title="statement not covered" > case 'binary':</span>
|
|
3011
|
+
<span class="cstat-no" title="statement not covered" > return this.binaryQuantize(vector);</span>
|
|
3012
|
+
<span class="cstat-no" title="statement not covered" > case 'scalar':</span>
|
|
3013
|
+
<span class="cstat-no" title="statement not covered" > return this.scalarQuantize(vector);</span>
|
|
3014
|
+
<span class="cstat-no" title="statement not covered" > case 'product':</span>
|
|
3015
|
+
<span class="cstat-no" title="statement not covered" > return this.productQuantize(vector);</span>
|
|
3016
|
+
<span class="cstat-no" title="statement not covered" > default:</span>
|
|
3017
|
+
<span class="cstat-no" title="statement not covered" > return vector;</span>
|
|
3018
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3019
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3020
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3021
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
3022
|
+
<span class="cstat-no" title="statement not covered" > * Get compression ratio</span>
|
|
3023
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
3024
|
+
<span class="cstat-no" title="statement not covered" > getCompressionRatio(): number {</span>
|
|
3025
|
+
<span class="cstat-no" title="statement not covered" > switch (this.config.type) {</span>
|
|
3026
|
+
<span class="cstat-no" title="statement not covered" > case 'binary':</span>
|
|
3027
|
+
<span class="cstat-no" title="statement not covered" > return 32; // 32x compression (32 bits -> 1 bit per dimension)</span>
|
|
3028
|
+
<span class="cstat-no" title="statement not covered" > case 'scalar':</span>
|
|
3029
|
+
<span class="cstat-no" title="statement not covered" > return 32 / (this.config.bits || 8);</span>
|
|
3030
|
+
<span class="cstat-no" title="statement not covered" > case 'product':</span>
|
|
3031
|
+
<span class="cstat-no" title="statement not covered" > return this.config.subquantizers || 8;</span>
|
|
3032
|
+
<span class="cstat-no" title="statement not covered" > default:</span>
|
|
3033
|
+
<span class="cstat-no" title="statement not covered" > return 1;</span>
|
|
3034
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3035
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3036
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3037
|
+
<span class="cstat-no" title="statement not covered" > private binaryQuantize(vector: Float32Array): Float32Array {</span>
|
|
3038
|
+
<span class="cstat-no" title="statement not covered" > // Simple binary quantization: > 0 becomes 1, <= 0 becomes 0</span>
|
|
3039
|
+
<span class="cstat-no" title="statement not covered" > // Stored in packed format in a smaller Float32Array</span>
|
|
3040
|
+
<span class="cstat-no" title="statement not covered" > const packedLength = Math.ceil(vector.length / 32);</span>
|
|
3041
|
+
<span class="cstat-no" title="statement not covered" > const packed = new Float32Array(packedLength);</span>
|
|
3042
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3043
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < vector.length; i++) {</span>
|
|
3044
|
+
<span class="cstat-no" title="statement not covered" > const packedIndex = Math.floor(i / 32);</span>
|
|
3045
|
+
<span class="cstat-no" title="statement not covered" > const bitPosition = i % 32;</span>
|
|
3046
|
+
<span class="cstat-no" title="statement not covered" > if (vector[i] > 0) {</span>
|
|
3047
|
+
<span class="cstat-no" title="statement not covered" > packed[packedIndex] = (packed[packedIndex] || 0) | (1 << bitPosition);</span>
|
|
3048
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3049
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3050
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3051
|
+
<span class="cstat-no" title="statement not covered" > return packed;</span>
|
|
3052
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3053
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3054
|
+
<span class="cstat-no" title="statement not covered" > private scalarQuantize(vector: Float32Array): Float32Array {</span>
|
|
3055
|
+
<span class="cstat-no" title="statement not covered" > // Find min/max for normalization</span>
|
|
3056
|
+
<span class="cstat-no" title="statement not covered" > let min = Infinity;</span>
|
|
3057
|
+
<span class="cstat-no" title="statement not covered" > let max = -Infinity;</span>
|
|
3058
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < vector.length; i++) {</span>
|
|
3059
|
+
<span class="cstat-no" title="statement not covered" > if (vector[i] < min) min = vector[i];</span>
|
|
3060
|
+
<span class="cstat-no" title="statement not covered" > if (vector[i] > max) max = vector[i];</span>
|
|
3061
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3062
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3063
|
+
<span class="cstat-no" title="statement not covered" > const range = max - min || 1;</span>
|
|
3064
|
+
<span class="cstat-no" title="statement not covered" > const bits = this.config.bits || 8;</span>
|
|
3065
|
+
<span class="cstat-no" title="statement not covered" > const levels = Math.pow(2, bits);</span>
|
|
3066
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3067
|
+
<span class="cstat-no" title="statement not covered" > // Quantize each value</span>
|
|
3068
|
+
<span class="cstat-no" title="statement not covered" > const quantized = new Float32Array(vector.length + 2); // +2 for min/range</span>
|
|
3069
|
+
<span class="cstat-no" title="statement not covered" > quantized[0] = min;</span>
|
|
3070
|
+
<span class="cstat-no" title="statement not covered" > quantized[1] = range;</span>
|
|
3071
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3072
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < vector.length; i++) {</span>
|
|
3073
|
+
<span class="cstat-no" title="statement not covered" > const normalized = (vector[i] - min) / range;</span>
|
|
3074
|
+
<span class="cstat-no" title="statement not covered" > quantized[i + 2] = Math.round(normalized * (levels - 1));</span>
|
|
3075
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3076
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3077
|
+
<span class="cstat-no" title="statement not covered" > return quantized;</span>
|
|
3078
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3079
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3080
|
+
<span class="cstat-no" title="statement not covered" > private productQuantize(vector: Float32Array): Float32Array {</span>
|
|
3081
|
+
<span class="cstat-no" title="statement not covered" > // Simplified product quantization</span>
|
|
3082
|
+
<span class="cstat-no" title="statement not covered" > // In production, would use trained codebooks</span>
|
|
3083
|
+
<span class="cstat-no" title="statement not covered" > const subquantizers = this.config.subquantizers || 8;</span>
|
|
3084
|
+
<span class="cstat-no" title="statement not covered" > const subvectorSize = Math.ceil(vector.length / subquantizers);</span>
|
|
3085
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3086
|
+
<span class="cstat-no" title="statement not covered" > const quantized = new Float32Array(subquantizers);</span>
|
|
3087
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3088
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < subquantizers; i++) {</span>
|
|
3089
|
+
<span class="cstat-no" title="statement not covered" > let sum = 0;</span>
|
|
3090
|
+
<span class="cstat-no" title="statement not covered" > const start = i * subvectorSize;</span>
|
|
3091
|
+
<span class="cstat-no" title="statement not covered" > const end = Math.min(start + subvectorSize, vector.length);</span>
|
|
3092
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3093
|
+
<span class="cstat-no" title="statement not covered" > for (let j = start; j < end; j++) {</span>
|
|
3094
|
+
<span class="cstat-no" title="statement not covered" > sum += vector[j];</span>
|
|
3095
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3096
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3097
|
+
<span class="cstat-no" title="statement not covered" > quantized[i] = sum / (end - start);</span>
|
|
3098
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3099
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3100
|
+
<span class="cstat-no" title="statement not covered" > return quantized;</span>
|
|
3101
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3102
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
3103
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
3104
|
+
<span class="cstat-no" title="statement not covered" >export default HNSWIndex;</span>
|
|
3105
|
+
</pre></td></tr></table></pre>
|
|
3106
|
+
|
|
3107
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
3108
|
+
</div><!-- /wrapper -->
|
|
3109
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
3110
|
+
Code coverage generated by
|
|
3111
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3112
|
+
at 2026-01-05T21:16:54.160Z
|
|
3113
|
+
</div>
|
|
3114
|
+
<script src="../prettify.js"></script>
|
|
3115
|
+
<script>
|
|
3116
|
+
window.onload = function () {
|
|
3117
|
+
prettyPrint();
|
|
3118
|
+
};
|
|
3119
|
+
</script>
|
|
3120
|
+
<script src="../sorter.js"></script>
|
|
3121
|
+
<script src="../block-navigation.js"></script>
|
|
3122
|
+
</body>
|
|
3123
|
+
</html>
|
|
3124
|
+
|