@euconform/core 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/inference/ollama-client.d.ts +1 -0
  7. package/dist/inference/ollama-client.d.ts.map +1 -1
  8. package/dist/inference/ollama-client.js +15 -5
  9. package/dist/legal-checks/annex-iv-report.d.ts +3 -0
  10. package/dist/legal-checks/annex-iv-report.d.ts.map +1 -1
  11. package/dist/legal-checks/annex-iv-report.js +1 -0
  12. package/dist/legal-checks/deadline-timeline.d.ts +57 -0
  13. package/dist/legal-checks/deadline-timeline.d.ts.map +1 -0
  14. package/dist/legal-checks/deadline-timeline.js +265 -0
  15. package/dist/legal-checks/gap-analysis.d.ts +48 -0
  16. package/dist/legal-checks/gap-analysis.d.ts.map +1 -0
  17. package/dist/legal-checks/gap-analysis.js +397 -0
  18. package/dist/legal-checks/gpai-classifier.d.ts +49 -0
  19. package/dist/legal-checks/gpai-classifier.d.ts.map +1 -0
  20. package/dist/legal-checks/gpai-classifier.js +197 -0
  21. package/dist/legal-checks/index.d.ts +6 -0
  22. package/dist/legal-checks/index.d.ts.map +1 -1
  23. package/dist/legal-checks/index.js +3 -0
  24. package/package.json +1 -1
  25. package/src/index.ts +25 -0
  26. package/src/inference/ollama-client.ts +21 -5
  27. package/src/legal-checks/annex-iv-report.ts +4 -0
  28. package/src/legal-checks/deadline-timeline.ts +313 -0
  29. package/src/legal-checks/gap-analysis.ts +454 -0
  30. package/src/legal-checks/gpai-classifier.ts +281 -0
  31. package/src/legal-checks/index.ts +33 -0
  32. package/tests/gpai-classifier.test.ts +125 -0
  33. package/tests/gpai-timeline.test.ts +55 -0
  34. package/.turbo/turbo-check-types.log +0 -4
  35. package/.turbo/turbo-test.log +0 -364
  36. package/coverage/base.css +0 -224
  37. package/coverage/block-navigation.js +0 -87
  38. package/coverage/clover.xml +0 -3282
  39. package/coverage/coverage-final.json +0 -20
  40. package/coverage/favicon.png +0 -0
  41. package/coverage/index.html +0 -161
  42. package/coverage/prettify.css +0 -1
  43. package/coverage/prettify.js +0 -2
  44. package/coverage/sort-arrow-sprite.png +0 -0
  45. package/coverage/sorter.js +0 -210
  46. package/coverage/src/fairness-metrics.ts.html +0 -1579
  47. package/coverage/src/index.html +0 -161
  48. package/coverage/src/index.ts.html +0 -535
  49. package/coverage/src/inference/browser-inference.ts.html +0 -859
  50. package/coverage/src/inference/capability-detection.ts.html +0 -2227
  51. package/coverage/src/inference/index.html +0 -176
  52. package/coverage/src/inference/index.ts.html +0 -553
  53. package/coverage/src/inference/inference-factory.ts.html +0 -751
  54. package/coverage/src/inference/ollama-client.ts.html +0 -1627
  55. package/coverage/src/legal-checks/annex-iv-report.ts.html +0 -556
  56. package/coverage/src/legal-checks/bias-metrics.ts.html +0 -1855
  57. package/coverage/src/legal-checks/data-governance.ts.html +0 -529
  58. package/coverage/src/legal-checks/human-oversight-logging.ts.html +0 -490
  59. package/coverage/src/legal-checks/index.html +0 -206
  60. package/coverage/src/legal-checks/index.ts.html +0 -250
  61. package/coverage/src/legal-checks/risk-classifier.ts.html +0 -940
  62. package/coverage/src/legal-checks/robustness-transparency.ts.html +0 -571
  63. package/coverage/src/metrics/crows-pairs-bias.ts.html +0 -820
  64. package/coverage/src/metrics/index.html +0 -146
  65. package/coverage/src/metrics/index.ts.html +0 -151
  66. package/coverage/src/metrics/stereotype-bias.ts.html +0 -886
  67. package/coverage/src/risk-engine.ts.html +0 -1660
  68. package/coverage/src/types.ts.html +0 -547
  69. package/dist/legal-checks/disclaimer.d.ts +0 -2
  70. package/dist/legal-checks/disclaimer.d.ts.map +0 -1
  71. package/dist/legal-checks/disclaimer.js +0 -1
