vsegments 0.1.1 → 0.1.2

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.
@@ -0,0 +1,631 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for visualize.js</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> visualize.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">7.46% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>5/67</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/24</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/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">7.57% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>5/66</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-yes">2x</span>
253
+ <span class="cline-any cline-yes">2x</span>
254
+ <span class="cline-any cline-yes">2x</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-yes">2x</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-neutral">&nbsp;</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-no">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-no">&nbsp;</span>
280
+ <span class="cline-any cline-no">&nbsp;</span>
281
+ <span class="cline-any cline-no">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-no">&nbsp;</span>
284
+ <span class="cline-any cline-no">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-no">&nbsp;</span>
287
+ <span class="cline-any cline-no">&nbsp;</span>
288
+ <span class="cline-any cline-no">&nbsp;</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-neutral">&nbsp;</span>
291
+ <span class="cline-any cline-no">&nbsp;</span>
292
+ <span class="cline-any cline-no">&nbsp;</span>
293
+ <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-no">&nbsp;</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-no">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-no">&nbsp;</span>
326
+ <span class="cline-any cline-no">&nbsp;</span>
327
+ <span class="cline-any cline-no">&nbsp;</span>
328
+ <span class="cline-any cline-no">&nbsp;</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-no">&nbsp;</span>
332
+ <span class="cline-any cline-no">&nbsp;</span>
333
+ <span class="cline-any cline-no">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-no">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-no">&nbsp;</span>
362
+ <span class="cline-any cline-no">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-no">&nbsp;</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-no">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-neutral">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-neutral">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-no">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-no">&nbsp;</span>
397
+ <span class="cline-any cline-no">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-no">&nbsp;</span>
401
+ <span class="cline-any cline-no">&nbsp;</span>
402
+ <span class="cline-any cline-no">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-no">&nbsp;</span>
407
+ <span class="cline-any cline-no">&nbsp;</span>
408
+ <span class="cline-any cline-no">&nbsp;</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-neutral">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-no">&nbsp;</span>
420
+ <span class="cline-any cline-no">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-yes">2x</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
431
+ * Visualization utilities for drawing bounding boxes and segmentation masks
432
+ */
433
+ &nbsp;
434
+ const { createCanvas, loadImage, registerFont } = require('canvas');
435
+ const fs = require('fs').promises;
436
+ const path = require('path');
437
+ &nbsp;
438
+ // Extended color palette
439
+ const COLORS = [
440
+ '#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF',
441
+ '#FFA500', '#800080', '#FFC0CB', '#A52A2A', '#808080', '#F5F5DC',
442
+ '#40E0D0', '#FF7F50', '#E6E6FA', '#EE82EE', '#FFD700', '#C0C0C0',
443
+ '#000080', '#800000', '#008080', '#808000', '#FF6347', '#4B0082',
444
+ '#DC143C', '#00CED1', '#9370DB', '#FF1493', '#7FFF00', '#D2691E'
445
+ ];
446
+ &nbsp;
447
+ /**
448
+ * Draw bounding boxes on an image
449
+ * @param {Canvas} canvas - Canvas with loaded image
450
+ * @param {BoundingBox[]} boxes - Array of bounding boxes
451
+ * @param {Object} options - Drawing options
452
+ * @returns {Canvas} - Canvas with bounding boxes drawn
453
+ */
454
+ function <span class="fstat-no" title="function not covered" >plotBoundingBoxes(</span>canvas, boxes, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
455
+ const {
456
+ lineWidth = <span class="branch-0 cbranch-no" title="branch not covered" >4,</span>
457
+ fontSize = <span class="branch-0 cbranch-no" title="branch not covered" >14,</span>
458
+ showLabels = <span class="branch-0 cbranch-no" title="branch not covered" >true</span>
459
+ } = <span class="cstat-no" title="statement not covered" >options;</span>
460
+
461
+ const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span>
462
+ const width = <span class="cstat-no" title="statement not covered" >canvas.width;</span>
463
+ const height = <span class="cstat-no" title="statement not covered" >canvas.height;</span>
464
+
465
+ <span class="cstat-no" title="statement not covered" > ctx.lineWidth = lineWidth;</span>
466
+ <span class="cstat-no" title="statement not covered" > ctx.font = `${fontSize}px Arial`;</span>
467
+
468
+ <span class="cstat-no" title="statement not covered" > boxes.forEach(<span class="fstat-no" title="function not covered" >(b</span>ox, i) =&gt; {</span>
469
+ const color = <span class="cstat-no" title="statement not covered" >COLORS[i % COLORS.length];</span>
470
+ const [absX1, absY1, absX2, absY2] = <span class="cstat-no" title="statement not covered" >box.toAbsolute(width, height);</span>
471
+
472
+ // Draw rectangle
473
+ <span class="cstat-no" title="statement not covered" > ctx.strokeStyle = color;</span>
474
+ <span class="cstat-no" title="statement not covered" > ctx.strokeRect(absX1, absY1, absX2 - absX1, absY2 - absY1);</span>
475
+
476
+ // Draw label
477
+ <span class="cstat-no" title="statement not covered" > if (showLabels &amp;&amp; box.label) {</span>
478
+ <span class="cstat-no" title="statement not covered" > ctx.fillStyle = color;</span>
479
+ <span class="cstat-no" title="statement not covered" > ctx.fillText(box.label, absX1 + 8, absY1 + fontSize + 6);</span>
480
+ }
481
+ });
482
+
483
+ <span class="cstat-no" title="statement not covered" > return canvas;</span>
484
+ }
485
+ &nbsp;
486
+ /**
487
+ * Overlay a mask on the image
488
+ * @param {Canvas} canvas - Canvas with image
489
+ * @param {Buffer} maskData - Mask data
490
+ * @param {number} width - Image width
491
+ * @param {number} height - Image height
492
+ * @param {string} color - Color to use for mask
493
+ * @param {number} alpha - Transparency (0-1)
494
+ */
495
+ function <span class="fstat-no" title="function not covered" >overlayMask(</span>canvas, maskData, width, height, color, alpha) {
496
+ const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span>
497
+ const imageData = <span class="cstat-no" title="statement not covered" >ctx.getImageData(0, 0, width, height);</span>
498
+ const data = <span class="cstat-no" title="statement not covered" >imageData.data;</span>
499
+
500
+ // Parse color
501
+ const colorInt = <span class="cstat-no" title="statement not covered" >parseInt(color.slice(1), 16);</span>
502
+ const r = <span class="cstat-no" title="statement not covered" >(colorInt &gt;&gt; 16) &amp; 255;</span>
503
+ const g = <span class="cstat-no" title="statement not covered" >(colorInt &gt;&gt; 8) &amp; 255;</span>
504
+ const b = <span class="cstat-no" title="statement not covered" >colorInt &amp; 255;</span>
505
+
506
+ // Apply mask
507
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; maskData.length; i++) {</span>
508
+ const maskValue = <span class="cstat-no" title="statement not covered" >maskData[i] / 255;</span>
509
+ <span class="cstat-no" title="statement not covered" > if (maskValue &gt; 0) {</span>
510
+ const idx = <span class="cstat-no" title="statement not covered" >i * 4;</span>
511
+ const maskAlpha = <span class="cstat-no" title="statement not covered" >maskValue * alpha;</span>
512
+
513
+ <span class="cstat-no" title="statement not covered" > data[idx] = Math.round(data[idx] * (1 - maskAlpha) + r * maskAlpha);</span>
514
+ <span class="cstat-no" title="statement not covered" > data[idx + 1] = Math.round(data[idx + 1] * (1 - maskAlpha) + g * maskAlpha);</span>
515
+ <span class="cstat-no" title="statement not covered" > data[idx + 2] = Math.round(data[idx + 2] * (1 - maskAlpha) + b * maskAlpha);</span>
516
+ }
517
+ }
518
+
519
+ <span class="cstat-no" title="statement not covered" > ctx.putImageData(imageData, 0, 0);</span>
520
+ }
521
+ &nbsp;
522
+ /**
523
+ * Draw segmentation masks on an image
524
+ * @param {Canvas} canvas - Canvas with loaded image
525
+ * @param {SegmentationMask[]} masks - Array of segmentation masks
526
+ * @param {Object} options - Drawing options
527
+ * @returns {Canvas} - Canvas with masks drawn
528
+ */
529
+ function <span class="fstat-no" title="function not covered" >plotSegmentationMasks(</span>canvas, masks, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
530
+ const {
531
+ lineWidth = <span class="branch-0 cbranch-no" title="branch not covered" >4,</span>
532
+ fontSize = <span class="branch-0 cbranch-no" title="branch not covered" >14,</span>
533
+ alpha = <span class="branch-0 cbranch-no" title="branch not covered" >0.7,</span>
534
+ showLabels = <span class="branch-0 cbranch-no" title="branch not covered" >true</span>
535
+ } = <span class="cstat-no" title="statement not covered" >options;</span>
536
+
537
+ const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span>
538
+ const width = <span class="cstat-no" title="statement not covered" >canvas.width;</span>
539
+ const height = <span class="cstat-no" title="statement not covered" >canvas.height;</span>
540
+
541
+ // Overlay masks first
542
+ <span class="cstat-no" title="statement not covered" > masks.forEach(<span class="fstat-no" title="function not covered" >(m</span>ask, i) =&gt; {</span>
543
+ const color = <span class="cstat-no" title="statement not covered" >COLORS[i % COLORS.length];</span>
544
+ <span class="cstat-no" title="statement not covered" > overlayMask(canvas, mask.mask, width, height, color, alpha);</span>
545
+ });
546
+
547
+ // Draw bounding boxes and labels
548
+ <span class="cstat-no" title="statement not covered" > ctx.lineWidth = lineWidth;</span>
549
+ <span class="cstat-no" title="statement not covered" > ctx.font = `${fontSize}px Arial`;</span>
550
+
551
+ <span class="cstat-no" title="statement not covered" > masks.forEach(<span class="fstat-no" title="function not covered" >(m</span>ask, i) =&gt; {</span>
552
+ const color = <span class="cstat-no" title="statement not covered" >COLORS[i % COLORS.length];</span>
553
+
554
+ // Draw bounding box
555
+ <span class="cstat-no" title="statement not covered" > ctx.strokeStyle = color;</span>
556
+ <span class="cstat-no" title="statement not covered" > ctx.strokeRect(mask.x0, mask.y0, mask.x1 - mask.x0, mask.y1 - mask.y0);</span>
557
+
558
+ // Draw label
559
+ <span class="cstat-no" title="statement not covered" > if (showLabels &amp;&amp; mask.label) {</span>
560
+ <span class="cstat-no" title="statement not covered" > ctx.fillStyle = color;</span>
561
+ <span class="cstat-no" title="statement not covered" > ctx.fillText(mask.label, mask.x0 + 8, mask.y0 - 6);</span>
562
+ }
563
+ });
564
+
565
+ <span class="cstat-no" title="statement not covered" > return canvas;</span>
566
+ }
567
+ &nbsp;
568
+ /**
569
+ * Load image into canvas
570
+ * @param {string} imagePath - Path to image file
571
+ * @param {number} maxSize - Maximum dimension
572
+ * @returns {Promise&lt;Canvas&gt;} - Canvas with loaded image
573
+ */
574
+ async function <span class="fstat-no" title="function not covered" >loadImageToCanvas(</span>imagePath, maxSize = <span class="branch-0 cbranch-no" title="branch not covered" >1024)</span> {
575
+ const img = <span class="cstat-no" title="statement not covered" >await loadImage(imagePath);</span>
576
+
577
+ // Calculate new dimensions
578
+ let width = <span class="cstat-no" title="statement not covered" >img.width;</span>
579
+ let height = <span class="cstat-no" title="statement not covered" >img.height;</span>
580
+
581
+ <span class="cstat-no" title="statement not covered" > if (width &gt; maxSize || height &gt; maxSize) {</span>
582
+ const scale = <span class="cstat-no" title="statement not covered" >Math.min(maxSize / width, maxSize / height);</span>
583
+ <span class="cstat-no" title="statement not covered" > width = Math.round(width * scale);</span>
584
+ <span class="cstat-no" title="statement not covered" > height = Math.round(height * scale);</span>
585
+ }
586
+
587
+ // Create canvas and draw image
588
+ const canvas = <span class="cstat-no" title="statement not covered" >createCanvas(width, height);</span>
589
+ const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span>
590
+ <span class="cstat-no" title="statement not covered" > ctx.drawImage(img, 0, 0, width, height);</span>
591
+
592
+ <span class="cstat-no" title="statement not covered" > return canvas;</span>
593
+ }
594
+ &nbsp;
595
+ /**
596
+ * Save canvas to file
597
+ * @param {Canvas} canvas - Canvas to save
598
+ * @param {string} outputPath - Output file path
599
+ */
600
+ async function <span class="fstat-no" title="function not covered" >saveCanvas(</span>canvas, outputPath) {
601
+ const buffer = <span class="cstat-no" title="statement not covered" >canvas.toBuffer('image/png');</span>
602
+ <span class="cstat-no" title="statement not covered" > await fs.writeFile(outputPath, buffer);</span>
603
+ }
604
+ &nbsp;
605
+ module.exports = {
606
+ plotBoundingBoxes,
607
+ plotSegmentationMasks,
608
+ loadImageToCanvas,
609
+ saveCanvas,
610
+ COLORS
611
+ };
612
+ &nbsp;</pre></td></tr></table></pre>
613
+
614
+ <div class='push'></div><!-- for sticky footer -->
615
+ </div><!-- /wrapper -->
616
+ <div class='footer quiet pad2 space-top1 center small'>
617
+ Code coverage generated by
618
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
619
+ at 2025-12-05T12:32:55.225Z
620
+ </div>
621
+ <script src="prettify.js"></script>
622
+ <script>
623
+ window.onload = function () {
624
+ prettyPrint();
625
+ };
626
+ </script>
627
+ <script src="sorter.js"></script>
628
+ <script src="block-navigation.js"></script>
629
+ </body>
630
+ </html>
631
+