projax 3.3.19 → 3.3.21

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 (66) hide show
  1. package/coverage/base.css +224 -0
  2. package/coverage/block-navigation.js +87 -0
  3. package/coverage/core-bridge.ts.html +268 -0
  4. package/coverage/favicon.png +0 -0
  5. package/coverage/index.html +176 -0
  6. package/coverage/lcov-report/base.css +224 -0
  7. package/coverage/lcov-report/block-navigation.js +87 -0
  8. package/coverage/lcov-report/core-bridge.ts.html +268 -0
  9. package/coverage/lcov-report/favicon.png +0 -0
  10. package/coverage/lcov-report/index.html +176 -0
  11. package/coverage/lcov-report/port-extractor.ts.html +1174 -0
  12. package/coverage/lcov-report/port-scanner.ts.html +301 -0
  13. package/coverage/lcov-report/port-utils.ts.html +670 -0
  14. package/coverage/lcov-report/prettify.css +1 -0
  15. package/coverage/lcov-report/prettify.js +2 -0
  16. package/coverage/lcov-report/script-runner.ts.html +3055 -0
  17. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/coverage/lcov-report/sorter.js +210 -0
  19. package/coverage/lcov.info +1117 -0
  20. package/coverage/port-extractor.ts.html +1174 -0
  21. package/coverage/port-scanner.ts.html +301 -0
  22. package/coverage/port-utils.ts.html +670 -0
  23. package/coverage/prettify.css +1 -0
  24. package/coverage/prettify.js +2 -0
  25. package/coverage/script-runner.ts.html +3055 -0
  26. package/coverage/sort-arrow-sprite.png +0 -0
  27. package/coverage/sorter.js +210 -0
  28. package/dist/__tests__/port-scanner.test.d.ts +1 -0
  29. package/dist/__tests__/port-scanner.test.js +170 -0
  30. package/dist/__tests__/port-utils.test.d.ts +1 -0
  31. package/dist/__tests__/port-utils.test.js +127 -0
  32. package/dist/__tests__/script-runner.test.d.ts +1 -0
  33. package/dist/__tests__/script-runner.test.js +491 -0
  34. package/dist/api/__tests__/database.test.d.ts +2 -0
  35. package/dist/api/__tests__/database.test.d.ts.map +1 -0
  36. package/dist/api/__tests__/database.test.js +485 -0
  37. package/dist/api/__tests__/database.test.js.map +1 -0
  38. package/dist/api/__tests__/routes.test.d.ts +2 -0
  39. package/dist/api/__tests__/routes.test.d.ts.map +1 -0
  40. package/dist/api/__tests__/routes.test.js +473 -0
  41. package/dist/api/__tests__/routes.test.js.map +1 -0
  42. package/dist/api/__tests__/scanner.test.d.ts +2 -0
  43. package/dist/api/__tests__/scanner.test.d.ts.map +1 -0
  44. package/dist/api/__tests__/scanner.test.js +402 -0
  45. package/dist/api/__tests__/scanner.test.js.map +1 -0
  46. package/dist/api/database.d.ts +1 -0
  47. package/dist/api/database.d.ts.map +1 -1
  48. package/dist/api/database.js +4 -0
  49. package/dist/api/database.js.map +1 -1
  50. package/dist/api/package.json +9 -1
  51. package/dist/api/routes/projects.d.ts.map +1 -1
  52. package/dist/api/routes/projects.js +8 -1
  53. package/dist/api/routes/projects.js.map +1 -1
  54. package/dist/api/routes/settings.d.ts.map +1 -1
  55. package/dist/api/routes/settings.js +2 -1
  56. package/dist/api/routes/settings.js.map +1 -1
  57. package/dist/api/services/scanner.d.ts.map +1 -1
  58. package/dist/api/services/scanner.js +7 -12
  59. package/dist/api/services/scanner.js.map +1 -1
  60. package/dist/electron/port-scanner.js +2 -2
  61. package/dist/electron/renderer/assets/index-C1SRt6Jx.js +62 -0
  62. package/dist/electron/renderer/assets/index-D1jmaGv5.css +1 -0
  63. package/dist/electron/renderer/index.html +2 -2
  64. package/dist/port-scanner.js +2 -2
  65. package/jest.config.js +18 -0
  66. package/package.json +7 -1