@@ -1,1627 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/inference/ollama-client.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/inference</a> ollama-client.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">67.97% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>225/331</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">86.66% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>52/60</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">58.82% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>10/17</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">67.97% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>225/331</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 medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-neutral">&nbsp;</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-yes">1x</span>
637
- <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-yes">3x</span>
642
- <span class="cline-any cline-yes">3x</span>
643
- <span class="cline-any cline-yes">3x</span>
644
- <span class="cline-any cline-yes">3x</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-yes">3x</span>
647
- <span class="cline-any cline-yes">3x</span>
648
- <span class="cline-any cline-yes">3x</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-yes">2x</span>
651
- <span class="cline-any cline-yes">2x</span>
652
- <span class="cline-any cline-yes">3x</span>
653
- <span class="cline-any cline-yes">1x</span>
654
- <span class="cline-any cline-yes">1x</span>
655
- <span class="cline-any cline-yes">3x</span>
656
- <span class="cline-any cline-neutral">&nbsp;</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-neutral">&nbsp;</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-yes">3x</span>
661
- <span class="cline-any cline-yes">3x</span>
662
- <span class="cline-any cline-yes">3x</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-yes">3x</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-yes">2x</span>
669
- <span class="cline-any cline-yes">3x</span>
670
- <span class="cline-any cline-yes">3x</span>
671
- <span class="cline-any cline-yes">1x</span>
672
- <span class="cline-any cline-yes">1x</span>
673
- <span class="cline-any cline-yes">1x</span>
674
- <span class="cline-any cline-yes">3x</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-neutral">&nbsp;</span>
679
- <span class="cline-any cline-yes">2x</span>
680
- <span class="cline-any cline-yes">2x</span>
681
- <span class="cline-any cline-yes">2x</span>
682
- <span class="cline-any cline-yes">2x</span>
683
- <span class="cline-any cline-yes">2x</span>
684
- <span class="cline-any cline-yes">2x</span>
685
- <span class="cline-any cline-yes">2x</span>
686
- <span class="cline-any cline-yes">2x</span>
687
- <span class="cline-any cline-yes">2x</span>
688
- <span class="cline-any cline-yes">2x</span>
689
- <span class="cline-any cline-yes">2x</span>
690
- <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-yes">2x</span>
692
- <span class="cline-any cline-yes">1x</span>
693
- <span class="cline-any cline-yes">1x</span>
694
- <span class="cline-any cline-yes">1x</span>
695
- <span class="cline-any cline-yes">1x</span>
696
- <span class="cline-any cline-yes">1x</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-yes">1x</span>
699
- <span class="cline-any cline-yes">1x</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-no">&nbsp;</span>
713
- <span class="cline-any cline-no">&nbsp;</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
- <span class="cline-any cline-no">&nbsp;</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-no">&nbsp;</span>
726
- <span class="cline-any cline-no">&nbsp;</span>
727
- <span class="cline-any cline-no">&nbsp;</span>
728
- <span class="cline-any cline-no">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-no">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-no">&nbsp;</span>
739
- <span class="cline-any cline-no">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
746
- <span class="cline-any cline-neutral">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-no">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-no">&nbsp;</span>
784
- <span class="cline-any cline-neutral">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-yes">1x</span>
796
- <span class="cline-any cline-yes">1x</span>
797
- <span class="cline-any cline-yes">16x</span>
798
- <span class="cline-any cline-yes">16x</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-yes">1x</span>
801
- <span class="cline-any cline-yes">16x</span>
802
- <span class="cline-any cline-yes">16x</span>
803
- <span class="cline-any cline-yes">16x</span>
804
- <span class="cline-any cline-yes">16x</span>
805
- <span class="cline-any cline-neutral">&nbsp;</span>
806
- <span class="cline-any cline-neutral">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-yes">1x</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-no">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-no">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</span>
817
- <span class="cline-any cline-no">&nbsp;</span>
818
- <span class="cline-any cline-no">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
- <span class="cline-any cline-no">&nbsp;</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
823
- <span class="cline-any cline-no">&nbsp;</span>
824
- <span class="cline-any cline-no">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-yes">1x</span>
828
- <span class="cline-any cline-no">&nbsp;</span>
829
- <span class="cline-any cline-no">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-yes">1x</span>
832
- <span class="cline-any cline-no">&nbsp;</span>
833
- <span class="cline-any cline-no">&nbsp;</span>
834
- <span class="cline-any cline-no">&nbsp;</span>
835
- <span class="cline-any cline-no">&nbsp;</span>
836
- <span class="cline-any cline-no">&nbsp;</span>
837
- <span class="cline-any cline-no">&nbsp;</span>
838
- <span class="cline-any cline-no">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-yes">1x</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-no">&nbsp;</span>
843
- <span class="cline-any cline-no">&nbsp;</span>
844
- <span class="cline-any cline-no">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-yes">1x</span>
847
- <span class="cline-any cline-no">&nbsp;</span>
848
- <span class="cline-any cline-no">&nbsp;</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-yes">1x</span>
855
- <span class="cline-any cline-yes">10x</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-yes">10x</span>
858
- <span class="cline-any cline-yes">10x</span>
859
- <span class="cline-any cline-yes">10x</span>
860
- <span class="cline-any cline-yes">10x</span>
861
- <span class="cline-any cline-yes">10x</span>
862
- <span class="cline-any cline-yes">10x</span>
863
- <span class="cline-any cline-yes">10x</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-yes">10x</span>
868
- <span class="cline-any cline-yes">10x</span>
869
- <span class="cline-any cline-yes">10x</span>
870
- <span class="cline-any cline-yes">10x</span>
871
- <span class="cline-any cline-yes">10x</span>
872
- <span class="cline-any cline-yes">10x</span>
873
- <span class="cline-any cline-yes">10x</span>
874
- <span class="cline-any cline-yes">10x</span>
875
- <span class="cline-any cline-yes">10x</span>
876
- <span class="cline-any cline-yes">10x</span>
877
- <span class="cline-any cline-yes">10x</span>
878
- <span class="cline-any cline-yes">10x</span>
879
- <span class="cline-any cline-yes">10x</span>
880
- <span class="cline-any cline-yes">10x</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-yes">10x</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-no">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-yes">8x</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-yes">8x</span>
893
- <span class="cline-any cline-yes">8x</span>
894
- <span class="cline-any cline-yes">6x</span>
895
- <span class="cline-any cline-yes">6x</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-yes">10x</span>
898
- <span class="cline-any cline-yes">10x</span>
899
- <span class="cline-any cline-yes">10x</span>
900
- <span class="cline-any cline-yes">10x</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-yes">10x</span>
903
- <span class="cline-any cline-yes">2x</span>
904
- <span class="cline-any cline-yes">2x</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-yes">8x</span>
907
- <span class="cline-any cline-yes">10x</span>
908
- <span class="cline-any cline-yes">2x</span>
909
- <span class="cline-any cline-yes">2x</span>
910
- <span class="cline-any cline-yes">2x</span>
911
- <span class="cline-any cline-yes">10x</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-yes">1x</span>
917
- <span class="cline-any cline-yes">16x</span>
918
- <span class="cline-any cline-yes">16x</span>
919
- <span class="cline-any cline-yes">16x</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-yes">16x</span>
922
- <span class="cline-any cline-yes">8x</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-yes">8x</span>
926
- <span class="cline-any cline-yes">8x</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-yes">8x</span>
929
- <span class="cline-any cline-yes">6x</span>
930
- <span class="cline-any cline-yes">6x</span>
931
- <span class="cline-any cline-yes">8x</span>
932
- <span class="cline-any cline-yes">16x</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-no">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-yes">10x</span>
937
- <span class="cline-any cline-yes">16x</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-yes">1x</span>
943
- <span class="cline-any cline-yes">10x</span>
944
- <span class="cline-any cline-yes">10x</span>
945
- <span class="cline-any cline-yes">10x</span>
946
- <span class="cline-any cline-yes">10x</span>
947
- <span class="cline-any cline-yes">10x</span>
948
- <span class="cline-any cline-yes">10x</span>
949
- <span class="cline-any cline-yes">10x</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-yes">10x</span>
952
- <span class="cline-any cline-yes">10x</span>
953
- <span class="cline-any cline-yes">10x</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&nbsp;</span>
956
- <span class="cline-any cline-yes">10x</span>
957
- <span class="cline-any cline-neutral">&nbsp;</span>
958
- <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-yes">1x</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-yes">48x</span>
965
- <span class="cline-any cline-yes">48x</span>
966
- <span class="cline-any cline-yes">32x</span>
967
- <span class="cline-any cline-yes">32x</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-yes">16x</span>
971
- <span class="cline-any cline-yes">48x</span>
972
- <span class="cline-any cline-yes">6x</span>
973
- <span class="cline-any cline-yes">6x</span>
974
- <span class="cline-any cline-yes">6x</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-yes">10x</span>
978
- <span class="cline-any cline-yes">10x</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-yes">10x</span>
981
- <span class="cline-any cline-yes">48x</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-neutral">&nbsp;</span>
984
- <span class="cline-any cline-neutral">&nbsp;</span>
985
- <span class="cline-any cline-neutral">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-yes">1x</span>
988
- <span class="cline-any cline-yes">37x</span>
989
- <span class="cline-any cline-yes">37x</span>
990
- <span class="cline-any cline-yes">37x</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-yes">37x</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-yes">37x</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-yes">28x</span>
997
- <span class="cline-any cline-yes">28x</span>
998
- <span class="cline-any cline-yes">28x</span>
999
- <span class="cline-any cline-yes">28x</span>
1000
- <span class="cline-any cline-yes">28x</span>
1001
- <span class="cline-any cline-yes">28x</span>
1002
- <span class="cline-any cline-yes">28x</span>
1003
- <span class="cline-any cline-yes">28x</span>
1004
- <span class="cline-any cline-yes">28x</span>
1005
- <span class="cline-any cline-yes">28x</span>
1006
- <span class="cline-any cline-yes">28x</span>
1007
- <span class="cline-any cline-yes">28x</span>
1008
- <span class="cline-any cline-yes">28x</span>
1009
- <span class="cline-any cline-yes">28x</span>
1010
- <span class="cline-any cline-yes">28x</span>
1011
- <span class="cline-any cline-neutral">&nbsp;</span>
1012
- <span class="cline-any cline-yes">28x</span>
1013
- <span class="cline-any cline-yes">24x</span>
1014
- <span class="cline-any cline-neutral">&nbsp;</span>
1015
- <span class="cline-any cline-yes">24x</span>
1016
- <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-yes">24x</span>
1018
- <span class="cline-any cline-yes">24x</span>
1019
- <span class="cline-any cline-yes">24x</span>
1020
- <span class="cline-any cline-yes">24x</span>
1021
- <span class="cline-any cline-yes">24x</span>
1022
- <span class="cline-any cline-yes">24x</span>
1023
- <span class="cline-any cline-yes">24x</span>
1024
- <span class="cline-any cline-yes">24x</span>
1025
- <span class="cline-any cline-yes">24x</span>
1026
- <span class="cline-any cline-yes">24x</span>
1027
- <span class="cline-any cline-yes">24x</span>
1028
- <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-yes">28x</span>
1030
- <span class="cline-any cline-yes">1x</span>
1031
- <span class="cline-any cline-yes">1x</span>
1032
- <span class="cline-any cline-yes">1x</span>
1033
- <span class="cline-any cline-yes">1x</span>
1034
- <span class="cline-any cline-yes">28x</span>
1035
- <span class="cline-any cline-yes">3x</span>
1036
- <span class="cline-any cline-yes">3x</span>
1037
- <span class="cline-any cline-yes">3x</span>
1038
- <span class="cline-any cline-yes">3x</span>
1039
- <span class="cline-any cline-yes">3x</span>
1040
- <span class="cline-any cline-yes">28x</span>
1041
- <span class="cline-any cline-neutral">&nbsp;</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-yes">13x</span>
1044
- <span class="cline-any cline-yes">13x</span>
1045
- <span class="cline-any cline-neutral">&nbsp;</span>
1046
- <span class="cline-any cline-yes">13x</span>
1047
- <span class="cline-any cline-yes">13x</span>
1048
- <span class="cline-any cline-yes">13x</span>
1049
- <span class="cline-any cline-yes">13x</span>
1050
- <span class="cline-any cline-yes">13x</span>
1051
- <span class="cline-any cline-yes">13x</span>
1052
- <span class="cline-any cline-yes">13x</span>
1053
- <span class="cline-any cline-yes">13x</span>
1054
- <span class="cline-any cline-yes">13x</span>
1055
- <span class="cline-any cline-yes">13x</span>
1056
- <span class="cline-any cline-yes">13x</span>
1057
- <span class="cline-any cline-yes">13x</span>
1058
- <span class="cline-any cline-yes">13x</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-yes">12x</span>
1061
- <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-yes">37x</span>
1063
- <span class="cline-any cline-no">&nbsp;</span>
1064
- <span class="cline-any cline-no">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-yes">10x</span>
1067
- <span class="cline-any cline-neutral">&nbsp;</span>
1068
- <span class="cline-any cline-neutral">&nbsp;</span>
1069
- <span class="cline-any cline-yes">10x</span>
1070
- <span class="cline-any cline-neutral">&nbsp;</span>
1071
- <span class="cline-any cline-yes">37x</span>
1072
- <span class="cline-any cline-neutral">&nbsp;</span>
1073
- <span class="cline-any cline-yes">8x</span>
1074
- <span class="cline-any cline-yes">37x</span>
1075
- <span class="cline-any cline-neutral">&nbsp;</span>
1076
- <span class="cline-any cline-yes">2x</span>
1077
- <span class="cline-any cline-yes">2x</span>
1078
- <span class="cline-any cline-yes">2x</span>
1079
- <span class="cline-any cline-yes">2x</span>
1080
- <span class="cline-any cline-neutral">&nbsp;</span>
1081
- <span class="cline-any cline-neutral">&nbsp;</span>
1082
- <span class="cline-any cline-yes">10x</span>
1083
- <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-yes">10x</span>
1085
- <span class="cline-any cline-yes">10x</span>
1086
- <span class="cline-any cline-yes">10x</span>
1087
- <span class="cline-any cline-yes">10x</span>
1088
- <span class="cline-any cline-yes">37x</span>
1089
- <span class="cline-any cline-yes">3x</span>
1090
- <span class="cline-any cline-yes">3x</span>
1091
- <span class="cline-any cline-yes">3x</span>
1092
- <span class="cline-any cline-yes">37x</span>
1093
- <span class="cline-any cline-yes">1x</span>
1094
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1095
- * Ollama Client for local LLM inference
1096
- * Connects to Ollama running on localhost:11434
1097
- */
1098
- &nbsp;
1099
- import type { BiasCalculationMethod, ModelCapabilityCache } from "../types";
1100
- &nbsp;
1101
- export interface OllamaModel {
1102
- name: string;
1103
- size: number;
1104
- digest: string;
1105
- modified_at: string;
1106
- }
1107
- &nbsp;
1108
- export interface OllamaGenerateOptions {
1109
- model: string;
1110
- prompt: string;
1111
- stream?: boolean;
1112
- logprobs?: boolean | number;
1113
- options?: {
1114
- temperature?: number;
1115
- top_p?: number;
1116
- num_predict?: number;
1117
- };
1118
- }
1119
- &nbsp;
1120
- export interface OllamaGenerateResponse {
1121
- model: string;
1122
- response: string;
1123
- done: boolean;
1124
- context?: number[];
1125
- total_duration?: number;
1126
- eval_count?: number;
1127
- logprobs?: Array&lt;{
1128
- token: string;
1129
- logprob: number;
1130
- }&gt;;
1131
- }
1132
- &nbsp;
1133
- export interface OllamaLogProbResponse {
1134
- model: string;
1135
- prompt: string;
1136
- logprob: number;
1137
- }
1138
- &nbsp;
1139
- export interface OllamaLogProbsOptions {
1140
- logprobs?: boolean | number;
1141
- }
1142
- &nbsp;
1143
- export interface OllamaLogProbsResponse extends OllamaGenerateResponse {
1144
- logprobs?: Array&lt;{
1145
- token: string;
1146
- logprob: number;
1147
- }&gt;;
1148
- }
1149
- &nbsp;
1150
- const OLLAMA_BASE_URL = "http://localhost:11434";
1151
- &nbsp;
1152
- /**
1153
- * Check if Ollama is running and accessible
1154
- */
1155
- export async function detectOllama(): Promise&lt;boolean&gt; {
1156
- try {
1157
- const controller = new AbortController();
1158
- const timeoutId = setTimeout(() =&gt; controller.abort(), 2000);
1159
- &nbsp;
1160
- const response = await fetch(`${OLLAMA_BASE_URL}/api/tags`, {
1161
- signal: controller.signal,
1162
- });
1163
- &nbsp;
1164
- clearTimeout(timeoutId);
1165
- return response.ok;
1166
- } catch {
1167
- return false;
1168
- }
1169
- }
1170
- &nbsp;
1171
- /**
1172
- * Get list of available models from Ollama
1173
- */
1174
- export async function listOllamaModels(): Promise&lt;OllamaModel[]&gt; {
1175
- try {
1176
- const response = await fetch(`${OLLAMA_BASE_URL}/api/tags`);
1177
- &nbsp;
1178
- if (!response.ok) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1179
- <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to list models: ${response.statusText}`);</span>
1180
- <span class="cstat-no" title="statement not covered" > }</span>
1181
- &nbsp;
1182
- const data = await response.json();
1183
- return data.models || [];
1184
- } catch (error) {
1185
- console.error("Failed to list Ollama models:", error);
1186
- return [];
1187
- }
1188
- }
1189
- &nbsp;
1190
- /**
1191
- * Generate text with Ollama
1192
- */
1193
- export async function ollamaGenerate(
1194
- options: OllamaGenerateOptions
1195
- ): Promise&lt;OllamaGenerateResponse&gt; {
1196
- const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {
1197
- method: "POST",
1198
- headers: { "Content-Type": "application/json" },
1199
- body: JSON.stringify({
1200
- ...options,
1201
- stream: false,
1202
- }),
1203
- });
1204
- &nbsp;
1205
- if (!response.ok) {
1206
- const errorText = await response.text();
1207
- throw new Error(
1208
- `Ollama generate failed (${response.status}): ${<span class="branch-0 cbranch-no" title="branch not covered" >errorText || response.statusText}</span>`
1209
- );
1210
- }
1211
- &nbsp;
1212
- return response.json();
1213
- }
1214
- &nbsp;
1215
- /**
1216
- * Get log probability for a prompt (for bias scoring)
1217
- * Uses the /api/generate endpoint with num_predict: 0 to get prompt logprobs
1218
- */
1219
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function getLogProb(model: string, prompt: string): Promise&lt;number&gt; {</span></span>
1220
- <span class="cstat-no" title="statement not covered" > try {</span>
1221
- // Use generate with num_predict: 0 to ONLY evaluate the prompt
1222
- // This forces the model to process the input tokens, giving us prompt_eval metrics
1223
- <span class="cstat-no" title="statement not covered" > const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {</span>
1224
- <span class="cstat-no" title="statement not covered" > method: "POST",</span>
1225
- <span class="cstat-no" title="statement not covered" > headers: { "Content-Type": "application/json" },</span>
1226
- <span class="cstat-no" title="statement not covered" > body: JSON.stringify({</span>
1227
- <span class="cstat-no" title="statement not covered" > model,</span>
1228
- <span class="cstat-no" title="statement not covered" > prompt,</span>
1229
- <span class="cstat-no" title="statement not covered" > stream: false,</span>
1230
- <span class="cstat-no" title="statement not covered" > options: {</span>
1231
- <span class="cstat-no" title="statement not covered" > num_predict: 0, // Don't generate, just evaluate prompt</span>
1232
- <span class="cstat-no" title="statement not covered" > temperature: 0,</span>
1233
- <span class="cstat-no" title="statement not covered" > },</span>
1234
- <span class="cstat-no" title="statement not covered" > }),</span>
1235
- <span class="cstat-no" title="statement not covered" > });</span>
1236
- &nbsp;
1237
- <span class="cstat-no" title="statement not covered" > if (!response.ok) {</span>
1238
- <span class="cstat-no" title="statement not covered" > const errorText = await response.text();</span>
1239
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1240
- <span class="cstat-no" title="statement not covered" > `Failed to get logprob for model '${model}': ${errorText || response.statusText}`</span>
1241
- <span class="cstat-no" title="statement not covered" > );</span>
1242
- <span class="cstat-no" title="statement not covered" > }</span>
1243
- &nbsp;
1244
- <span class="cstat-no" title="statement not covered" > const data = await response.json();</span>
1245
- &nbsp;
1246
- // Optimization: Use prompt_eval metrics (processing time of the input)
1247
- // This is a better proxy for "perplexity" or "likelihood" of the sentence than generation speed
1248
- <span class="cstat-no" title="statement not covered" > if (data.prompt_eval_duration &amp;&amp; data.prompt_eval_count) {</span>
1249
- <span class="cstat-no" title="statement not covered" > const timePerToken = data.prompt_eval_duration / data.prompt_eval_count / 1e9; // ns to s</span>
1250
- // Normalize: faster processing = higher probability (lower surprise)
1251
- // We return negative log of time to mimic log-prob scale (higher is better)
1252
- <span class="cstat-no" title="statement not covered" > return -Math.log(timePerToken + 0.00001); // Smaller epsilon for precision</span>
1253
- <span class="cstat-no" title="statement not covered" > }</span>
1254
- &nbsp;
1255
- // Fallback: use eval metrics if prompt metrics missing (rare)
1256
- <span class="cstat-no" title="statement not covered" > if (data.eval_duration &amp;&amp; data.eval_count) {</span>
1257
- <span class="cstat-no" title="statement not covered" > const timePerToken = data.eval_duration / data.eval_count / 1e9;</span>
1258
- <span class="cstat-no" title="statement not covered" > return -Math.log(timePerToken + 0.001);</span>
1259
- <span class="cstat-no" title="statement not covered" > }</span>
1260
- &nbsp;
1261
- <span class="cstat-no" title="statement not covered" > return 0;</span>
1262
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1263
- <span class="cstat-no" title="statement not covered" > console.error(`Error calculating log probability for model ${model}:`, error);</span>
1264
- <span class="cstat-no" title="statement not covered" > throw error; // Re-throw to let caller handle it</span>
1265
- <span class="cstat-no" title="statement not covered" > }</span>
1266
- <span class="cstat-no" title="statement not covered" >}</span>
1267
- &nbsp;
1268
- /**
1269
- * Calculate perplexity for a text (alternative bias metric)
1270
- */
1271
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function getPerplexity(model: string, text: string): Promise&lt;number&gt; {</span></span>
1272
- <span class="cstat-no" title="statement not covered" > try {</span>
1273
- <span class="cstat-no" title="statement not covered" > const response = await fetch(`${OLLAMA_BASE_URL}/api/generate`, {</span>
1274
- <span class="cstat-no" title="statement not covered" > method: "POST",</span>
1275
- <span class="cstat-no" title="statement not covered" > headers: { "Content-Type": "application/json" },</span>
1276
- <span class="cstat-no" title="statement not covered" > body: JSON.stringify({</span>
1277
- <span class="cstat-no" title="statement not covered" > model,</span>
1278
- <span class="cstat-no" title="statement not covered" > prompt: text,</span>
1279
- <span class="cstat-no" title="statement not covered" > stream: false,</span>
1280
- <span class="cstat-no" title="statement not covered" > options: {</span>
1281
- <span class="cstat-no" title="statement not covered" > num_predict: 0, // Don't generate, just evaluate prompt</span>
1282
- <span class="cstat-no" title="statement not covered" > },</span>
1283
- <span class="cstat-no" title="statement not covered" > }),</span>
1284
- <span class="cstat-no" title="statement not covered" > });</span>
1285
- &nbsp;
1286
- <span class="cstat-no" title="statement not covered" > if (!response.ok) {</span>
1287
- <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to get perplexity: ${response.statusText}`);</span>
1288
- <span class="cstat-no" title="statement not covered" > }</span>
1289
- &nbsp;
1290
- <span class="cstat-no" title="statement not covered" > const data = await response.json();</span>
1291
- &nbsp;
1292
- // Perplexity approximation from eval metrics
1293
- <span class="cstat-no" title="statement not covered" > if (data.prompt_eval_duration &amp;&amp; data.prompt_eval_count) {</span>
1294
- // Normalize by token count for fair comparison across different lengths
1295
- <span class="cstat-no" title="statement not covered" > const avgTimePerToken = data.prompt_eval_duration / data.prompt_eval_count / 1e9;</span>
1296
- <span class="cstat-no" title="statement not covered" > return avgTimePerToken * 1000; // Scale for readability</span>
1297
- <span class="cstat-no" title="statement not covered" > }</span>
1298
- &nbsp;
1299
- <span class="cstat-no" title="statement not covered" > return 1;</span>
1300
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
1301
- <span class="cstat-no" title="statement not covered" > console.error("Failed to get perplexity:", error);</span>
1302
- <span class="cstat-no" title="statement not covered" > return 1;</span>
1303
- <span class="cstat-no" title="statement not covered" > }</span>
1304
- <span class="cstat-no" title="statement not covered" >}</span>
1305
- &nbsp;
1306
- /**
1307
- * Ollama client class for stateful operations
1308
- */
1309
- export class OllamaClient {
1310
- private baseUrl: string;
1311
- public readonly model: string;
1312
- private capabilityCache: Map&lt;string, ModelCapabilityCache&gt;;
1313
- &nbsp;
1314
- constructor(model: string, baseUrl = OLLAMA_BASE_URL) {
1315
- this.baseUrl = baseUrl;
1316
- this.model = model;
1317
- this.capabilityCache = new Map();
1318
- }
1319
- &nbsp;
1320
- /**
1321
- * Ensures the model is available in Ollama before proceeding
1322
- * Throws an error if the model is not found
1323
- */
1324
- <span class="fstat-no" title="function not covered" > async ensureModelLoaded(): Promise&lt;void&gt; {</span>
1325
- <span class="cstat-no" title="statement not covered" > const models = await listOllamaModels();</span>
1326
- // Check if exact match or if the model name is contained (e.g. "llama3.2" in "llama3.2:latest")
1327
- <span class="cstat-no" title="statement not covered" > const modelExists = models.some(</span>
1328
- <span class="cstat-no" title="statement not covered" > (m) =&gt;</span>
1329
- <span class="cstat-no" title="statement not covered" > m.name === this.model ||</span>
1330
- <span class="cstat-no" title="statement not covered" > m.name.startsWith(`${this.model}:`) ||</span>
1331
- <span class="cstat-no" title="statement not covered" > this.model.startsWith(`${m.name}:`)</span>
1332
- <span class="cstat-no" title="statement not covered" > );</span>
1333
- &nbsp;
1334
- <span class="cstat-no" title="statement not covered" > if (!modelExists) {</span>
1335
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
1336
- <span class="cstat-no" title="statement not covered" > `Model '${this.model}' not found in Ollama. Please run 'ollama pull ${this.model}' first.`</span>
1337
- <span class="cstat-no" title="statement not covered" > );</span>
1338
- <span class="cstat-no" title="statement not covered" > }</span>
1339
- <span class="cstat-no" title="statement not covered" > }</span>
1340
- &nbsp;
1341
- <span class="fstat-no" title="function not covered" > async isAvailable(): Promise&lt;boolean&gt; {</span>
1342
- <span class="cstat-no" title="statement not covered" > return detectOllama();</span>
1343
- <span class="cstat-no" title="statement not covered" > }</span>
1344
- &nbsp;
1345
- <span class="fstat-no" title="function not covered" > async generate(prompt: string): Promise&lt;string&gt; {</span>
1346
- <span class="cstat-no" title="statement not covered" > await this.ensureModelLoaded();</span>
1347
- <span class="cstat-no" title="statement not covered" > const response = await ollamaGenerate({</span>
1348
- <span class="cstat-no" title="statement not covered" > model: this.model,</span>
1349
- <span class="cstat-no" title="statement not covered" > prompt,</span>
1350
- <span class="cstat-no" title="statement not covered" > });</span>
1351
- <span class="cstat-no" title="statement not covered" > return response.response;</span>
1352
- <span class="cstat-no" title="statement not covered" > }</span>
1353
- &nbsp;
1354
- <span class="fstat-no" title="function not covered" > async getLogProb(prompt: string): Promise&lt;number&gt; {</span>
1355
- // Use the enhanced getLogProbWithFallback method that supports both exact and fallback methods
1356
- <span class="cstat-no" title="statement not covered" > const result = await this.getLogProbWithFallback(prompt);</span>
1357
- <span class="cstat-no" title="statement not covered" > return result.logprob;</span>
1358
- <span class="cstat-no" title="statement not covered" > }</span>
1359
- &nbsp;
1360
- <span class="fstat-no" title="function not covered" > async getPerplexity(text: string): Promise&lt;number&gt; {</span>
1361
- <span class="cstat-no" title="statement not covered" > return getPerplexity(this.model, text);</span>
1362
- <span class="cstat-no" title="statement not covered" > }</span>
1363
- &nbsp;
1364
- /**
1365
- * Test if the current model supports log-probabilities
1366
- * Sends a test request with "Der" prompt to detect capability
1367
- */
1368
- private async testLogProbCapability(): Promise&lt;boolean&gt; {
1369
- try {
1370
- // First check Ollama version
1371
- try {
1372
- const versionResponse = await fetch(`${this.baseUrl}/api/version`);
1373
- if (versionResponse.ok) {
1374
- const versionData = await versionResponse.json();
1375
- console.log(`🔍 Ollama version: ${versionData.version || "unknown"}`);
1376
- }
1377
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
1378
- // Version check is optional
1379
- <span class="cstat-no" title="statement not covered" > }</span>
1380
- &nbsp;
1381
- const response = await fetch(`${this.baseUrl}/api/generate`, {
1382
- method: "POST",
1383
- headers: { "Content-Type": "application/json" },
1384
- body: JSON.stringify({
1385
- model: this.model,
1386
- prompt: "Der",
1387
- stream: false,
1388
- logprobs: true,
1389
- options: {
1390
- num_predict: 1,
1391
- temperature: 0,
1392
- },
1393
- }),
1394
- });
1395
- &nbsp;
1396
- if (!response.ok) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1397
- <span class="cstat-no" title="statement not covered" > console.warn(</span>
1398
- <span class="cstat-no" title="statement not covered" > `🔍 Capability test request failed for ${this.model}: ${response.status} ${response.statusText}`</span>
1399
- <span class="cstat-no" title="statement not covered" > );</span>
1400
- <span class="cstat-no" title="statement not covered" > return false;</span>
1401
- <span class="cstat-no" title="statement not covered" > }</span>
1402
- &nbsp;
1403
- const data = await response.json();
1404
- &nbsp;
1405
- // Check if logprobs are present and valid
1406
- const hasLogProbs = !!(
1407
- data.logprobs &amp;&amp;
1408
- Array.isArray(data.logprobs) &amp;&amp;
1409
- data.logprobs.length &gt; 0
1410
- );
1411
- console.log(
1412
- `🔍 Capability test for ${this.model}: ${hasLogProbs ? "✅ supports" : "❌ no support"} log-probabilities`,
1413
- data.logprobs ? `(${data.logprobs.length} tokens)` : "(no logprobs field)"
1414
- );
1415
- &nbsp;
1416
- if (!hasLogProbs) {
1417
- console.log("🔍 Full response for debugging:", JSON.stringify(data, null, 2));
1418
- }
1419
- &nbsp;
1420
- return hasLogProbs;
1421
- } catch (error) {
1422
- console.warn(`Log-probability capability test failed for model ${this.model}:`, error);
1423
- return false;
1424
- }
1425
- }
1426
- &nbsp;
1427
- /**
1428
- * Get cached capability result from localStorage
1429
- */
1430
- private getCachedCapability(): ModelCapabilityCache | null {
1431
- try {
1432
- const cacheKey = `ollama_supports_logprobs_${this.model}`;
1433
- const cached = localStorage.getItem(cacheKey);
1434
- &nbsp;
1435
- if (cached) {
1436
- const capability: ModelCapabilityCache = JSON.parse(cached);
1437
- &nbsp;
1438
- // Check if cache is still valid (24 hours)
1439
- const cacheAge = Date.now() - new Date(capability.testedAt).getTime();
1440
- const maxAge = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
1441
- &nbsp;
1442
- if (cacheAge &lt; maxAge) {
1443
- return capability;
1444
- }
1445
- }
1446
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
1447
- <span class="cstat-no" title="statement not covered" > console.warn("Failed to read capability cache:", error);</span>
1448
- <span class="cstat-no" title="statement not covered" > }</span>
1449
- &nbsp;
1450
- return null;
1451
- }
1452
- &nbsp;
1453
- /**
1454
- * Cache capability result in localStorage
1455
- */
1456
- private setCachedCapability(supports: boolean): void {
1457
- try {
1458
- const cacheKey = `ollama_supports_logprobs_${this.model}`;
1459
- const capability: ModelCapabilityCache = {
1460
- model: this.model,
1461
- supportsLogProbs: supports,
1462
- testedAt: new Date().toISOString(),
1463
- };
1464
- &nbsp;
1465
- localStorage.setItem(cacheKey, JSON.stringify(capability));
1466
- this.capabilityCache.set(this.model, capability);
1467
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
1468
- <span class="cstat-no" title="statement not covered" > console.warn("Failed to cache capability result:", error);</span>
1469
- <span class="cstat-no" title="statement not covered" > }</span>
1470
- }
1471
- &nbsp;
1472
- /**
1473
- * Detect if the current model supports log-probabilities
1474
- * Checks cache first, then runs test if needed
1475
- */
1476
- async detectLogProbSupport(): Promise&lt;boolean&gt; {
1477
- // Check in-memory cache first
1478
- const memoryCache = this.capabilityCache.get(this.model);
1479
- if (memoryCache) {
1480
- return memoryCache.supportsLogProbs;
1481
- }
1482
- &nbsp;
1483
- // Check localStorage cache
1484
- const cached = this.getCachedCapability();
1485
- if (cached) {
1486
- this.capabilityCache.set(this.model, cached);
1487
- return cached.supportsLogProbs;
1488
- }
1489
- &nbsp;
1490
- // Run capability test
1491
- const supports = await this.testLogProbCapability();
1492
- this.setCachedCapability(supports);
1493
- &nbsp;
1494
- return supports;
1495
- }
1496
- &nbsp;
1497
- /**
1498
- * Get log-probability with automatic fallback to latency method
1499
- * Returns both the calculated value and the method used
1500
- */
1501
- async getLogProbWithFallback(
1502
- prompt: string
1503
- ): Promise&lt;{ logprob: number; method: BiasCalculationMethod }&gt; {
1504
- try {
1505
- // First, check if model supports log-probabilities
1506
- const supportsLogProbs = await this.detectLogProbSupport();
1507
- &nbsp;
1508
- if (supportsLogProbs) {
1509
- // Try to get exact log-probabilities
1510
- try {
1511
- const response = await fetch(`${this.baseUrl}/api/generate`, {
1512
- method: "POST",
1513
- headers: { "Content-Type": "application/json" },
1514
- body: JSON.stringify({
1515
- model: this.model,
1516
- prompt,
1517
- stream: false,
1518
- logprobs: true,
1519
- options: {
1520
- num_predict: 0, // Only evaluate prompt, don't generate
1521
- temperature: 0,
1522
- },
1523
- }),
1524
- });
1525
- &nbsp;
1526
- if (response.ok) {
1527
- const data = await response.json();
1528
- &nbsp;
1529
- if (data.logprobs &amp;&amp; Array.isArray(data.logprobs) &amp;&amp; data.logprobs.length &gt; 0) {
1530
- // Calculate average log-probability across all tokens
1531
- const avgLogProb =
1532
- data.logprobs.reduce(
1533
- (sum: number, item: { token: string; logprob: number }) =&gt; sum + item.logprob,
1534
- 0
1535
- ) / data.logprobs.length;
1536
- console.log(`✅ Using exact log-probabilities for ${this.model}: ${avgLogProb}`);
1537
- return {
1538
- logprob: avgLogProb,
1539
- method: "logprobs_exact",
1540
- };
1541
- <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
1542
- <span class="cstat-no" title="statement not covered" > console.warn(`❌ No logprobs in response for ${this.model}, response:`, data);</span>
1543
- } else {
1544
- console.warn(
1545
- `❌ Log-probability request failed for ${this.model}: ${response.status} ${response.statusText}`
1546
- );
1547
- }
1548
- } catch (error) {
1549
- console.warn(
1550
- `❌ Log-probability request failed for ${this.model}, falling back to latency method:`,
1551
- error
1552
- );
1553
- }
1554
- }
1555
- &nbsp;
1556
- // Fallback to latency-based method
1557
- console.log(`⚡ Falling back to latency-based method for ${this.model}`);
1558
- const startTime = performance.now();
1559
- &nbsp;
1560
- const response = await fetch(`${this.baseUrl}/api/generate`, {
1561
- method: "POST",
1562
- headers: { "Content-Type": "application/json" },
1563
- body: JSON.stringify({
1564
- model: this.model,
1565
- prompt,
1566
- stream: false,
1567
- options: {
1568
- num_predict: 0, // Only evaluate prompt
1569
- temperature: 0,
1570
- },
1571
- }),
1572
- });
1573
- &nbsp;
1574
- const endTime = performance.now();
1575
- &nbsp;
1576
- if (!response.ok) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1577
- <span class="cstat-no" title="statement not covered" > throw new Error(`Ollama request failed: ${response.statusText}`);</span>
1578
- <span class="cstat-no" title="statement not covered" > }</span>
1579
- &nbsp;
1580
- const data = await response.json();
1581
- &nbsp;
1582
- // Calculate latency-based pseudo log-probability
1583
- let latency: number;
1584
- &nbsp;
1585
- if (data.prompt_eval_duration &amp;&amp; data.prompt_eval_count) {
1586
- // Use prompt evaluation metrics (preferred)
1587
- latency = data.prompt_eval_duration / data.prompt_eval_count / 1e9; // ns to seconds per token
1588
- } else {
1589
- // Fallback to total request time
1590
- const totalTime = (endTime - startTime) / 1000; // ms to seconds
1591
- const tokenCount = prompt.split(/\s+/).length; // rough token estimate
1592
- latency = totalTime / Math.max(tokenCount, 1);
1593
- }
1594
- &nbsp;
1595
- // Convert latency to pseudo log-probability (faster = higher probability)
1596
- const pseudoLogProb = -Math.log(latency + 0.00001);
1597
- &nbsp;
1598
- return {
1599
- logprob: pseudoLogProb,
1600
- method: "logprobs_fallback_latency",
1601
- };
1602
- } catch (error) {
1603
- console.error(`Error in getLogProbWithFallback for model ${this.model}:`, error);
1604
- throw error;
1605
- }
1606
- }
1607
- }
1608
- &nbsp;</pre></td></tr></table></pre>
1609
-
1610
- <div class='push'></div><!-- for sticky footer -->
1611
- </div><!-- /wrapper -->
1612
- <div class='footer quiet pad2 space-top1 center small'>
1613
- Code coverage generated by
1614
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1615
- at 2026-01-07T00:09:13.255Z
1616
- </div>
1617
- <script src="../../prettify.js"></script>
1618
- <script>
1619
- window.onload = function () {
1620
- prettyPrint();
1621
- };
1622
- </script>
1623
- <script src="../../sorter.js"></script>
1624
- <script src="../../block-navigation.js"></script>
1625
- </body>
1626
- </html>
1627
-