@@ -0,0 +1,3055 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for script-runner.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> script-runner.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">27.23% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>122/448</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">23.62% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>30/127</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">29.54% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>13/44</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">27.33% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>120/439</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
1057
+ <span class="cline-any cline-yes">1x</span>
1058
+ <span class="cline-any cline-yes">1x</span>
1059
+ <span class="cline-any cline-yes">1x</span>
1060
+ <span class="cline-any cline-yes">1x</span>
1061
+ <span class="cline-any cline-yes">1x</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-yes">26x</span>
1082
+ <span class="cline-any cline-yes">7x</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-yes">19x</span>
1085
+ <span class="cline-any cline-yes">5x</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-yes">14x</span>
1088
+ <span class="cline-any cline-yes">2x</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-yes">12x</span>
1091
+ <span class="cline-any cline-yes">3x</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-yes">9x</span>
1094
+ <span class="cline-any cline-yes">7x</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-yes">2x</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-yes">5x</span>
1104
+ <span class="cline-any cline-yes">5x</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-yes">5x</span>
1109
+ <span class="cline-any cline-yes">5x</span>
1110
+ <span class="cline-any cline-yes">4x</span>
1111
+ <span class="cline-any cline-yes">4x</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-yes">4x</span>
1114
+ <span class="cline-any cline-yes">6x</span>
1115
+ <span class="cline-any cline-yes">5x</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-neutral">&nbsp;</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-yes">4x</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-yes">1x</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-neutral">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-yes">4x</span>
1135
+ <span class="cline-any cline-yes">4x</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-yes">4x</span>
1140
+ <span class="cline-any cline-yes">4x</span>
1141
+ <span class="cline-any cline-yes">4x</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-yes">4x</span>
1146
+ <span class="cline-any cline-yes">4x</span>
1147
+ <span class="cline-any cline-yes">2x</span>
1148
+ <span class="cline-any cline-yes">2x</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-yes">2x</span>
1151
+ <span class="cline-any cline-yes">6x</span>
1152
+ <span class="cline-any cline-yes">6x</span>
1153
+ <span class="cline-any cline-yes">3x</span>
1154
+ <span class="cline-any cline-yes">3x</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-neutral">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-yes">4x</span>
1166
+ <span class="cline-any cline-yes">4x</span>
1167
+ <span class="cline-any cline-yes">2x</span>
1168
+ <span class="cline-any cline-yes">2x</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-yes">2x</span>
1171
+ <span class="cline-any cline-yes">5x</span>
1172
+ <span class="cline-any cline-yes">5x</span>
1173
+ <span class="cline-any cline-yes">3x</span>
1174
+ <span class="cline-any cline-yes">3x</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-yes">4x</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-neutral">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-neutral">&nbsp;</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-yes">1x</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-yes">1x</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-yes">1x</span>
1208
+ <span class="cline-any cline-yes">6x</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-neutral">&nbsp;</span>
1214
+ <span class="cline-any cline-neutral">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-yes">1x</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1221
+ <span class="cline-any cline-neutral">&nbsp;</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-yes">8x</span>
1224
+ <span class="cline-any cline-neutral">&nbsp;</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-neutral">&nbsp;</span>
1227
+ <span class="cline-any cline-yes">8x</span>
1228
+ <span class="cline-any cline-yes">2x</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-yes">6x</span>
1232
+ <span class="cline-any cline-yes">6x</span>
1233
+ <span class="cline-any cline-yes">6x</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-yes">6x</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-yes">6x</span>
1241
+ <span class="cline-any cline-yes">12x</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-yes">12x</span>
1244
+ <span class="cline-any cline-yes">12x</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-neutral">&nbsp;</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-yes">6x</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-neutral">&nbsp;</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-yes">1x</span>
1263
+ <span class="cline-any cline-yes">18x</span>
1264
+ <span class="cline-any cline-yes">18x</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-yes">18x</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-yes">5x</span>
1269
+ <span class="cline-any cline-yes">5x</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-yes">4x</span>
1272
+ <span class="cline-any cline-yes">4x</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-yes">1x</span>
1275
+ <span class="cline-any cline-yes">1x</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-yes">5x</span>
1278
+ <span class="cline-any cline-yes">5x</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-yes">2x</span>
1283
+ <span class="cline-any cline-yes">2x</span>
1284
+ <span class="cline-any cline-yes">1x</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-yes">1x</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-neutral">&nbsp;</span>
1292
+ <span class="cline-any cline-neutral">&nbsp;</span>
1293
+ <span class="cline-any cline-yes">1x</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&nbsp;</span>
1299
+ <span class="cline-any cline-yes">1x</span>
1300
+ <span class="cline-any cline-neutral">&nbsp;</span>
1301
+ <span class="cline-any cline-neutral">&nbsp;</span>
1302
+ <span class="cline-any cline-neutral">&nbsp;</span>
1303
+ <span class="cline-any cline-neutral">&nbsp;</span>
1304
+ <span class="cline-any cline-neutral">&nbsp;</span>
1305
+ <span class="cline-any cline-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-yes">2x</span>
1307
+ <span class="cline-any cline-neutral">&nbsp;</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-yes">1x</span>
1310
+ <span class="cline-any cline-yes">1x</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-yes">18x</span>
1314
+ <span class="cline-any cline-neutral">&nbsp;</span>
1315
+ <span class="cline-any cline-neutral">&nbsp;</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-neutral">&nbsp;</span>
1326
+ <span class="cline-any cline-neutral">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-neutral">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-no">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-no">&nbsp;</span>
1344
+ <span class="cline-any cline-no">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-no">&nbsp;</span>
1348
+ <span class="cline-any cline-no">&nbsp;</span>
1349
+ <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-neutral">&nbsp;</span>
1351
+ <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
+ <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-no">&nbsp;</span>
1359
+ <span class="cline-any cline-no">&nbsp;</span>
1360
+ <span class="cline-any cline-no">&nbsp;</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-neutral">&nbsp;</span>
1363
+ <span class="cline-any cline-no">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-no">&nbsp;</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-neutral">&nbsp;</span>
1372
+ <span class="cline-any cline-neutral">&nbsp;</span>
1373
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-neutral">&nbsp;</span>
1376
+ <span class="cline-any cline-neutral">&nbsp;</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
+ <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-no">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-no">&nbsp;</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-neutral">&nbsp;</span>
1388
+ <span class="cline-any cline-no">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-no">&nbsp;</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-neutral">&nbsp;</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-neutral">&nbsp;</span>
1397
+ <span class="cline-any cline-neutral">&nbsp;</span>
1398
+ <span class="cline-any cline-no">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-no">&nbsp;</span>
1406
+ <span class="cline-any cline-neutral">&nbsp;</span>
1407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-yes">1x</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
1414
+ <span class="cline-any cline-neutral">&nbsp;</span>
1415
+ <span class="cline-any cline-neutral">&nbsp;</span>
1416
+ <span class="cline-any cline-neutral">&nbsp;</span>
1417
+ <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-neutral">&nbsp;</span>
1421
+ <span class="cline-any cline-no">&nbsp;</span>
1422
+ <span class="cline-any cline-no">&nbsp;</span>
1423
+ <span class="cline-any cline-no">&nbsp;</span>
1424
+ <span class="cline-any cline-neutral">&nbsp;</span>
1425
+ <span class="cline-any cline-neutral">&nbsp;</span>
1426
+ <span class="cline-any cline-neutral">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-no">&nbsp;</span>
1429
+ <span class="cline-any cline-no">&nbsp;</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-neutral">&nbsp;</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-neutral">&nbsp;</span>
1434
+ <span class="cline-any cline-neutral">&nbsp;</span>
1435
+ <span class="cline-any cline-neutral">&nbsp;</span>
1436
+ <span class="cline-any cline-no">&nbsp;</span>
1437
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
+ <span class="cline-any cline-no">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-no">&nbsp;</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-no">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-no">&nbsp;</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-neutral">&nbsp;</span>
1450
+ <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-neutral">&nbsp;</span>
1454
+ <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-neutral">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
1457
+ <span class="cline-any cline-no">&nbsp;</span>
1458
+ <span class="cline-any cline-no">&nbsp;</span>
1459
+ <span class="cline-any cline-neutral">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-no">&nbsp;</span>
1462
+ <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-neutral">&nbsp;</span>
1464
+ <span class="cline-any cline-no">&nbsp;</span>
1465
+ <span class="cline-any cline-no">&nbsp;</span>
1466
+ <span class="cline-any cline-no">&nbsp;</span>
1467
+ <span class="cline-any cline-no">&nbsp;</span>
1468
+ <span class="cline-any cline-neutral">&nbsp;</span>
1469
+ <span class="cline-any cline-no">&nbsp;</span>
1470
+ <span class="cline-any cline-neutral">&nbsp;</span>
1471
+ <span class="cline-any cline-no">&nbsp;</span>
1472
+ <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-no">&nbsp;</span>
1474
+ <span class="cline-any cline-no">&nbsp;</span>
1475
+ <span class="cline-any cline-no">&nbsp;</span>
1476
+ <span class="cline-any cline-neutral">&nbsp;</span>
1477
+ <span class="cline-any cline-neutral">&nbsp;</span>
1478
+ <span class="cline-any cline-no">&nbsp;</span>
1479
+ <span class="cline-any cline-no">&nbsp;</span>
1480
+ <span class="cline-any cline-no">&nbsp;</span>
1481
+ <span class="cline-any cline-no">&nbsp;</span>
1482
+ <span class="cline-any cline-neutral">&nbsp;</span>
1483
+ <span class="cline-any cline-neutral">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-neutral">&nbsp;</span>
1487
+ <span class="cline-any cline-neutral">&nbsp;</span>
1488
+ <span class="cline-any cline-no">&nbsp;</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-neutral">&nbsp;</span>
1491
+ <span class="cline-any cline-no">&nbsp;</span>
1492
+ <span class="cline-any cline-neutral">&nbsp;</span>
1493
+ <span class="cline-any cline-neutral">&nbsp;</span>
1494
+ <span class="cline-any cline-neutral">&nbsp;</span>
1495
+ <span class="cline-any cline-neutral">&nbsp;</span>
1496
+ <span class="cline-any cline-neutral">&nbsp;</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</span>
1498
+ <span class="cline-any cline-no">&nbsp;</span>
1499
+ <span class="cline-any cline-no">&nbsp;</span>
1500
+ <span class="cline-any cline-no">&nbsp;</span>
1501
+ <span class="cline-any cline-no">&nbsp;</span>
1502
+ <span class="cline-any cline-neutral">&nbsp;</span>
1503
+ <span class="cline-any cline-neutral">&nbsp;</span>
1504
+ <span class="cline-any cline-neutral">&nbsp;</span>
1505
+ <span class="cline-any cline-no">&nbsp;</span>
1506
+ <span class="cline-any cline-no">&nbsp;</span>
1507
+ <span class="cline-any cline-no">&nbsp;</span>
1508
+ <span class="cline-any cline-no">&nbsp;</span>
1509
+ <span class="cline-any cline-neutral">&nbsp;</span>
1510
+ <span class="cline-any cline-neutral">&nbsp;</span>
1511
+ <span class="cline-any cline-neutral">&nbsp;</span>
1512
+ <span class="cline-any cline-no">&nbsp;</span>
1513
+ <span class="cline-any cline-no">&nbsp;</span>
1514
+ <span class="cline-any cline-no">&nbsp;</span>
1515
+ <span class="cline-any cline-neutral">&nbsp;</span>
1516
+ <span class="cline-any cline-neutral">&nbsp;</span>
1517
+ <span class="cline-any cline-no">&nbsp;</span>
1518
+ <span class="cline-any cline-no">&nbsp;</span>
1519
+ <span class="cline-any cline-neutral">&nbsp;</span>
1520
+ <span class="cline-any cline-no">&nbsp;</span>
1521
+ <span class="cline-any cline-no">&nbsp;</span>
1522
+ <span class="cline-any cline-no">&nbsp;</span>
1523
+ <span class="cline-any cline-no">&nbsp;</span>
1524
+ <span class="cline-any cline-neutral">&nbsp;</span>
1525
+ <span class="cline-any cline-no">&nbsp;</span>
1526
+ <span class="cline-any cline-no">&nbsp;</span>
1527
+ <span class="cline-any cline-neutral">&nbsp;</span>
1528
+ <span class="cline-any cline-no">&nbsp;</span>
1529
+ <span class="cline-any cline-no">&nbsp;</span>
1530
+ <span class="cline-any cline-no">&nbsp;</span>
1531
+ <span class="cline-any cline-neutral">&nbsp;</span>
1532
+ <span class="cline-any cline-no">&nbsp;</span>
1533
+ <span class="cline-any cline-neutral">&nbsp;</span>
1534
+ <span class="cline-any cline-neutral">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
1536
+ <span class="cline-any cline-neutral">&nbsp;</span>
1537
+ <span class="cline-any cline-neutral">&nbsp;</span>
1538
+ <span class="cline-any cline-no">&nbsp;</span>
1539
+ <span class="cline-any cline-neutral">&nbsp;</span>
1540
+ <span class="cline-any cline-neutral">&nbsp;</span>
1541
+ <span class="cline-any cline-neutral">&nbsp;</span>
1542
+ <span class="cline-any cline-neutral">&nbsp;</span>
1543
+ <span class="cline-any cline-no">&nbsp;</span>
1544
+ <span class="cline-any cline-no">&nbsp;</span>
1545
+ <span class="cline-any cline-neutral">&nbsp;</span>
1546
+ <span class="cline-any cline-neutral">&nbsp;</span>
1547
+ <span class="cline-any cline-neutral">&nbsp;</span>
1548
+ <span class="cline-any cline-neutral">&nbsp;</span>
1549
+ <span class="cline-any cline-neutral">&nbsp;</span>
1550
+ <span class="cline-any cline-neutral">&nbsp;</span>
1551
+ <span class="cline-any cline-neutral">&nbsp;</span>
1552
+ <span class="cline-any cline-neutral">&nbsp;</span>
1553
+ <span class="cline-any cline-neutral">&nbsp;</span>
1554
+ <span class="cline-any cline-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-neutral">&nbsp;</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&nbsp;</span>
1559
+ <span class="cline-any cline-neutral">&nbsp;</span>
1560
+ <span class="cline-any cline-neutral">&nbsp;</span>
1561
+ <span class="cline-any cline-neutral">&nbsp;</span>
1562
+ <span class="cline-any cline-neutral">&nbsp;</span>
1563
+ <span class="cline-any cline-neutral">&nbsp;</span>
1564
+ <span class="cline-any cline-neutral">&nbsp;</span>
1565
+ <span class="cline-any cline-yes">12x</span>
1566
+ <span class="cline-any cline-yes">12x</span>
1567
+ <span class="cline-any cline-yes">2x</span>
1568
+ <span class="cline-any cline-neutral">&nbsp;</span>
1569
+ <span class="cline-any cline-yes">12x</span>
1570
+ <span class="cline-any cline-neutral">&nbsp;</span>
1571
+ <span class="cline-any cline-neutral">&nbsp;</span>
1572
+ <span class="cline-any cline-neutral">&nbsp;</span>
1573
+ <span class="cline-any cline-neutral">&nbsp;</span>
1574
+ <span class="cline-any cline-neutral">&nbsp;</span>
1575
+ <span class="cline-any cline-yes">1x</span>
1576
+ <span class="cline-any cline-yes">10x</span>
1577
+ <span class="cline-any cline-yes">10x</span>
1578
+ <span class="cline-any cline-yes">2x</span>
1579
+ <span class="cline-any cline-neutral">&nbsp;</span>
1580
+ <span class="cline-any cline-yes">8x</span>
1581
+ <span class="cline-any cline-yes">8x</span>
1582
+ <span class="cline-any cline-yes">8x</span>
1583
+ <span class="cline-any cline-neutral">&nbsp;</span>
1584
+ <span class="cline-any cline-yes">1x</span>
1585
+ <span class="cline-any cline-neutral">&nbsp;</span>
1586
+ <span class="cline-any cline-neutral">&nbsp;</span>
1587
+ <span class="cline-any cline-neutral">&nbsp;</span>
1588
+ <span class="cline-any cline-neutral">&nbsp;</span>
1589
+ <span class="cline-any cline-neutral">&nbsp;</span>
1590
+ <span class="cline-any cline-neutral">&nbsp;</span>
1591
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
+ <span class="cline-any cline-yes">2x</span>
1593
+ <span class="cline-any cline-yes">2x</span>
1594
+ <span class="cline-any cline-neutral">&nbsp;</span>
1595
+ <span class="cline-any cline-neutral">&nbsp;</span>
1596
+ <span class="cline-any cline-neutral">&nbsp;</span>
1597
+ <span class="cline-any cline-neutral">&nbsp;</span>
1598
+ <span class="cline-any cline-neutral">&nbsp;</span>
1599
+ <span class="cline-any cline-neutral">&nbsp;</span>
1600
+ <span class="cline-any cline-no">&nbsp;</span>
1601
+ <span class="cline-any cline-no">&nbsp;</span>
1602
+ <span class="cline-any cline-no">&nbsp;</span>
1603
+ <span class="cline-any cline-neutral">&nbsp;</span>
1604
+ <span class="cline-any cline-neutral">&nbsp;</span>
1605
+ <span class="cline-any cline-neutral">&nbsp;</span>
1606
+ <span class="cline-any cline-neutral">&nbsp;</span>
1607
+ <span class="cline-any cline-neutral">&nbsp;</span>
1608
+ <span class="cline-any cline-yes">1x</span>
1609
+ <span class="cline-any cline-yes">2x</span>
1610
+ <span class="cline-any cline-yes">3x</span>
1611
+ <span class="cline-any cline-yes">2x</span>
1612
+ <span class="cline-any cline-neutral">&nbsp;</span>
1613
+ <span class="cline-any cline-neutral">&nbsp;</span>
1614
+ <span class="cline-any cline-neutral">&nbsp;</span>
1615
+ <span class="cline-any cline-neutral">&nbsp;</span>
1616
+ <span class="cline-any cline-neutral">&nbsp;</span>
1617
+ <span class="cline-any cline-yes">1x</span>
1618
+ <span class="cline-any cline-yes">3x</span>
1619
+ <span class="cline-any cline-yes">6x</span>
1620
+ <span class="cline-any cline-neutral">&nbsp;</span>
1621
+ <span class="cline-any cline-neutral">&nbsp;</span>
1622
+ <span class="cline-any cline-neutral">&nbsp;</span>
1623
+ <span class="cline-any cline-neutral">&nbsp;</span>
1624
+ <span class="cline-any cline-neutral">&nbsp;</span>
1625
+ <span class="cline-any cline-neutral">&nbsp;</span>
1626
+ <span class="cline-any cline-no">&nbsp;</span>
1627
+ <span class="cline-any cline-no">&nbsp;</span>
1628
+ <span class="cline-any cline-no">&nbsp;</span>
1629
+ <span class="cline-any cline-no">&nbsp;</span>
1630
+ <span class="cline-any cline-no">&nbsp;</span>
1631
+ <span class="cline-any cline-no">&nbsp;</span>
1632
+ <span class="cline-any cline-no">&nbsp;</span>
1633
+ <span class="cline-any cline-neutral">&nbsp;</span>
1634
+ <span class="cline-any cline-neutral">&nbsp;</span>
1635
+ <span class="cline-any cline-no">&nbsp;</span>
1636
+ <span class="cline-any cline-no">&nbsp;</span>
1637
+ <span class="cline-any cline-no">&nbsp;</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-no">&nbsp;</span>
1640
+ <span class="cline-any cline-neutral">&nbsp;</span>
1641
+ <span class="cline-any cline-neutral">&nbsp;</span>
1642
+ <span class="cline-any cline-neutral">&nbsp;</span>
1643
+ <span class="cline-any cline-no">&nbsp;</span>
1644
+ <span class="cline-any cline-neutral">&nbsp;</span>
1645
+ <span class="cline-any cline-neutral">&nbsp;</span>
1646
+ <span class="cline-any cline-neutral">&nbsp;</span>
1647
+ <span class="cline-any cline-neutral">&nbsp;</span>
1648
+ <span class="cline-any cline-neutral">&nbsp;</span>
1649
+ <span class="cline-any cline-neutral">&nbsp;</span>
1650
+ <span class="cline-any cline-neutral">&nbsp;</span>
1651
+ <span class="cline-any cline-no">&nbsp;</span>
1652
+ <span class="cline-any cline-no">&nbsp;</span>
1653
+ <span class="cline-any cline-neutral">&nbsp;</span>
1654
+ <span class="cline-any cline-no">&nbsp;</span>
1655
+ <span class="cline-any cline-no">&nbsp;</span>
1656
+ <span class="cline-any cline-no">&nbsp;</span>
1657
+ <span class="cline-any cline-no">&nbsp;</span>
1658
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
+ <span class="cline-any cline-neutral">&nbsp;</span>
1660
+ <span class="cline-any cline-neutral">&nbsp;</span>
1661
+ <span class="cline-any cline-no">&nbsp;</span>
1662
+ <span class="cline-any cline-no">&nbsp;</span>
1663
+ <span class="cline-any cline-neutral">&nbsp;</span>
1664
+ <span class="cline-any cline-neutral">&nbsp;</span>
1665
+ <span class="cline-any cline-neutral">&nbsp;</span>
1666
+ <span class="cline-any cline-neutral">&nbsp;</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-neutral">&nbsp;</span>
1669
+ <span class="cline-any cline-yes">1x</span>
1670
+ <span class="cline-any cline-no">&nbsp;</span>
1671
+ <span class="cline-any cline-neutral">&nbsp;</span>
1672
+ <span class="cline-any cline-neutral">&nbsp;</span>
1673
+ <span class="cline-any cline-neutral">&nbsp;</span>
1674
+ <span class="cline-any cline-neutral">&nbsp;</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-yes">1x</span>
1677
+ <span class="cline-any cline-no">&nbsp;</span>
1678
+ <span class="cline-any cline-no">&nbsp;</span>
1679
+ <span class="cline-any cline-neutral">&nbsp;</span>
1680
+ <span class="cline-any cline-neutral">&nbsp;</span>
1681
+ <span class="cline-any cline-neutral">&nbsp;</span>
1682
+ <span class="cline-any cline-neutral">&nbsp;</span>
1683
+ <span class="cline-any cline-neutral">&nbsp;</span>
1684
+ <span class="cline-any cline-neutral">&nbsp;</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-no">&nbsp;</span>
1687
+ <span class="cline-any cline-neutral">&nbsp;</span>
1688
+ <span class="cline-any cline-neutral">&nbsp;</span>
1689
+ <span class="cline-any cline-neutral">&nbsp;</span>
1690
+ <span class="cline-any cline-neutral">&nbsp;</span>
1691
+ <span class="cline-any cline-neutral">&nbsp;</span>
1692
+ <span class="cline-any cline-neutral">&nbsp;</span>
1693
+ <span class="cline-any cline-neutral">&nbsp;</span>
1694
+ <span class="cline-any cline-no">&nbsp;</span>
1695
+ <span class="cline-any cline-no">&nbsp;</span>
1696
+ <span class="cline-any cline-no">&nbsp;</span>
1697
+ <span class="cline-any cline-no">&nbsp;</span>
1698
+ <span class="cline-any cline-no">&nbsp;</span>
1699
+ <span class="cline-any cline-no">&nbsp;</span>
1700
+ <span class="cline-any cline-neutral">&nbsp;</span>
1701
+ <span class="cline-any cline-neutral">&nbsp;</span>
1702
+ <span class="cline-any cline-neutral">&nbsp;</span>
1703
+ <span class="cline-any cline-neutral">&nbsp;</span>
1704
+ <span class="cline-any cline-no">&nbsp;</span>
1705
+ <span class="cline-any cline-neutral">&nbsp;</span>
1706
+ <span class="cline-any cline-neutral">&nbsp;</span>
1707
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1709
+ <span class="cline-any cline-neutral">&nbsp;</span>
1710
+ <span class="cline-any cline-neutral">&nbsp;</span>
1711
+ <span class="cline-any cline-no">&nbsp;</span>
1712
+ <span class="cline-any cline-no">&nbsp;</span>
1713
+ <span class="cline-any cline-no">&nbsp;</span>
1714
+ <span class="cline-any cline-no">&nbsp;</span>
1715
+ <span class="cline-any cline-neutral">&nbsp;</span>
1716
+ <span class="cline-any cline-no">&nbsp;</span>
1717
+ <span class="cline-any cline-no">&nbsp;</span>
1718
+ <span class="cline-any cline-no">&nbsp;</span>
1719
+ <span class="cline-any cline-no">&nbsp;</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-neutral">&nbsp;</span>
1722
+ <span class="cline-any cline-neutral">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-no">&nbsp;</span>
1725
+ <span class="cline-any cline-neutral">&nbsp;</span>
1726
+ <span class="cline-any cline-neutral">&nbsp;</span>
1727
+ <span class="cline-any cline-neutral">&nbsp;</span>
1728
+ <span class="cline-any cline-neutral">&nbsp;</span>
1729
+ <span class="cline-any cline-neutral">&nbsp;</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-yes">1x</span>
1732
+ <span class="cline-any cline-no">&nbsp;</span>
1733
+ <span class="cline-any cline-no">&nbsp;</span>
1734
+ <span class="cline-any cline-no">&nbsp;</span>
1735
+ <span class="cline-any cline-neutral">&nbsp;</span>
1736
+ <span class="cline-any cline-no">&nbsp;</span>
1737
+ <span class="cline-any cline-no">&nbsp;</span>
1738
+ <span class="cline-any cline-neutral">&nbsp;</span>
1739
+ <span class="cline-any cline-neutral">&nbsp;</span>
1740
+ <span class="cline-any cline-neutral">&nbsp;</span>
1741
+ <span class="cline-any cline-no">&nbsp;</span>
1742
+ <span class="cline-any cline-no">&nbsp;</span>
1743
+ <span class="cline-any cline-no">&nbsp;</span>
1744
+ <span class="cline-any cline-no">&nbsp;</span>
1745
+ <span class="cline-any cline-no">&nbsp;</span>
1746
+ <span class="cline-any cline-no">&nbsp;</span>
1747
+ <span class="cline-any cline-no">&nbsp;</span>
1748
+ <span class="cline-any cline-no">&nbsp;</span>
1749
+ <span class="cline-any cline-neutral">&nbsp;</span>
1750
+ <span class="cline-any cline-no">&nbsp;</span>
1751
+ <span class="cline-any cline-no">&nbsp;</span>
1752
+ <span class="cline-any cline-no">&nbsp;</span>
1753
+ <span class="cline-any cline-no">&nbsp;</span>
1754
+ <span class="cline-any cline-no">&nbsp;</span>
1755
+ <span class="cline-any cline-neutral">&nbsp;</span>
1756
+ <span class="cline-any cline-neutral">&nbsp;</span>
1757
+ <span class="cline-any cline-neutral">&nbsp;</span>
1758
+ <span class="cline-any cline-no">&nbsp;</span>
1759
+ <span class="cline-any cline-neutral">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1761
+ <span class="cline-any cline-neutral">&nbsp;</span>
1762
+ <span class="cline-any cline-no">&nbsp;</span>
1763
+ <span class="cline-any cline-no">&nbsp;</span>
1764
+ <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-no">&nbsp;</span>
1766
+ <span class="cline-any cline-no">&nbsp;</span>
1767
+ <span class="cline-any cline-no">&nbsp;</span>
1768
+ <span class="cline-any cline-no">&nbsp;</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-no">&nbsp;</span>
1771
+ <span class="cline-any cline-no">&nbsp;</span>
1772
+ <span class="cline-any cline-no">&nbsp;</span>
1773
+ <span class="cline-any cline-no">&nbsp;</span>
1774
+ <span class="cline-any cline-neutral">&nbsp;</span>
1775
+ <span class="cline-any cline-neutral">&nbsp;</span>
1776
+ <span class="cline-any cline-neutral">&nbsp;</span>
1777
+ <span class="cline-any cline-no">&nbsp;</span>
1778
+ <span class="cline-any cline-neutral">&nbsp;</span>
1779
+ <span class="cline-any cline-neutral">&nbsp;</span>
1780
+ <span class="cline-any cline-neutral">&nbsp;</span>
1781
+ <span class="cline-any cline-neutral">&nbsp;</span>
1782
+ <span class="cline-any cline-no">&nbsp;</span>
1783
+ <span class="cline-any cline-no">&nbsp;</span>
1784
+ <span class="cline-any cline-neutral">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-neutral">&nbsp;</span>
1788
+ <span class="cline-any cline-neutral">&nbsp;</span>
1789
+ <span class="cline-any cline-neutral">&nbsp;</span>
1790
+ <span class="cline-any cline-neutral">&nbsp;</span>
1791
+ <span class="cline-any cline-neutral">&nbsp;</span>
1792
+ <span class="cline-any cline-neutral">&nbsp;</span>
1793
+ <span class="cline-any cline-yes">1x</span>
1794
+ <span class="cline-any cline-no">&nbsp;</span>
1795
+ <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-no">&nbsp;</span>
1797
+ <span class="cline-any cline-no">&nbsp;</span>
1798
+ <span class="cline-any cline-neutral">&nbsp;</span>
1799
+ <span class="cline-any cline-neutral">&nbsp;</span>
1800
+ <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-no">&nbsp;</span>
1802
+ <span class="cline-any cline-no">&nbsp;</span>
1803
+ <span class="cline-any cline-neutral">&nbsp;</span>
1804
+ <span class="cline-any cline-no">&nbsp;</span>
1805
+ <span class="cline-any cline-neutral">&nbsp;</span>
1806
+ <span class="cline-any cline-no">&nbsp;</span>
1807
+ <span class="cline-any cline-neutral">&nbsp;</span>
1808
+ <span class="cline-any cline-neutral">&nbsp;</span>
1809
+ <span class="cline-any cline-no">&nbsp;</span>
1810
+ <span class="cline-any cline-no">&nbsp;</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-no">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-neutral">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1818
+ <span class="cline-any cline-neutral">&nbsp;</span>
1819
+ <span class="cline-any cline-neutral">&nbsp;</span>
1820
+ <span class="cline-any cline-yes">1x</span>
1821
+ <span class="cline-any cline-no">&nbsp;</span>
1822
+ <span class="cline-any cline-no">&nbsp;</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-no">&nbsp;</span>
1825
+ <span class="cline-any cline-no">&nbsp;</span>
1826
+ <span class="cline-any cline-no">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1828
+ <span class="cline-any cline-neutral">&nbsp;</span>
1829
+ <span class="cline-any cline-neutral">&nbsp;</span>
1830
+ <span class="cline-any cline-no">&nbsp;</span>
1831
+ <span class="cline-any cline-neutral">&nbsp;</span>
1832
+ <span class="cline-any cline-neutral">&nbsp;</span>
1833
+ <span class="cline-any cline-neutral">&nbsp;</span>
1834
+ <span class="cline-any cline-neutral">&nbsp;</span>
1835
+ <span class="cline-any cline-neutral">&nbsp;</span>
1836
+ <span class="cline-any cline-yes">1x</span>
1837
+ <span class="cline-any cline-neutral">&nbsp;</span>
1838
+ <span class="cline-any cline-neutral">&nbsp;</span>
1839
+ <span class="cline-any cline-neutral">&nbsp;</span>
1840
+ <span class="cline-any cline-neutral">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-neutral">&nbsp;</span>
1843
+ <span class="cline-any cline-no">&nbsp;</span>
1844
+ <span class="cline-any cline-no">&nbsp;</span>
1845
+ <span class="cline-any cline-no">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-no">&nbsp;</span>
1848
+ <span class="cline-any cline-no">&nbsp;</span>
1849
+ <span class="cline-any cline-no">&nbsp;</span>
1850
+ <span class="cline-any cline-neutral">&nbsp;</span>
1851
+ <span class="cline-any cline-neutral">&nbsp;</span>
1852
+ <span class="cline-any cline-neutral">&nbsp;</span>
1853
+ <span class="cline-any cline-no">&nbsp;</span>
1854
+ <span class="cline-any cline-no">&nbsp;</span>
1855
+ <span class="cline-any cline-no">&nbsp;</span>
1856
+ <span class="cline-any cline-no">&nbsp;</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-neutral">&nbsp;</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-neutral">&nbsp;</span>
1862
+ <span class="cline-any cline-no">&nbsp;</span>
1863
+ <span class="cline-any cline-neutral">&nbsp;</span>
1864
+ <span class="cline-any cline-no">&nbsp;</span>
1865
+ <span class="cline-any cline-no">&nbsp;</span>
1866
+ <span class="cline-any cline-no">&nbsp;</span>
1867
+ <span class="cline-any cline-neutral">&nbsp;</span>
1868
+ <span class="cline-any cline-no">&nbsp;</span>
1869
+ <span class="cline-any cline-no">&nbsp;</span>
1870
+ <span class="cline-any cline-no">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-no">&nbsp;</span>
1873
+ <span class="cline-any cline-no">&nbsp;</span>
1874
+ <span class="cline-any cline-no">&nbsp;</span>
1875
+ <span class="cline-any cline-neutral">&nbsp;</span>
1876
+ <span class="cline-any cline-no">&nbsp;</span>
1877
+ <span class="cline-any cline-no">&nbsp;</span>
1878
+ <span class="cline-any cline-no">&nbsp;</span>
1879
+ <span class="cline-any cline-neutral">&nbsp;</span>
1880
+ <span class="cline-any cline-no">&nbsp;</span>
1881
+ <span class="cline-any cline-no">&nbsp;</span>
1882
+ <span class="cline-any cline-no">&nbsp;</span>
1883
+ <span class="cline-any cline-no">&nbsp;</span>
1884
+ <span class="cline-any cline-neutral">&nbsp;</span>
1885
+ <span class="cline-any cline-no">&nbsp;</span>
1886
+ <span class="cline-any cline-no">&nbsp;</span>
1887
+ <span class="cline-any cline-no">&nbsp;</span>
1888
+ <span class="cline-any cline-neutral">&nbsp;</span>
1889
+ <span class="cline-any cline-no">&nbsp;</span>
1890
+ <span class="cline-any cline-no">&nbsp;</span>
1891
+ <span class="cline-any cline-no">&nbsp;</span>
1892
+ <span class="cline-any cline-no">&nbsp;</span>
1893
+ <span class="cline-any cline-neutral">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-neutral">&nbsp;</span>
1896
+ <span class="cline-any cline-no">&nbsp;</span>
1897
+ <span class="cline-any cline-neutral">&nbsp;</span>
1898
+ <span class="cline-any cline-no">&nbsp;</span>
1899
+ <span class="cline-any cline-no">&nbsp;</span>
1900
+ <span class="cline-any cline-no">&nbsp;</span>
1901
+ <span class="cline-any cline-neutral">&nbsp;</span>
1902
+ <span class="cline-any cline-no">&nbsp;</span>
1903
+ <span class="cline-any cline-no">&nbsp;</span>
1904
+ <span class="cline-any cline-no">&nbsp;</span>
1905
+ <span class="cline-any cline-no">&nbsp;</span>
1906
+ <span class="cline-any cline-neutral">&nbsp;</span>
1907
+ <span class="cline-any cline-neutral">&nbsp;</span>
1908
+ <span class="cline-any cline-neutral">&nbsp;</span>
1909
+ <span class="cline-any cline-no">&nbsp;</span>
1910
+ <span class="cline-any cline-no">&nbsp;</span>
1911
+ <span class="cline-any cline-no">&nbsp;</span>
1912
+ <span class="cline-any cline-no">&nbsp;</span>
1913
+ <span class="cline-any cline-neutral">&nbsp;</span>
1914
+ <span class="cline-any cline-no">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-neutral">&nbsp;</span>
1917
+ <span class="cline-any cline-no">&nbsp;</span>
1918
+ <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-neutral">&nbsp;</span>
1920
+ <span class="cline-any cline-neutral">&nbsp;</span>
1921
+ <span class="cline-any cline-no">&nbsp;</span>
1922
+ <span class="cline-any cline-no">&nbsp;</span>
1923
+ <span class="cline-any cline-neutral">&nbsp;</span>
1924
+ <span class="cline-any cline-neutral">&nbsp;</span>
1925
+ <span class="cline-any cline-neutral">&nbsp;</span>
1926
+ <span class="cline-any cline-neutral">&nbsp;</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-neutral">&nbsp;</span>
1929
+ <span class="cline-any cline-no">&nbsp;</span>
1930
+ <span class="cline-any cline-no">&nbsp;</span>
1931
+ <span class="cline-any cline-no">&nbsp;</span>
1932
+ <span class="cline-any cline-neutral">&nbsp;</span>
1933
+ <span class="cline-any cline-neutral">&nbsp;</span>
1934
+ <span class="cline-any cline-no">&nbsp;</span>
1935
+ <span class="cline-any cline-no">&nbsp;</span>
1936
+ <span class="cline-any cline-no">&nbsp;</span>
1937
+ <span class="cline-any cline-no">&nbsp;</span>
1938
+ <span class="cline-any cline-neutral">&nbsp;</span>
1939
+ <span class="cline-any cline-neutral">&nbsp;</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-no">&nbsp;</span>
1942
+ <span class="cline-any cline-no">&nbsp;</span>
1943
+ <span class="cline-any cline-no">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-neutral">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-no">&nbsp;</span>
1949
+ <span class="cline-any cline-no">&nbsp;</span>
1950
+ <span class="cline-any cline-no">&nbsp;</span>
1951
+ <span class="cline-any cline-neutral">&nbsp;</span>
1952
+ <span class="cline-any cline-neutral">&nbsp;</span>
1953
+ <span class="cline-any cline-neutral">&nbsp;</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-neutral">&nbsp;</span>
1956
+ <span class="cline-any cline-neutral">&nbsp;</span>
1957
+ <span class="cline-any cline-no">&nbsp;</span>
1958
+ <span class="cline-any cline-neutral">&nbsp;</span>
1959
+ <span class="cline-any cline-neutral">&nbsp;</span>
1960
+ <span class="cline-any cline-neutral">&nbsp;</span>
1961
+ <span class="cline-any cline-neutral">&nbsp;</span>
1962
+ <span class="cline-any cline-neutral">&nbsp;</span>
1963
+ <span class="cline-any cline-neutral">&nbsp;</span>
1964
+ <span class="cline-any cline-neutral">&nbsp;</span>
1965
+ <span class="cline-any cline-neutral">&nbsp;</span>
1966
+ <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-no">&nbsp;</span>
1968
+ <span class="cline-any cline-neutral">&nbsp;</span>
1969
+ <span class="cline-any cline-neutral">&nbsp;</span>
1970
+ <span class="cline-any cline-no">&nbsp;</span>
1971
+ <span class="cline-any cline-neutral">&nbsp;</span>
1972
+ <span class="cline-any cline-no">&nbsp;</span>
1973
+ <span class="cline-any cline-neutral">&nbsp;</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-no">&nbsp;</span>
1976
+ <span class="cline-any cline-no">&nbsp;</span>
1977
+ <span class="cline-any cline-no">&nbsp;</span>
1978
+ <span class="cline-any cline-no">&nbsp;</span>
1979
+ <span class="cline-any cline-neutral">&nbsp;</span>
1980
+ <span class="cline-any cline-neutral">&nbsp;</span>
1981
+ <span class="cline-any cline-neutral">&nbsp;</span>
1982
+ <span class="cline-any cline-neutral">&nbsp;</span>
1983
+ <span class="cline-any cline-no">&nbsp;</span>
1984
+ <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-neutral">&nbsp;</span>
1986
+ <span class="cline-any cline-no">&nbsp;</span>
1987
+ <span class="cline-any cline-no">&nbsp;</span>
1988
+ <span class="cline-any cline-no">&nbsp;</span>
1989
+ <span class="cline-any cline-neutral">&nbsp;</span>
1990
+ <span class="cline-any cline-neutral">&nbsp;</span>
1991
+ <span class="cline-any cline-neutral">&nbsp;</span>
1992
+ <span class="cline-any cline-no">&nbsp;</span>
1993
+ <span class="cline-any cline-no">&nbsp;</span>
1994
+ <span class="cline-any cline-neutral">&nbsp;</span>
1995
+ <span class="cline-any cline-no">&nbsp;</span>
1996
+ <span class="cline-any cline-neutral">&nbsp;</span>
1997
+ <span class="cline-any cline-no">&nbsp;</span>
1998
+ <span class="cline-any cline-no">&nbsp;</span>
1999
+ <span class="cline-any cline-neutral">&nbsp;</span>
2000
+ <span class="cline-any cline-neutral">&nbsp;</span>
2001
+ <span class="cline-any cline-no">&nbsp;</span>
2002
+ <span class="cline-any cline-no">&nbsp;</span>
2003
+ <span class="cline-any cline-no">&nbsp;</span>
2004
+ <span class="cline-any cline-no">&nbsp;</span>
2005
+ <span class="cline-any cline-no">&nbsp;</span>
2006
+ <span class="cline-any cline-neutral">&nbsp;</span>
2007
+ <span class="cline-any cline-neutral">&nbsp;</span>
2008
+ <span class="cline-any cline-neutral">&nbsp;</span>
2009
+ <span class="cline-any cline-no">&nbsp;</span>
2010
+ <span class="cline-any cline-no">&nbsp;</span>
2011
+ <span class="cline-any cline-no">&nbsp;</span>
2012
+ <span class="cline-any cline-neutral">&nbsp;</span>
2013
+ <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
2017
+ <span class="cline-any cline-neutral">&nbsp;</span>
2018
+ <span class="cline-any cline-neutral">&nbsp;</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-no">&nbsp;</span>
2021
+ <span class="cline-any cline-no">&nbsp;</span>
2022
+ <span class="cline-any cline-no">&nbsp;</span>
2023
+ <span class="cline-any cline-no">&nbsp;</span>
2024
+ <span class="cline-any cline-no">&nbsp;</span>
2025
+ <span class="cline-any cline-no">&nbsp;</span>
2026
+ <span class="cline-any cline-no">&nbsp;</span>
2027
+ <span class="cline-any cline-no">&nbsp;</span>
2028
+ <span class="cline-any cline-no">&nbsp;</span>
2029
+ <span class="cline-any cline-no">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
2032
+ <span class="cline-any cline-no">&nbsp;</span>
2033
+ <span class="cline-any cline-no">&nbsp;</span>
2034
+ <span class="cline-any cline-neutral">&nbsp;</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
2036
+ <span class="cline-any cline-neutral">&nbsp;</span>
2037
+ <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-neutral">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-neutral">&nbsp;</span>
2042
+ <span class="cline-any cline-no">&nbsp;</span>
2043
+ <span class="cline-any cline-neutral">&nbsp;</span>
2044
+ <span class="cline-any cline-neutral">&nbsp;</span>
2045
+ <span class="cline-any cline-neutral">&nbsp;</span>
2046
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as fs from 'fs';
2047
+ import * as path from 'path';
2048
+ import * as os from 'os';
2049
+ import { spawn } from 'child_process';
2050
+ import { getDatabaseManager } from './core-bridge';
2051
+ import { detectPortInUse, getProcessOnPort, killProcessOnPort, extractPortFromError } from './port-utils';
2052
+ &nbsp;
2053
+ export interface ScriptInfo {
2054
+ name: string;
2055
+ command: string;
2056
+ runner: string;
2057
+ projectType: string;
2058
+ }
2059
+ &nbsp;
2060
+ export type ProjectType = 'node' | 'python' | 'rust' | 'go' | 'makefile' | 'unknown';
2061
+ &nbsp;
2062
+ export interface ProjectScripts {
2063
+ type: ProjectType;
2064
+ scripts: Map&lt;string, ScriptInfo&gt;;
2065
+ }
2066
+ &nbsp;
2067
+ /**
2068
+ * Detect the project type based on files in the directory
2069
+ */
2070
+ export function detectProjectType(projectPath: string): ProjectType {
2071
+ if (fs.existsSync(path.join(projectPath, 'package.json'))) {
2072
+ return 'node';
2073
+ }
2074
+ if (fs.existsSync(path.join(projectPath, 'pyproject.toml'))) {
2075
+ return 'python';
2076
+ }
2077
+ if (fs.existsSync(path.join(projectPath, 'Cargo.toml'))) {
2078
+ return 'rust';
2079
+ }
2080
+ if (fs.existsSync(path.join(projectPath, 'go.mod'))) {
2081
+ return 'go';
2082
+ }
2083
+ if (fs.existsSync(path.join(projectPath, 'Makefile')) || fs.existsSync(path.join(projectPath, 'makefile'))) {
2084
+ return 'makefile';
2085
+ }
2086
+ return 'unknown';
2087
+ }
2088
+ &nbsp;
2089
+ /**
2090
+ * Parse scripts from package.json (Node.js)
2091
+ */
2092
+ function parseNodeScripts(projectPath: string): Map&lt;string, ScriptInfo&gt; {
2093
+ const packageJsonPath = path.join(projectPath, 'package.json');
2094
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(packageJsonPath)) {
2095
+ <span class="cstat-no" title="statement not covered" > return new Map();</span>
2096
+ }
2097
+ &nbsp;
2098
+ try {
2099
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
2100
+ const scripts = packageJson.scripts || {};
2101
+ const scriptMap = new Map&lt;string, ScriptInfo&gt;();
2102
+ &nbsp;
2103
+ for (const [name, command] of Object.entries(scripts)) {
2104
+ if (typeof command === 'string') {
2105
+ scriptMap.set(name, {
2106
+ name,
2107
+ command: command as string,
2108
+ runner: 'npm',
2109
+ projectType: 'node',
2110
+ });
2111
+ }
2112
+ }
2113
+ &nbsp;
2114
+ return scriptMap;
2115
+ } catch (error) {
2116
+ return new Map();
2117
+ }
2118
+ }
2119
+ &nbsp;
2120
+ /**
2121
+ * Parse scripts from pyproject.toml (Python)
2122
+ */
2123
+ function parsePythonScripts(projectPath: string): Map&lt;string, ScriptInfo&gt; {
2124
+ const pyprojectPath = path.join(projectPath, 'pyproject.toml');
2125
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(pyprojectPath)) {
2126
+ <span class="cstat-no" title="statement not covered" > return new Map();</span>
2127
+ }
2128
+ &nbsp;
2129
+ try {
2130
+ const content = fs.readFileSync(pyprojectPath, 'utf-8');
2131
+ const scriptMap = new Map&lt;string, ScriptInfo&gt;();
2132
+ &nbsp;
2133
+ // Simple TOML parsing for [project.scripts] section
2134
+ // This is a basic implementation - for production, consider using a TOML parser
2135
+ const scriptsMatch = content.match(/\[project\.scripts\]\s*\n((?:[^\[]+\n?)+)/);
2136
+ if (scriptsMatch) {
2137
+ const scriptsSection = scriptsMatch[1];
2138
+ const scriptLines = scriptsSection.split('\n');
2139
+
2140
+ for (const line of scriptLines) {
2141
+ const match = line.match(/^(\w+)\s*=\s*["']([^"']+)["']/);
2142
+ if (match) {
2143
+ const [, name, command] = match;
2144
+ scriptMap.set(name, {
2145
+ name,
2146
+ command,
2147
+ runner: 'python',
2148
+ projectType: 'python',
2149
+ });
2150
+ }
2151
+ }
2152
+ }
2153
+ &nbsp;
2154
+ // Also check for [tool.poetry.scripts]
2155
+ const poetryMatch = content.match(/\[tool\.poetry\.scripts\]\s*\n((?:[^\[]+\n?)+)/);
2156
+ if (poetryMatch) {
2157
+ const scriptsSection = poetryMatch[1];
2158
+ const scriptLines = scriptsSection.split('\n');
2159
+
2160
+ for (const line of scriptLines) {
2161
+ const match = line.match(/^(\w+)\s*=\s*["']([^"']+)["']/);
2162
+ if (match) {
2163
+ const [, name, command] = match;
2164
+ scriptMap.set(name, {
2165
+ name,
2166
+ command,
2167
+ runner: 'poetry',
2168
+ projectType: 'python',
2169
+ });
2170
+ }
2171
+ }
2172
+ }
2173
+ &nbsp;
2174
+ return scriptMap;
2175
+ } catch (error) {
2176
+ <span class="cstat-no" title="statement not covered" > return new Map();</span>
2177
+ }
2178
+ }
2179
+ &nbsp;
2180
+ /**
2181
+ * Parse scripts from Cargo.toml (Rust)
2182
+ * Cargo doesn't have a scripts section, but we can detect common cargo commands
2183
+ */
2184
+ function parseRustScripts(projectPath: string): Map&lt;string, ScriptInfo&gt; {
2185
+ const scriptMap = new Map&lt;string, ScriptInfo&gt;();
2186
+
2187
+ // Common cargo commands that can be run
2188
+ const commonCommands = [
2189
+ { name: 'build', command: 'cargo build', runner: 'cargo' },
2190
+ { name: 'run', command: 'cargo run', runner: 'cargo' },
2191
+ { name: 'test', command: 'cargo test', runner: 'cargo' },
2192
+ { name: 'check', command: 'cargo check', runner: 'cargo' },
2193
+ { name: 'clippy', command: 'cargo clippy', runner: 'cargo' },
2194
+ { name: 'fmt', command: 'cargo fmt', runner: 'cargo' },
2195
+ ];
2196
+ &nbsp;
2197
+ for (const cmd of commonCommands) {
2198
+ scriptMap.set(cmd.name, {
2199
+ name: cmd.name,
2200
+ command: cmd.command,
2201
+ runner: cmd.runner,
2202
+ projectType: 'rust',
2203
+ });
2204
+ }
2205
+ &nbsp;
2206
+ return scriptMap;
2207
+ }
2208
+ &nbsp;
2209
+ /**
2210
+ * Parse Makefile targets
2211
+ */
2212
+ function parseMakefileScripts(projectPath: string): Map&lt;string, ScriptInfo&gt; {
2213
+ const makefilePath = fs.existsSync(path.join(projectPath, 'Makefile'))
2214
+ ? path.join(projectPath, 'Makefile')
2215
+ : path.join(projectPath, 'makefile');
2216
+
2217
+ if (!fs.existsSync(makefilePath)) {
2218
+ return new Map();
2219
+ }
2220
+ &nbsp;
2221
+ try {
2222
+ const content = fs.readFileSync(makefilePath, 'utf-8');
2223
+ const scriptMap = new Map&lt;string, ScriptInfo&gt;();
2224
+ &nbsp;
2225
+ // Parse Makefile targets (basic implementation)
2226
+ // Match lines that look like targets: target: dependencies
2227
+ const targetRegex = /^([a-zA-Z0-9_-]+)\s*:.*$/gm;
2228
+ let match;
2229
+
2230
+ while ((match = targetRegex.exec(content)) !== null) {
2231
+ const targetName = match[1];
2232
+ // Skip special targets
2233
+ if (!targetName.startsWith('.') &amp;&amp; targetName !== 'PHONY') {
2234
+ scriptMap.set(targetName, {
2235
+ name: targetName,
2236
+ command: `make ${targetName}`,
2237
+ runner: 'make',
2238
+ projectType: 'makefile',
2239
+ });
2240
+ }
2241
+ }
2242
+ &nbsp;
2243
+ return scriptMap;
2244
+ } catch (error) {
2245
+ <span class="cstat-no" title="statement not covered" > return new Map();</span>
2246
+ }
2247
+ }
2248
+ &nbsp;
2249
+ /**
2250
+ * Get all available scripts for a project
2251
+ */
2252
+ export function getProjectScripts(projectPath: string): ProjectScripts {
2253
+ const type = detectProjectType(projectPath);
2254
+ let scripts = new Map&lt;string, ScriptInfo&gt;();
2255
+ &nbsp;
2256
+ switch (type) {
2257
+ case 'node':
2258
+ scripts = parseNodeScripts(projectPath);
2259
+ break;
2260
+ case 'python':
2261
+ scripts = parsePythonScripts(projectPath);
2262
+ break;
2263
+ case 'rust':
2264
+ scripts = parseRustScripts(projectPath);
2265
+ break;
2266
+ case 'makefile':
2267
+ scripts = parseMakefileScripts(projectPath);
2268
+ break;
2269
+ case 'go':
2270
+ // Go projects typically use Makefile or direct go commands
2271
+ // Check for Makefile first, otherwise provide common go commands
2272
+ const makefileScripts = parseMakefileScripts(projectPath);
2273
+ if (makefileScripts.size &gt; 0) {
2274
+ scripts = makefileScripts;
2275
+ } else {
2276
+ // Common go commands
2277
+ scripts.set('run', {
2278
+ name: 'run',
2279
+ command: 'go run .',
2280
+ runner: 'go',
2281
+ projectType: 'go',
2282
+ });
2283
+ scripts.set('build', {
2284
+ name: 'build',
2285
+ command: 'go build',
2286
+ runner: 'go',
2287
+ projectType: 'go',
2288
+ });
2289
+ scripts.set('test', {
2290
+ name: 'test',
2291
+ command: 'go test ./...',
2292
+ runner: 'go',
2293
+ projectType: 'go',
2294
+ });
2295
+ }
2296
+ break;
2297
+ default:
2298
+ // For unknown projects, check for Makefile as fallback
2299
+ scripts = parseMakefileScripts(projectPath);
2300
+ break;
2301
+ }
2302
+ &nbsp;
2303
+ return {
2304
+ type,
2305
+ scripts,
2306
+ };
2307
+ }
2308
+ &nbsp;
2309
+ /**
2310
+ * Handle port conflict - prompt user or auto-kill based on force flag
2311
+ */
2312
+ async function <span class="fstat-no" title="function not covered" >handlePortConflict(</span>
2313
+ port: number,
2314
+ projectName: string,
2315
+ force: boolean
2316
+ ): Promise&lt;boolean&gt; {
2317
+ const processInfo = <span class="cstat-no" title="statement not covered" >await getProcessOnPort(port);</span>
2318
+ &nbsp;
2319
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!processInfo) {</span>
2320
+ <span class="cstat-no" title="statement not covered" > console.error(`Port ${port} appears to be in use, but couldn't identify the process.`);</span>
2321
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2322
+ }
2323
+ &nbsp;
2324
+ <span class="cstat-no" title="statement not covered" > console.error(`\n⚠️ Port ${port} is already in use by process ${processInfo.pid} (${processInfo.command})`);</span>
2325
+ &nbsp;
2326
+ <span class="cstat-no" title="statement not covered" > if (force) {</span>
2327
+ <span class="cstat-no" title="statement not covered" > console.log(`Killing process ${processInfo.pid} on port ${port}...`);</span>
2328
+ const killed = <span class="cstat-no" title="statement not covered" >await killProcessOnPort(port);</span>
2329
+ <span class="cstat-no" title="statement not covered" > if (killed) {</span>
2330
+ <span class="cstat-no" title="statement not covered" > console.log(`✓ Process killed. Retrying...\n`);</span>
2331
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2332
+ } else {
2333
+ <span class="cstat-no" title="statement not covered" > console.error(`Failed to kill process on port ${port}`);</span>
2334
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2335
+ }
2336
+ } else {
2337
+ const inquirer = <span class="cstat-no" title="statement not covered" >(<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >await import('</span>inquirer'))</span>.default;</span>
2338
+ const answer = <span class="cstat-no" title="statement not covered" >await inquirer.prompt([</span>
2339
+ {
2340
+ type: 'confirm',
2341
+ name: 'kill',
2342
+ message: `Kill process ${processInfo.pid} (${processInfo.command}) and continue?`,
2343
+ default: false,
2344
+ },
2345
+ ]);
2346
+ &nbsp;
2347
+ <span class="cstat-no" title="statement not covered" > if (answer.kill) {</span>
2348
+ const killed = <span class="cstat-no" title="statement not covered" >await killProcessOnPort(port);</span>
2349
+ <span class="cstat-no" title="statement not covered" > if (killed) {</span>
2350
+ <span class="cstat-no" title="statement not covered" > console.log(`✓ Process killed. Retrying...\n`);</span>
2351
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2352
+ } else {
2353
+ <span class="cstat-no" title="statement not covered" > console.error(`Failed to kill process on port ${port}`);</span>
2354
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2355
+ }
2356
+ } else {
2357
+ <span class="cstat-no" title="statement not covered" > console.log('Cancelled.');</span>
2358
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2359
+ }
2360
+ }
2361
+ }
2362
+ &nbsp;
2363
+ /**
2364
+ * Check ports proactively before script execution
2365
+ */
2366
+ async function <span class="fstat-no" title="function not covered" >checkPortsBeforeExecution(</span>
2367
+ projectPath: string,
2368
+ scriptName: string,
2369
+ force: boolean
2370
+ ): Promise&lt;boolean&gt; {
2371
+ const db = <span class="cstat-no" title="statement not covered" >getDatabaseManager();</span>
2372
+ const project = <span class="cstat-no" title="statement not covered" >db.getProjectByPath(projectPath);</span>
2373
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!project) <span class="cstat-no" title="statement not covered" >return true; </span></span>// Can't check if project not in DB
2374
+ &nbsp;
2375
+ const ports = <span class="cstat-no" title="statement not covered" >db.getProjectPortsByScript(project.id, scriptName);</span>
2376
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ports.length === 0) {</span>
2377
+ // Also check ports without script name (general project ports)
2378
+ const allPorts = <span class="cstat-no" title="statement not covered" >db.getProjectPorts(project.id);</span>
2379
+ <span class="cstat-no" title="statement not covered" > for (const portInfo of allPorts) {</span>
2380
+ const inUse = <span class="cstat-no" title="statement not covered" >await detectPortInUse(portInfo.port);</span>
2381
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (inUse) {</span>
2382
+ <span class="cstat-no" title="statement not covered" > return await handlePortConflict(portInfo.port, project.name, force);</span>
2383
+ }
2384
+ }
2385
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2386
+ }
2387
+ &nbsp;
2388
+ <span class="cstat-no" title="statement not covered" > for (const portInfo of ports) {</span>
2389
+ const inUse = <span class="cstat-no" title="statement not covered" >await detectPortInUse(portInfo.port);</span>
2390
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (inUse) {</span>
2391
+ <span class="cstat-no" title="statement not covered" > return await handlePortConflict(portInfo.port, project.name, force);</span>
2392
+ }
2393
+ }
2394
+ &nbsp;
2395
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2396
+ }
2397
+ &nbsp;
2398
+ /**
2399
+ * Execute a script in a project directory
2400
+ */
2401
+ export function <span class="fstat-no" title="function not covered" >runScript(</span>
2402
+ projectPath: string,
2403
+ scriptName: string,
2404
+ args: string[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
2405
+ force: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false</span>
2406
+ ): Promise&lt;number&gt; {
2407
+ <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >async </span>(resolve, reject) =&gt; {</span>
2408
+ const projectScripts = <span class="cstat-no" title="statement not covered" >getProjectScripts(projectPath);</span>
2409
+ const script = <span class="cstat-no" title="statement not covered" >projectScripts.scripts.get(scriptName);</span>
2410
+ &nbsp;
2411
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!script) {</span>
2412
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Script "${scriptName}" not found in project`));</span>
2413
+ <span class="cstat-no" title="statement not covered" > return;</span>
2414
+ }
2415
+ &nbsp;
2416
+ // Proactive port checking
2417
+ const canProceed = <span class="cstat-no" title="statement not covered" >await checkPortsBeforeExecution(projectPath, scriptName, force);</span>
2418
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!canProceed) {</span>
2419
+ <span class="cstat-no" title="statement not covered" > reject(new Error('Port conflict not resolved'));</span>
2420
+ <span class="cstat-no" title="statement not covered" > return;</span>
2421
+ }
2422
+ &nbsp;
2423
+ let command: string;
2424
+ let commandArgs: string[];
2425
+ &nbsp;
2426
+ <span class="cstat-no" title="statement not covered" > switch (script.runner) {</span>
2427
+ case 'npm':
2428
+ <span class="cstat-no" title="statement not covered" > command = 'npm';</span>
2429
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', scriptName, ...args];</span>
2430
+ <span class="cstat-no" title="statement not covered" > break;</span>
2431
+ case 'yarn':
2432
+ <span class="cstat-no" title="statement not covered" > command = 'yarn';</span>
2433
+ <span class="cstat-no" title="statement not covered" > commandArgs = [scriptName, ...args];</span>
2434
+ <span class="cstat-no" title="statement not covered" > break;</span>
2435
+ case 'pnpm':
2436
+ <span class="cstat-no" title="statement not covered" > command = 'pnpm';</span>
2437
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', scriptName, ...args];</span>
2438
+ <span class="cstat-no" title="statement not covered" > break;</span>
2439
+ case 'python':
2440
+ <span class="cstat-no" title="statement not covered" > command = 'python';</span>
2441
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['-m', ...script.command.split(' ').slice(1), ...args];</span>
2442
+ <span class="cstat-no" title="statement not covered" > break;</span>
2443
+ case 'poetry':
2444
+ <span class="cstat-no" title="statement not covered" > command = 'poetry';</span>
2445
+ // For poetry, the command is already the module path, use 'run' to execute it
2446
+ const modulePath = <span class="cstat-no" title="statement not covered" >script.command.split(' ').slice(1).join(' ');</span>
2447
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', 'python', '-m', modulePath, ...args];</span>
2448
+ <span class="cstat-no" title="statement not covered" > break;</span>
2449
+ case 'cargo':
2450
+ <span class="cstat-no" title="statement not covered" > command = 'cargo';</span>
2451
+ <span class="cstat-no" title="statement not covered" > commandArgs = scriptName === 'run' ? ['run', ...args] : [scriptName, ...args];</span>
2452
+ <span class="cstat-no" title="statement not covered" > break;</span>
2453
+ case 'go':
2454
+ <span class="cstat-no" title="statement not covered" > command = 'go';</span>
2455
+ <span class="cstat-no" title="statement not covered" > commandArgs = script.command.split(' ').slice(1);</span>
2456
+ <span class="cstat-no" title="statement not covered" > if (scriptName === 'run' &amp;&amp; args.length &gt; 0) {</span>
2457
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', ...args];</span>
2458
+ } else {
2459
+ <span class="cstat-no" title="statement not covered" > commandArgs = [...commandArgs, ...args];</span>
2460
+ }
2461
+ <span class="cstat-no" title="statement not covered" > break;</span>
2462
+ case 'make':
2463
+ <span class="cstat-no" title="statement not covered" > command = 'make';</span>
2464
+ <span class="cstat-no" title="statement not covered" > commandArgs = [scriptName, ...args];</span>
2465
+ <span class="cstat-no" title="statement not covered" > break;</span>
2466
+ default:
2467
+ // Fallback: try to run the command directly
2468
+ const parts = <span class="cstat-no" title="statement not covered" >script.command.split(' ');</span>
2469
+ <span class="cstat-no" title="statement not covered" > command = parts[0];</span>
2470
+ <span class="cstat-no" title="statement not covered" > commandArgs = [...parts.slice(1), ...args];</span>
2471
+ <span class="cstat-no" title="statement not covered" > break;</span>
2472
+ }
2473
+ &nbsp;
2474
+ <span class="cstat-no" title="statement not covered" > console.log(`Running: ${command} ${commandArgs.join(' ')}`);</span>
2475
+ <span class="cstat-no" title="statement not covered" > console.log(`In directory: ${projectPath}\n`);</span>
2476
+ &nbsp;
2477
+ // Capture stderr for reactive port conflict detection
2478
+ let stderrOutput = <span class="cstat-no" title="statement not covered" >'';</span>
2479
+ let stdoutOutput = <span class="cstat-no" title="statement not covered" >'';</span>
2480
+ &nbsp;
2481
+ const child = <span class="cstat-no" title="statement not covered" >spawn(command, commandArgs, {</span>
2482
+ cwd: projectPath,
2483
+ stdio: ['inherit', 'pipe', 'pipe'],
2484
+ shell: process.platform === 'win32',
2485
+ });
2486
+ &nbsp;
2487
+ // Capture output for error analysis
2488
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (child.stdout) {</span>
2489
+ <span class="cstat-no" title="statement not covered" > child.stdout.on('data', <span class="fstat-no" title="function not covered" >(d</span>ata: Buffer) =&gt; {</span>
2490
+ <span class="cstat-no" title="statement not covered" > stdoutOutput += data.toString();</span>
2491
+ <span class="cstat-no" title="statement not covered" > process.stdout.write(data);</span>
2492
+ });
2493
+ }
2494
+ &nbsp;
2495
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (child.stderr) {</span>
2496
+ <span class="cstat-no" title="statement not covered" > child.stderr.on('data', <span class="fstat-no" title="function not covered" >(d</span>ata: Buffer) =&gt; {</span>
2497
+ <span class="cstat-no" title="statement not covered" > stderrOutput += data.toString();</span>
2498
+ <span class="cstat-no" title="statement not covered" > process.stderr.write(data);</span>
2499
+ });
2500
+ }
2501
+ &nbsp;
2502
+ <span class="cstat-no" title="statement not covered" > child.on('close', <span class="fstat-no" title="function not covered" >async </span>(code) =&gt; {</span>
2503
+ <span class="cstat-no" title="statement not covered" > if (code === 0) {</span>
2504
+ <span class="cstat-no" title="statement not covered" > resolve(0);</span>
2505
+ } else {
2506
+ // Reactive port conflict detection
2507
+ const errorOutput = <span class="cstat-no" title="statement not covered" >stderrOutput + stdoutOutput;</span>
2508
+ const port = <span class="cstat-no" title="statement not covered" >extractPortFromError(errorOutput);</span>
2509
+
2510
+ <span class="cstat-no" title="statement not covered" > if (port) {</span>
2511
+ const db = <span class="cstat-no" title="statement not covered" >getDatabaseManager();</span>
2512
+ const project = <span class="cstat-no" title="statement not covered" >db.getProjectByPath(projectPath);</span>
2513
+ const projectName = <span class="cstat-no" title="statement not covered" >project?.name || 'project';</span>
2514
+
2515
+ const resolved = <span class="cstat-no" title="statement not covered" >await handlePortConflict(port, projectName, force);</span>
2516
+ <span class="cstat-no" title="statement not covered" > if (resolved) {</span>
2517
+ // Retry script execution
2518
+ <span class="cstat-no" title="statement not covered" > try {</span>
2519
+ const retryResult = <span class="cstat-no" title="statement not covered" >await runScript(projectPath, scriptName, args, force);</span>
2520
+ <span class="cstat-no" title="statement not covered" > resolve(retryResult);</span>
2521
+ } catch (retryError) {
2522
+ <span class="cstat-no" title="statement not covered" > reject(retryError);</span>
2523
+ }
2524
+ } else {
2525
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Script exited with code ${code} (port ${port} conflict)`));</span>
2526
+ }
2527
+ } else {
2528
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Script exited with code ${code}`));</span>
2529
+ }
2530
+ }
2531
+ });
2532
+ &nbsp;
2533
+ <span class="cstat-no" title="statement not covered" > child.on('error', <span class="fstat-no" title="function not covered" >(e</span>rror) =&gt; {</span>
2534
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Failed to execute script: ${error.message}`));</span>
2535
+ });
2536
+ });
2537
+ }
2538
+ &nbsp;
2539
+ export interface BackgroundProcess {
2540
+ pid: number;
2541
+ projectPath: string;
2542
+ projectName: string;
2543
+ scriptName: string;
2544
+ command: string;
2545
+ startedAt: number;
2546
+ logFile: string;
2547
+ detectedUrls?: string[];
2548
+ detectedPorts?: number[];
2549
+ }
2550
+ &nbsp;
2551
+ /**
2552
+ * Get the path to the processes file
2553
+ */
2554
+ function getProcessesFilePath(): string {
2555
+ const dataDir = path.join(os.homedir(), '.projax');
2556
+ if (!fs.existsSync(dataDir)) {
2557
+ fs.mkdirSync(dataDir, { recursive: true });
2558
+ }
2559
+ return path.join(dataDir, 'processes.json');
2560
+ }
2561
+ &nbsp;
2562
+ /**
2563
+ * Load running processes from disk
2564
+ */
2565
+ export function loadProcesses(): BackgroundProcess[] {
2566
+ const filePath = getProcessesFilePath();
2567
+ if (!fs.existsSync(filePath)) {
2568
+ return [];
2569
+ }
2570
+ try {
2571
+ const content = fs.readFileSync(filePath, 'utf-8');
2572
+ return JSON.parse(content);
2573
+ } catch (error) {
2574
+ return [];
2575
+ }
2576
+ }
2577
+ &nbsp;
2578
+ /**
2579
+ * Save running processes to disk
2580
+ */
2581
+ function saveProcesses(processes: BackgroundProcess[]): void {
2582
+ const filePath = getProcessesFilePath();
2583
+ fs.writeFileSync(filePath, JSON.stringify(processes, null, 2));
2584
+ }
2585
+ &nbsp;
2586
+ /**
2587
+ * Add a process to the tracking file
2588
+ */
2589
+ function <span class="fstat-no" title="function not covered" >addProcess(</span>process: BackgroundProcess): void {
2590
+ const processes = <span class="cstat-no" title="statement not covered" >loadProcesses();</span>
2591
+ <span class="cstat-no" title="statement not covered" > processes.push(process);</span>
2592
+ <span class="cstat-no" title="statement not covered" > saveProcesses(processes);</span>
2593
+ }
2594
+ &nbsp;
2595
+ /**
2596
+ * Remove a process from tracking by PID
2597
+ */
2598
+ export function removeProcess(pid: number): void {
2599
+ const processes = loadProcesses();
2600
+ const filtered = processes.filter(p =&gt; p.pid !== pid);
2601
+ saveProcesses(filtered);
2602
+ }
2603
+ &nbsp;
2604
+ /**
2605
+ * Get all running processes for a project
2606
+ */
2607
+ export function getProjectProcesses(projectPath: string): BackgroundProcess[] {
2608
+ const processes = loadProcesses();
2609
+ return processes.filter(p =&gt; p.projectPath === projectPath);
2610
+ }
2611
+ &nbsp;
2612
+ /**
2613
+ * Check if a process is still running
2614
+ */
2615
+ async function <span class="fstat-no" title="function not covered" >isProcessRunning(</span>pid: number): Promise&lt;boolean&gt; {
2616
+ <span class="cstat-no" title="statement not covered" > try {</span>
2617
+ <span class="cstat-no" title="statement not covered" > if (os.platform() === 'win32') {</span>
2618
+ const { exec } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
2619
+ const { promisify } = <span class="cstat-no" title="statement not covered" >require('util');</span>
2620
+ const execAsync = <span class="cstat-no" title="statement not covered" >promisify(exec);</span>
2621
+ const { stdout } = <span class="cstat-no" title="statement not covered" >await execAsync(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`);</span>
2622
+ <span class="cstat-no" title="statement not covered" > return stdout.includes(`"${pid}"`);</span>
2623
+ } else {
2624
+ // On Unix-like systems, kill with signal 0 checks if process exists
2625
+ <span class="cstat-no" title="statement not covered" > try {</span>
2626
+ <span class="cstat-no" title="statement not covered" > process.kill(pid, 0);</span>
2627
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2628
+ } catch {
2629
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2630
+ }
2631
+ }
2632
+ } catch {
2633
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2634
+ }
2635
+ }
2636
+ &nbsp;
2637
+ /**
2638
+ * Clean up dead processes from tracking
2639
+ */
2640
+ async function <span class="fstat-no" title="function not covered" >cleanupDeadProcesses(</span>): Promise&lt;void&gt; {
2641
+ const processes = <span class="cstat-no" title="statement not covered" >loadProcesses();</span>
2642
+ const aliveProcesses: BackgroundProcess[] = <span class="cstat-no" title="statement not covered" >[];</span>
2643
+
2644
+ <span class="cstat-no" title="statement not covered" > for (const proc of processes) {</span>
2645
+ const isAlive = <span class="cstat-no" title="statement not covered" >await isProcessRunning(proc.pid);</span>
2646
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (isAlive) {</span>
2647
+ <span class="cstat-no" title="statement not covered" > aliveProcesses.push(proc);</span>
2648
+ }
2649
+ }
2650
+
2651
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (aliveProcesses.length !== processes.length) {</span>
2652
+ <span class="cstat-no" title="statement not covered" > saveProcesses(aliveProcesses);</span>
2653
+ }
2654
+ }
2655
+ &nbsp;
2656
+ /**
2657
+ * Get all running processes (synchronous version that returns potentially stale data)
2658
+ */
2659
+ export function <span class="fstat-no" title="function not covered" >getRunningProcesses(</span>): BackgroundProcess[] {
2660
+ <span class="cstat-no" title="statement not covered" > return loadProcesses();</span>
2661
+ }
2662
+ &nbsp;
2663
+ /**
2664
+ * Get all running processes with cleanup (async version)
2665
+ */
2666
+ export async function <span class="fstat-no" title="function not covered" >getRunningProcessesClean(</span>): Promise&lt;BackgroundProcess[]&gt; {
2667
+ <span class="cstat-no" title="statement not covered" > await cleanupDeadProcesses();</span>
2668
+ <span class="cstat-no" title="statement not covered" > return loadProcesses();</span>
2669
+ }
2670
+ &nbsp;
2671
+ /**
2672
+ * Extract URLs from text output
2673
+ */
2674
+ function <span class="fstat-no" title="function not covered" >extractUrlsFromOutput(</span>output: string): string[] {
2675
+ const urls: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2676
+ const urlPatterns = <span class="cstat-no" title="statement not covered" >[</span>
2677
+ /(?:Local|Network):\s*(https?:\/\/[^\s]+)/gi,
2678
+ /(?:https?:\/\/localhost:\d+)/gi,
2679
+ /(?:https?:\/\/127\.0\.0\.1:\d+)/gi,
2680
+ /(?:https?:\/\/0\.0\.0\.0:\d+)/gi,
2681
+ /(?:https?:\/\/[^\s:]+:\d+)/gi,
2682
+ ];
2683
+ &nbsp;
2684
+ <span class="cstat-no" title="statement not covered" > for (const pattern of urlPatterns) {</span>
2685
+ const matches = <span class="cstat-no" title="statement not covered" >output.matchAll(pattern);</span>
2686
+ <span class="cstat-no" title="statement not covered" > for (const match of matches) {</span>
2687
+ const url = <span class="cstat-no" title="statement not covered" >match[0] || match[1];</span>
2688
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (url &amp;&amp; !urls.includes(url)) {</span>
2689
+ <span class="cstat-no" title="statement not covered" > urls.push(url);</span>
2690
+ }
2691
+ }
2692
+ }
2693
+ &nbsp;
2694
+ <span class="cstat-no" title="statement not covered" > return urls;</span>
2695
+ }
2696
+ &nbsp;
2697
+ /**
2698
+ * Update process with detected URLs and ports
2699
+ */
2700
+ function <span class="fstat-no" title="function not covered" >updateProcessUrls(</span>pid: number, urls: string[]): void {
2701
+ const processes = <span class="cstat-no" title="statement not covered" >loadProcesses();</span>
2702
+ const process = <span class="cstat-no" title="statement not covered" >processes.find(<span class="fstat-no" title="function not covered" >p </span>=&gt; <span class="cstat-no" title="statement not covered" >p.pid === pid)</span>;</span>
2703
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (process) {</span>
2704
+ <span class="cstat-no" title="statement not covered" > process.detectedUrls = urls;</span>
2705
+ // Extract ports from URLs
2706
+ const ports = <span class="cstat-no" title="statement not covered" >new Set&lt;number&gt;();</span>
2707
+ <span class="cstat-no" title="statement not covered" > for (const url of urls) {</span>
2708
+ const match = <span class="cstat-no" title="statement not covered" >url.match(/:(\d+)/);</span>
2709
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match) {</span>
2710
+ <span class="cstat-no" title="statement not covered" > ports.add(parseInt(match[1], 10));</span>
2711
+ }
2712
+ }
2713
+ <span class="cstat-no" title="statement not covered" > process.detectedPorts = Array.from(ports).sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a - b)</span>;</span>
2714
+ <span class="cstat-no" title="statement not covered" > saveProcesses(processes);</span>
2715
+ }
2716
+ }
2717
+ &nbsp;
2718
+ /**
2719
+ * Stop a script by PID
2720
+ */
2721
+ export async function <span class="fstat-no" title="function not covered" >stopScript(</span>pid: number): Promise&lt;boolean&gt; {
2722
+ <span class="cstat-no" title="statement not covered" > try {</span>
2723
+ const processes = <span class="cstat-no" title="statement not covered" >loadProcesses();</span>
2724
+ const processInfo = <span class="cstat-no" title="statement not covered" >processes.find(<span class="fstat-no" title="function not covered" >p </span>=&gt; <span class="cstat-no" title="statement not covered" >p.pid === pid)</span>;</span>
2725
+
2726
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!processInfo) {</span>
2727
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2728
+ }
2729
+ &nbsp;
2730
+ // Check if process is still running before trying to kill it
2731
+ let processExists = <span class="cstat-no" title="statement not covered" >false;</span>
2732
+ <span class="cstat-no" title="statement not covered" > try {</span>
2733
+ <span class="cstat-no" title="statement not covered" > if (os.platform() === 'win32') {</span>
2734
+ const { exec } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
2735
+ const { promisify } = <span class="cstat-no" title="statement not covered" >require('util');</span>
2736
+ const execAsync = <span class="cstat-no" title="statement not covered" >promisify(exec);</span>
2737
+ <span class="cstat-no" title="statement not covered" > await execAsync(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`);</span>
2738
+ <span class="cstat-no" title="statement not covered" > processExists = true;</span>
2739
+ } else {
2740
+ const { exec } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
2741
+ const { promisify } = <span class="cstat-no" title="statement not covered" >require('util');</span>
2742
+ const execAsync = <span class="cstat-no" title="statement not covered" >promisify(exec);</span>
2743
+ <span class="cstat-no" title="statement not covered" > await execAsync(`ps -p ${pid} -o pid=`);</span>
2744
+ <span class="cstat-no" title="statement not covered" > processExists = true;</span>
2745
+ }
2746
+ } catch {
2747
+ // Process doesn't exist anymore
2748
+ <span class="cstat-no" title="statement not covered" > processExists = false;</span>
2749
+ }
2750
+ &nbsp;
2751
+ // Try to kill the process (cross-platform)
2752
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (processExists) {</span>
2753
+ <span class="cstat-no" title="statement not covered" > try {</span>
2754
+ <span class="cstat-no" title="statement not covered" > if (os.platform() === 'win32') {</span>
2755
+ const { exec } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
2756
+ const { promisify } = <span class="cstat-no" title="statement not covered" >require('util');</span>
2757
+ const execAsync = <span class="cstat-no" title="statement not covered" >promisify(exec);</span>
2758
+ <span class="cstat-no" title="statement not covered" > await execAsync(`taskkill /F /PID ${pid}`);</span>
2759
+ } else {
2760
+ const { exec } = <span class="cstat-no" title="statement not covered" >require('child_process');</span>
2761
+ const { promisify } = <span class="cstat-no" title="statement not covered" >require('util');</span>
2762
+ const execAsync = <span class="cstat-no" title="statement not covered" >promisify(exec);</span>
2763
+ <span class="cstat-no" title="statement not covered" > await execAsync(`kill -9 ${pid}`);</span>
2764
+ }
2765
+ } catch (error) {
2766
+ // Process may have already exited
2767
+ <span class="cstat-no" title="statement not covered" > console.error(`Error killing process ${pid}:`, error);</span>
2768
+ }
2769
+ }
2770
+ &nbsp;
2771
+ // Remove from tracking regardless of whether kill succeeded
2772
+ <span class="cstat-no" title="statement not covered" > removeProcess(pid);</span>
2773
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2774
+ } catch (error) {
2775
+ <span class="cstat-no" title="statement not covered" > console.error(`Error stopping script ${pid}:`, error);</span>
2776
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2777
+ }
2778
+ }
2779
+ &nbsp;
2780
+ /**
2781
+ * Stop a script by port (finds process using port and kills it)
2782
+ */
2783
+ export async function <span class="fstat-no" title="function not covered" >stopScriptByPort(</span>port: number): Promise&lt;boolean&gt; {
2784
+ <span class="cstat-no" title="statement not covered" > try {</span>
2785
+ const processInfo = <span class="cstat-no" title="statement not covered" >await getProcessOnPort(port);</span>
2786
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!processInfo) {</span>
2787
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2788
+ }
2789
+ &nbsp;
2790
+ // Check if this is a tracked process
2791
+ const processes = <span class="cstat-no" title="statement not covered" >loadProcesses();</span>
2792
+ const trackedProcess = <span class="cstat-no" title="statement not covered" >processes.find(<span class="fstat-no" title="function not covered" >p </span>=&gt; <span class="cstat-no" title="statement not covered" >p.pid === processInfo.pid)</span>;</span>
2793
+
2794
+ <span class="cstat-no" title="statement not covered" > if (trackedProcess) {</span>
2795
+ // Use the tracked process removal
2796
+ <span class="cstat-no" title="statement not covered" > return await stopScript(processInfo.pid);</span>
2797
+ } else {
2798
+ // Kill the process directly
2799
+ const killed = <span class="cstat-no" title="statement not covered" >await killProcessOnPort(port);</span>
2800
+ <span class="cstat-no" title="statement not covered" > return killed;</span>
2801
+ }
2802
+ } catch (error) {
2803
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2804
+ }
2805
+ }
2806
+ &nbsp;
2807
+ /**
2808
+ * Stop all processes for a project
2809
+ */
2810
+ export async function <span class="fstat-no" title="function not covered" >stopProjectProcesses(</span>projectPath: string): Promise&lt;number&gt; {
2811
+ const processes = <span class="cstat-no" title="statement not covered" >getProjectProcesses(projectPath);</span>
2812
+ let stopped = <span class="cstat-no" title="statement not covered" >0;</span>
2813
+
2814
+ <span class="cstat-no" title="statement not covered" > for (const process of processes) {</span>
2815
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (await stopScript(process.pid)) {</span>
2816
+ <span class="cstat-no" title="statement not covered" > stopped++;</span>
2817
+ }
2818
+ }
2819
+
2820
+ <span class="cstat-no" title="statement not covered" > return stopped;</span>
2821
+ }
2822
+ &nbsp;
2823
+ /**
2824
+ * Execute a script in the background (minimal logging)
2825
+ */
2826
+ export function <span class="fstat-no" title="function not covered" >runScriptInBackground(</span>
2827
+ projectPath: string,
2828
+ projectName: string,
2829
+ scriptName: string,
2830
+ args: string[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
2831
+ force: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false</span>
2832
+ ): Promise&lt;number&gt; {
2833
+ <span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >async </span>(resolve, reject) =&gt; {</span>
2834
+ const projectScripts = <span class="cstat-no" title="statement not covered" >getProjectScripts(projectPath);</span>
2835
+ const script = <span class="cstat-no" title="statement not covered" >projectScripts.scripts.get(scriptName);</span>
2836
+ &nbsp;
2837
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!script) {</span>
2838
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Script "${scriptName}" not found in project`));</span>
2839
+ <span class="cstat-no" title="statement not covered" > return;</span>
2840
+ }
2841
+ &nbsp;
2842
+ // Proactive port checking
2843
+ const canProceed = <span class="cstat-no" title="statement not covered" >await checkPortsBeforeExecution(projectPath, scriptName, force);</span>
2844
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!canProceed) {</span>
2845
+ <span class="cstat-no" title="statement not covered" > reject(new Error('Port conflict not resolved'));</span>
2846
+ <span class="cstat-no" title="statement not covered" > return;</span>
2847
+ }
2848
+ &nbsp;
2849
+ let command: string;
2850
+ let commandArgs: string[];
2851
+ &nbsp;
2852
+ <span class="cstat-no" title="statement not covered" > switch (script.runner) {</span>
2853
+ case 'npm':
2854
+ <span class="cstat-no" title="statement not covered" > command = 'npm';</span>
2855
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', scriptName, ...args];</span>
2856
+ <span class="cstat-no" title="statement not covered" > break;</span>
2857
+ case 'yarn':
2858
+ <span class="cstat-no" title="statement not covered" > command = 'yarn';</span>
2859
+ <span class="cstat-no" title="statement not covered" > commandArgs = [scriptName, ...args];</span>
2860
+ <span class="cstat-no" title="statement not covered" > break;</span>
2861
+ case 'pnpm':
2862
+ <span class="cstat-no" title="statement not covered" > command = 'pnpm';</span>
2863
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', scriptName, ...args];</span>
2864
+ <span class="cstat-no" title="statement not covered" > break;</span>
2865
+ case 'python':
2866
+ <span class="cstat-no" title="statement not covered" > command = 'python';</span>
2867
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['-m', ...script.command.split(' ').slice(1), ...args];</span>
2868
+ <span class="cstat-no" title="statement not covered" > break;</span>
2869
+ case 'poetry':
2870
+ <span class="cstat-no" title="statement not covered" > command = 'poetry';</span>
2871
+ const modulePath = <span class="cstat-no" title="statement not covered" >script.command.split(' ').slice(1).join(' ');</span>
2872
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', 'python', '-m', modulePath, ...args];</span>
2873
+ <span class="cstat-no" title="statement not covered" > break;</span>
2874
+ case 'cargo':
2875
+ <span class="cstat-no" title="statement not covered" > command = 'cargo';</span>
2876
+ <span class="cstat-no" title="statement not covered" > commandArgs = scriptName === 'run' ? ['run', ...args] : [scriptName, ...args];</span>
2877
+ <span class="cstat-no" title="statement not covered" > break;</span>
2878
+ case 'go':
2879
+ <span class="cstat-no" title="statement not covered" > command = 'go';</span>
2880
+ <span class="cstat-no" title="statement not covered" > commandArgs = script.command.split(' ').slice(1);</span>
2881
+ <span class="cstat-no" title="statement not covered" > if (scriptName === 'run' &amp;&amp; args.length &gt; 0) {</span>
2882
+ <span class="cstat-no" title="statement not covered" > commandArgs = ['run', ...args];</span>
2883
+ } else {
2884
+ <span class="cstat-no" title="statement not covered" > commandArgs = [...commandArgs, ...args];</span>
2885
+ }
2886
+ <span class="cstat-no" title="statement not covered" > break;</span>
2887
+ case 'make':
2888
+ <span class="cstat-no" title="statement not covered" > command = 'make';</span>
2889
+ <span class="cstat-no" title="statement not covered" > commandArgs = [scriptName, ...args];</span>
2890
+ <span class="cstat-no" title="statement not covered" > break;</span>
2891
+ default:
2892
+ const parts = <span class="cstat-no" title="statement not covered" >script.command.split(' ');</span>
2893
+ <span class="cstat-no" title="statement not covered" > command = parts[0];</span>
2894
+ <span class="cstat-no" title="statement not covered" > commandArgs = [...parts.slice(1), ...args];</span>
2895
+ <span class="cstat-no" title="statement not covered" > break;</span>
2896
+ }
2897
+ &nbsp;
2898
+ // Create log file for the process
2899
+ const dataDir = <span class="cstat-no" title="statement not covered" >path.join(os.homedir(), '.projax');</span>
2900
+ const logsDir = <span class="cstat-no" title="statement not covered" >path.join(dataDir, 'logs');</span>
2901
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(logsDir)) {</span>
2902
+ <span class="cstat-no" title="statement not covered" > fs.mkdirSync(logsDir, { recursive: true });</span>
2903
+ }
2904
+ const logFile = <span class="cstat-no" title="statement not covered" >path.join(logsDir, `process-${Date.now()}-${scriptName}.log`);</span>
2905
+ &nbsp;
2906
+ // Open log file with file descriptors that can be inherited by child process
2907
+ const logFd = <span class="cstat-no" title="statement not covered" >fs.openSync(logFile, 'a');</span>
2908
+
2909
+ // Spawn process in detached mode with output redirected to log file
2910
+ let child;
2911
+ <span class="cstat-no" title="statement not covered" > try {</span>
2912
+ <span class="cstat-no" title="statement not covered" > child = spawn(command, commandArgs, {</span>
2913
+ cwd: projectPath,
2914
+ stdio: ['ignore', logFd, logFd], // Redirect stdout and stderr to log file descriptor
2915
+ detached: true,
2916
+ shell: process.platform === 'win32',
2917
+ });
2918
+ } catch (spawnError) {
2919
+ <span class="cstat-no" title="statement not covered" > fs.closeSync(logFd);</span>
2920
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Failed to spawn process: ${spawnError instanceof Error ? spawnError.message : String(spawnError)}`));</span>
2921
+ <span class="cstat-no" title="statement not covered" > return;</span>
2922
+ }
2923
+
2924
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!child.pid) {</span>
2925
+ <span class="cstat-no" title="statement not covered" > fs.closeSync(logFd);</span>
2926
+ <span class="cstat-no" title="statement not covered" > reject(new Error('Failed to start process: no PID assigned'));</span>
2927
+ <span class="cstat-no" title="statement not covered" > return;</span>
2928
+ }
2929
+
2930
+ // Handle spawn errors
2931
+ <span class="cstat-no" title="statement not covered" > child.on('error', <span class="fstat-no" title="function not covered" >(e</span>rror) =&gt; {</span>
2932
+ <span class="cstat-no" title="statement not covered" > fs.closeSync(logFd);</span>
2933
+ <span class="cstat-no" title="statement not covered" > reject(new Error(`Process spawn error: ${error.message}`));</span>
2934
+ });
2935
+
2936
+ // Close the file descriptor in parent process after a short delay
2937
+ // The child process will have its own copy
2938
+ <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
2939
+ <span class="cstat-no" title="statement not covered" > try {</span>
2940
+ <span class="cstat-no" title="statement not covered" > fs.closeSync(logFd);</span>
2941
+ } catch {
2942
+ // Already closed or error, ignore
2943
+ }
2944
+ }, 1000);
2945
+ &nbsp;
2946
+ // Store process info
2947
+ const processInfo: BackgroundProcess = <span class="cstat-no" title="statement not covered" >{</span>
2948
+ pid: child.pid,
2949
+ projectPath,
2950
+ projectName,
2951
+ scriptName,
2952
+ command: `${command} ${commandArgs.join(' ')}`,
2953
+ startedAt: Date.now(),
2954
+ logFile,
2955
+ };
2956
+ &nbsp;
2957
+ <span class="cstat-no" title="statement not covered" > addProcess(processInfo);</span>
2958
+ &nbsp;
2959
+ // Listen for process exit to clean up tracking
2960
+ <span class="cstat-no" title="statement not covered" > child.on('exit', <span class="fstat-no" title="function not covered" >(c</span>ode, signal) =&gt; {</span>
2961
+ // Remove from tracking when process exits
2962
+ <span class="cstat-no" title="statement not covered" > removeProcess(child.pid!);</span>
2963
+
2964
+ // Log exit information
2965
+ <span class="cstat-no" title="statement not covered" > if (code !== null) {</span>
2966
+ <span class="cstat-no" title="statement not covered" > fs.appendFileSync(logFile, `\n\n[Process exited with code ${code}]\n`);</span>
2967
+ } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (signal !== null) {</span>
2968
+ <span class="cstat-no" title="statement not covered" > fs.appendFileSync(logFile, `\n\n[Process killed by signal ${signal}]\n`);</span>
2969
+ }
2970
+ });
2971
+ &nbsp;
2972
+ // Unref so parent can exit and process runs independently
2973
+ <span class="cstat-no" title="statement not covered" > child.unref();</span>
2974
+ &nbsp;
2975
+ // Show minimal output
2976
+ <span class="cstat-no" title="statement not covered" > console.log(`✓ Started "${projectName}" (${scriptName}) in background [PID: ${child.pid}]`);</span>
2977
+ <span class="cstat-no" title="statement not covered" > console.log(` Logs: ${logFile}`);</span>
2978
+ <span class="cstat-no" title="statement not covered" > console.log(` Command: ${command} ${commandArgs.join(' ')}\n`);</span>
2979
+ &nbsp;
2980
+ // For background processes, we can't easily do reactive detection
2981
+ // But we can check the log file after a short delay for port conflicts and URLs
2982
+ <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >async </span>() =&gt; {</span>
2983
+ <span class="cstat-no" title="statement not covered" > try {</span>
2984
+ // Wait a bit for process to start and potentially fail
2985
+ <span class="cstat-no" title="statement not covered" > await new Promise(<span class="fstat-no" title="function not covered" >resolve </span>=&gt; <span class="cstat-no" title="statement not covered" >setTimeout(resolve, 2000))</span>;</span>
2986
+
2987
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (fs.existsSync(logFile)) {</span>
2988
+ const logContent = <span class="cstat-no" title="statement not covered" >fs.readFileSync(logFile, 'utf-8');</span>
2989
+
2990
+ // Check for port conflicts
2991
+ const port = <span class="cstat-no" title="statement not covered" >extractPortFromError(logContent);</span>
2992
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (port) {</span>
2993
+ <span class="cstat-no" title="statement not covered" > console.error(`\n⚠️ Port conflict detected in background process: port ${port} is in use`);</span>
2994
+ <span class="cstat-no" title="statement not covered" > console.error(` Check log file: ${logFile}`);</span>
2995
+ <span class="cstat-no" title="statement not covered" > console.error(` Use: prx &lt;project&gt; &lt;script&gt; --force to auto-resolve port conflicts\n`);</span>
2996
+ }
2997
+
2998
+ // Extract URLs from output
2999
+ const urls = <span class="cstat-no" title="statement not covered" >extractUrlsFromOutput(logContent);</span>
3000
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (urls.length &gt; 0) {</span>
3001
+ <span class="cstat-no" title="statement not covered" > updateProcessUrls(child.pid!, urls);</span>
3002
+ }
3003
+ }
3004
+ } catch {
3005
+ // Ignore errors checking log file
3006
+ }
3007
+ }, 3000);
3008
+
3009
+ // Also check for URLs from detected ports
3010
+ <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >async </span>() =&gt; {</span>
3011
+ <span class="cstat-no" title="statement not covered" > try {</span>
3012
+ const db = <span class="cstat-no" title="statement not covered" >getDatabaseManager();</span>
3013
+ const project = <span class="cstat-no" title="statement not covered" >db.getProjectByPath(projectPath);</span>
3014
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (project) {</span>
3015
+ const ports = <span class="cstat-no" title="statement not covered" >db.getProjectPorts(project.id);</span>
3016
+ const urls: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
3017
+ <span class="cstat-no" title="statement not covered" > for (const portInfo of ports) {</span>
3018
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (portInfo.script_name === scriptName) {</span>
3019
+ <span class="cstat-no" title="statement not covered" > urls.push(`http://localhost:${portInfo.port}`);</span>
3020
+ }
3021
+ }
3022
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (urls.length &gt; 0) {</span>
3023
+ <span class="cstat-no" title="statement not covered" > updateProcessUrls(child.pid!, urls);</span>
3024
+ }
3025
+ }
3026
+ } catch {
3027
+ // Ignore errors
3028
+ }
3029
+ }, 5000);
3030
+ &nbsp;
3031
+ // Resolve with PID since process is running in background
3032
+ <span class="cstat-no" title="statement not covered" > resolve(child.pid);</span>
3033
+ });
3034
+ }
3035
+ &nbsp;
3036
+ &nbsp;</pre></td></tr></table></pre>
3037
+
3038
+ <div class='push'></div><!-- for sticky footer -->
3039
+ </div><!-- /wrapper -->
3040
+ <div class='footer quiet pad2 space-top1 center small'>
3041
+ Code coverage generated by
3042
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3043
+ at 2025-11-20T01:55:35.207Z
3044
+ </div>
3045
+ <script src="prettify.js"></script>
3046
+ <script>
3047
+ window.onload = function () {
3048
+ prettyPrint();
3049
+ };
3050
+ </script>
3051
+ <script src="sorter.js"></script>
3052
+ <script src="block-navigation.js"></script>
3053
+ </body>
3054
+ </html>
3055
+