@karpeleslab/klbfw 0.1.12 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +50 -0
- package/README.md +199 -35
- package/cookies.js +107 -41
- package/coverage/clover.xml +835 -0
- package/coverage/coverage-final.json +9 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/cookies.js.html +334 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/fw-wrapper.js.html +163 -0
- package/coverage/lcov-report/index.html +131 -0
- package/coverage/lcov-report/index.js.html +196 -0
- package/coverage/lcov-report/internal.js.html +604 -0
- package/coverage/lcov-report/klbfw/cookies.js.html +490 -0
- package/coverage/lcov-report/klbfw/fw-wrapper.js.html +745 -0
- package/coverage/lcov-report/klbfw/index.html +206 -0
- package/coverage/lcov-report/klbfw/index.js.html +235 -0
- package/coverage/lcov-report/klbfw/internal.js.html +811 -0
- package/coverage/lcov-report/klbfw/rest.js.html +565 -0
- package/coverage/lcov-report/klbfw/test/index.html +116 -0
- package/coverage/lcov-report/klbfw/test/setup.js.html +1105 -0
- package/coverage/lcov-report/klbfw/upload.js.html +3487 -0
- package/coverage/lcov-report/klbfw/util.js.html +388 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/rest.js.html +472 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/upload.js.html +1789 -0
- package/coverage/lcov-report/util.js.html +313 -0
- package/coverage/lcov.info +1617 -0
- package/fw-wrapper.js +221 -26
- package/index.js +16 -2
- package/internal.js +186 -102
- package/package.json +21 -3
- package/rest.js +129 -81
- package/test/README.md +62 -0
- package/test/api.test.js +102 -0
- package/test/cookies.test.js +65 -0
- package/test/integration.test.js +481 -0
- package/test/rest.test.js +93 -0
- package/test/setup.js +341 -0
- package/test/upload.test.js +689 -0
- package/test/util.test.js +46 -0
- package/upload.js +1012 -442
- package/util.js +59 -21
|
@@ -0,0 +1,3487 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for klbfw/upload.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">klbfw</a> upload.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">58.94% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>234/397</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">43.22% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>83/192</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">63.23% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>43/68</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">60.59% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>223/368</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line medium'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
+
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
+
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
+
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
+
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
+
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
+
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
+
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
+
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
+
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
+
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
+
<a name='L853'></a><a href='#L853'>853</a>
|
|
919
|
+
<a name='L854'></a><a href='#L854'>854</a>
|
|
920
|
+
<a name='L855'></a><a href='#L855'>855</a>
|
|
921
|
+
<a name='L856'></a><a href='#L856'>856</a>
|
|
922
|
+
<a name='L857'></a><a href='#L857'>857</a>
|
|
923
|
+
<a name='L858'></a><a href='#L858'>858</a>
|
|
924
|
+
<a name='L859'></a><a href='#L859'>859</a>
|
|
925
|
+
<a name='L860'></a><a href='#L860'>860</a>
|
|
926
|
+
<a name='L861'></a><a href='#L861'>861</a>
|
|
927
|
+
<a name='L862'></a><a href='#L862'>862</a>
|
|
928
|
+
<a name='L863'></a><a href='#L863'>863</a>
|
|
929
|
+
<a name='L864'></a><a href='#L864'>864</a>
|
|
930
|
+
<a name='L865'></a><a href='#L865'>865</a>
|
|
931
|
+
<a name='L866'></a><a href='#L866'>866</a>
|
|
932
|
+
<a name='L867'></a><a href='#L867'>867</a>
|
|
933
|
+
<a name='L868'></a><a href='#L868'>868</a>
|
|
934
|
+
<a name='L869'></a><a href='#L869'>869</a>
|
|
935
|
+
<a name='L870'></a><a href='#L870'>870</a>
|
|
936
|
+
<a name='L871'></a><a href='#L871'>871</a>
|
|
937
|
+
<a name='L872'></a><a href='#L872'>872</a>
|
|
938
|
+
<a name='L873'></a><a href='#L873'>873</a>
|
|
939
|
+
<a name='L874'></a><a href='#L874'>874</a>
|
|
940
|
+
<a name='L875'></a><a href='#L875'>875</a>
|
|
941
|
+
<a name='L876'></a><a href='#L876'>876</a>
|
|
942
|
+
<a name='L877'></a><a href='#L877'>877</a>
|
|
943
|
+
<a name='L878'></a><a href='#L878'>878</a>
|
|
944
|
+
<a name='L879'></a><a href='#L879'>879</a>
|
|
945
|
+
<a name='L880'></a><a href='#L880'>880</a>
|
|
946
|
+
<a name='L881'></a><a href='#L881'>881</a>
|
|
947
|
+
<a name='L882'></a><a href='#L882'>882</a>
|
|
948
|
+
<a name='L883'></a><a href='#L883'>883</a>
|
|
949
|
+
<a name='L884'></a><a href='#L884'>884</a>
|
|
950
|
+
<a name='L885'></a><a href='#L885'>885</a>
|
|
951
|
+
<a name='L886'></a><a href='#L886'>886</a>
|
|
952
|
+
<a name='L887'></a><a href='#L887'>887</a>
|
|
953
|
+
<a name='L888'></a><a href='#L888'>888</a>
|
|
954
|
+
<a name='L889'></a><a href='#L889'>889</a>
|
|
955
|
+
<a name='L890'></a><a href='#L890'>890</a>
|
|
956
|
+
<a name='L891'></a><a href='#L891'>891</a>
|
|
957
|
+
<a name='L892'></a><a href='#L892'>892</a>
|
|
958
|
+
<a name='L893'></a><a href='#L893'>893</a>
|
|
959
|
+
<a name='L894'></a><a href='#L894'>894</a>
|
|
960
|
+
<a name='L895'></a><a href='#L895'>895</a>
|
|
961
|
+
<a name='L896'></a><a href='#L896'>896</a>
|
|
962
|
+
<a name='L897'></a><a href='#L897'>897</a>
|
|
963
|
+
<a name='L898'></a><a href='#L898'>898</a>
|
|
964
|
+
<a name='L899'></a><a href='#L899'>899</a>
|
|
965
|
+
<a name='L900'></a><a href='#L900'>900</a>
|
|
966
|
+
<a name='L901'></a><a href='#L901'>901</a>
|
|
967
|
+
<a name='L902'></a><a href='#L902'>902</a>
|
|
968
|
+
<a name='L903'></a><a href='#L903'>903</a>
|
|
969
|
+
<a name='L904'></a><a href='#L904'>904</a>
|
|
970
|
+
<a name='L905'></a><a href='#L905'>905</a>
|
|
971
|
+
<a name='L906'></a><a href='#L906'>906</a>
|
|
972
|
+
<a name='L907'></a><a href='#L907'>907</a>
|
|
973
|
+
<a name='L908'></a><a href='#L908'>908</a>
|
|
974
|
+
<a name='L909'></a><a href='#L909'>909</a>
|
|
975
|
+
<a name='L910'></a><a href='#L910'>910</a>
|
|
976
|
+
<a name='L911'></a><a href='#L911'>911</a>
|
|
977
|
+
<a name='L912'></a><a href='#L912'>912</a>
|
|
978
|
+
<a name='L913'></a><a href='#L913'>913</a>
|
|
979
|
+
<a name='L914'></a><a href='#L914'>914</a>
|
|
980
|
+
<a name='L915'></a><a href='#L915'>915</a>
|
|
981
|
+
<a name='L916'></a><a href='#L916'>916</a>
|
|
982
|
+
<a name='L917'></a><a href='#L917'>917</a>
|
|
983
|
+
<a name='L918'></a><a href='#L918'>918</a>
|
|
984
|
+
<a name='L919'></a><a href='#L919'>919</a>
|
|
985
|
+
<a name='L920'></a><a href='#L920'>920</a>
|
|
986
|
+
<a name='L921'></a><a href='#L921'>921</a>
|
|
987
|
+
<a name='L922'></a><a href='#L922'>922</a>
|
|
988
|
+
<a name='L923'></a><a href='#L923'>923</a>
|
|
989
|
+
<a name='L924'></a><a href='#L924'>924</a>
|
|
990
|
+
<a name='L925'></a><a href='#L925'>925</a>
|
|
991
|
+
<a name='L926'></a><a href='#L926'>926</a>
|
|
992
|
+
<a name='L927'></a><a href='#L927'>927</a>
|
|
993
|
+
<a name='L928'></a><a href='#L928'>928</a>
|
|
994
|
+
<a name='L929'></a><a href='#L929'>929</a>
|
|
995
|
+
<a name='L930'></a><a href='#L930'>930</a>
|
|
996
|
+
<a name='L931'></a><a href='#L931'>931</a>
|
|
997
|
+
<a name='L932'></a><a href='#L932'>932</a>
|
|
998
|
+
<a name='L933'></a><a href='#L933'>933</a>
|
|
999
|
+
<a name='L934'></a><a href='#L934'>934</a>
|
|
1000
|
+
<a name='L935'></a><a href='#L935'>935</a>
|
|
1001
|
+
<a name='L936'></a><a href='#L936'>936</a>
|
|
1002
|
+
<a name='L937'></a><a href='#L937'>937</a>
|
|
1003
|
+
<a name='L938'></a><a href='#L938'>938</a>
|
|
1004
|
+
<a name='L939'></a><a href='#L939'>939</a>
|
|
1005
|
+
<a name='L940'></a><a href='#L940'>940</a>
|
|
1006
|
+
<a name='L941'></a><a href='#L941'>941</a>
|
|
1007
|
+
<a name='L942'></a><a href='#L942'>942</a>
|
|
1008
|
+
<a name='L943'></a><a href='#L943'>943</a>
|
|
1009
|
+
<a name='L944'></a><a href='#L944'>944</a>
|
|
1010
|
+
<a name='L945'></a><a href='#L945'>945</a>
|
|
1011
|
+
<a name='L946'></a><a href='#L946'>946</a>
|
|
1012
|
+
<a name='L947'></a><a href='#L947'>947</a>
|
|
1013
|
+
<a name='L948'></a><a href='#L948'>948</a>
|
|
1014
|
+
<a name='L949'></a><a href='#L949'>949</a>
|
|
1015
|
+
<a name='L950'></a><a href='#L950'>950</a>
|
|
1016
|
+
<a name='L951'></a><a href='#L951'>951</a>
|
|
1017
|
+
<a name='L952'></a><a href='#L952'>952</a>
|
|
1018
|
+
<a name='L953'></a><a href='#L953'>953</a>
|
|
1019
|
+
<a name='L954'></a><a href='#L954'>954</a>
|
|
1020
|
+
<a name='L955'></a><a href='#L955'>955</a>
|
|
1021
|
+
<a name='L956'></a><a href='#L956'>956</a>
|
|
1022
|
+
<a name='L957'></a><a href='#L957'>957</a>
|
|
1023
|
+
<a name='L958'></a><a href='#L958'>958</a>
|
|
1024
|
+
<a name='L959'></a><a href='#L959'>959</a>
|
|
1025
|
+
<a name='L960'></a><a href='#L960'>960</a>
|
|
1026
|
+
<a name='L961'></a><a href='#L961'>961</a>
|
|
1027
|
+
<a name='L962'></a><a href='#L962'>962</a>
|
|
1028
|
+
<a name='L963'></a><a href='#L963'>963</a>
|
|
1029
|
+
<a name='L964'></a><a href='#L964'>964</a>
|
|
1030
|
+
<a name='L965'></a><a href='#L965'>965</a>
|
|
1031
|
+
<a name='L966'></a><a href='#L966'>966</a>
|
|
1032
|
+
<a name='L967'></a><a href='#L967'>967</a>
|
|
1033
|
+
<a name='L968'></a><a href='#L968'>968</a>
|
|
1034
|
+
<a name='L969'></a><a href='#L969'>969</a>
|
|
1035
|
+
<a name='L970'></a><a href='#L970'>970</a>
|
|
1036
|
+
<a name='L971'></a><a href='#L971'>971</a>
|
|
1037
|
+
<a name='L972'></a><a href='#L972'>972</a>
|
|
1038
|
+
<a name='L973'></a><a href='#L973'>973</a>
|
|
1039
|
+
<a name='L974'></a><a href='#L974'>974</a>
|
|
1040
|
+
<a name='L975'></a><a href='#L975'>975</a>
|
|
1041
|
+
<a name='L976'></a><a href='#L976'>976</a>
|
|
1042
|
+
<a name='L977'></a><a href='#L977'>977</a>
|
|
1043
|
+
<a name='L978'></a><a href='#L978'>978</a>
|
|
1044
|
+
<a name='L979'></a><a href='#L979'>979</a>
|
|
1045
|
+
<a name='L980'></a><a href='#L980'>980</a>
|
|
1046
|
+
<a name='L981'></a><a href='#L981'>981</a>
|
|
1047
|
+
<a name='L982'></a><a href='#L982'>982</a>
|
|
1048
|
+
<a name='L983'></a><a href='#L983'>983</a>
|
|
1049
|
+
<a name='L984'></a><a href='#L984'>984</a>
|
|
1050
|
+
<a name='L985'></a><a href='#L985'>985</a>
|
|
1051
|
+
<a name='L986'></a><a href='#L986'>986</a>
|
|
1052
|
+
<a name='L987'></a><a href='#L987'>987</a>
|
|
1053
|
+
<a name='L988'></a><a href='#L988'>988</a>
|
|
1054
|
+
<a name='L989'></a><a href='#L989'>989</a>
|
|
1055
|
+
<a name='L990'></a><a href='#L990'>990</a>
|
|
1056
|
+
<a name='L991'></a><a href='#L991'>991</a>
|
|
1057
|
+
<a name='L992'></a><a href='#L992'>992</a>
|
|
1058
|
+
<a name='L993'></a><a href='#L993'>993</a>
|
|
1059
|
+
<a name='L994'></a><a href='#L994'>994</a>
|
|
1060
|
+
<a name='L995'></a><a href='#L995'>995</a>
|
|
1061
|
+
<a name='L996'></a><a href='#L996'>996</a>
|
|
1062
|
+
<a name='L997'></a><a href='#L997'>997</a>
|
|
1063
|
+
<a name='L998'></a><a href='#L998'>998</a>
|
|
1064
|
+
<a name='L999'></a><a href='#L999'>999</a>
|
|
1065
|
+
<a name='L1000'></a><a href='#L1000'>1000</a>
|
|
1066
|
+
<a name='L1001'></a><a href='#L1001'>1001</a>
|
|
1067
|
+
<a name='L1002'></a><a href='#L1002'>1002</a>
|
|
1068
|
+
<a name='L1003'></a><a href='#L1003'>1003</a>
|
|
1069
|
+
<a name='L1004'></a><a href='#L1004'>1004</a>
|
|
1070
|
+
<a name='L1005'></a><a href='#L1005'>1005</a>
|
|
1071
|
+
<a name='L1006'></a><a href='#L1006'>1006</a>
|
|
1072
|
+
<a name='L1007'></a><a href='#L1007'>1007</a>
|
|
1073
|
+
<a name='L1008'></a><a href='#L1008'>1008</a>
|
|
1074
|
+
<a name='L1009'></a><a href='#L1009'>1009</a>
|
|
1075
|
+
<a name='L1010'></a><a href='#L1010'>1010</a>
|
|
1076
|
+
<a name='L1011'></a><a href='#L1011'>1011</a>
|
|
1077
|
+
<a name='L1012'></a><a href='#L1012'>1012</a>
|
|
1078
|
+
<a name='L1013'></a><a href='#L1013'>1013</a>
|
|
1079
|
+
<a name='L1014'></a><a href='#L1014'>1014</a>
|
|
1080
|
+
<a name='L1015'></a><a href='#L1015'>1015</a>
|
|
1081
|
+
<a name='L1016'></a><a href='#L1016'>1016</a>
|
|
1082
|
+
<a name='L1017'></a><a href='#L1017'>1017</a>
|
|
1083
|
+
<a name='L1018'></a><a href='#L1018'>1018</a>
|
|
1084
|
+
<a name='L1019'></a><a href='#L1019'>1019</a>
|
|
1085
|
+
<a name='L1020'></a><a href='#L1020'>1020</a>
|
|
1086
|
+
<a name='L1021'></a><a href='#L1021'>1021</a>
|
|
1087
|
+
<a name='L1022'></a><a href='#L1022'>1022</a>
|
|
1088
|
+
<a name='L1023'></a><a href='#L1023'>1023</a>
|
|
1089
|
+
<a name='L1024'></a><a href='#L1024'>1024</a>
|
|
1090
|
+
<a name='L1025'></a><a href='#L1025'>1025</a>
|
|
1091
|
+
<a name='L1026'></a><a href='#L1026'>1026</a>
|
|
1092
|
+
<a name='L1027'></a><a href='#L1027'>1027</a>
|
|
1093
|
+
<a name='L1028'></a><a href='#L1028'>1028</a>
|
|
1094
|
+
<a name='L1029'></a><a href='#L1029'>1029</a>
|
|
1095
|
+
<a name='L1030'></a><a href='#L1030'>1030</a>
|
|
1096
|
+
<a name='L1031'></a><a href='#L1031'>1031</a>
|
|
1097
|
+
<a name='L1032'></a><a href='#L1032'>1032</a>
|
|
1098
|
+
<a name='L1033'></a><a href='#L1033'>1033</a>
|
|
1099
|
+
<a name='L1034'></a><a href='#L1034'>1034</a>
|
|
1100
|
+
<a name='L1035'></a><a href='#L1035'>1035</a>
|
|
1101
|
+
<a name='L1036'></a><a href='#L1036'>1036</a>
|
|
1102
|
+
<a name='L1037'></a><a href='#L1037'>1037</a>
|
|
1103
|
+
<a name='L1038'></a><a href='#L1038'>1038</a>
|
|
1104
|
+
<a name='L1039'></a><a href='#L1039'>1039</a>
|
|
1105
|
+
<a name='L1040'></a><a href='#L1040'>1040</a>
|
|
1106
|
+
<a name='L1041'></a><a href='#L1041'>1041</a>
|
|
1107
|
+
<a name='L1042'></a><a href='#L1042'>1042</a>
|
|
1108
|
+
<a name='L1043'></a><a href='#L1043'>1043</a>
|
|
1109
|
+
<a name='L1044'></a><a href='#L1044'>1044</a>
|
|
1110
|
+
<a name='L1045'></a><a href='#L1045'>1045</a>
|
|
1111
|
+
<a name='L1046'></a><a href='#L1046'>1046</a>
|
|
1112
|
+
<a name='L1047'></a><a href='#L1047'>1047</a>
|
|
1113
|
+
<a name='L1048'></a><a href='#L1048'>1048</a>
|
|
1114
|
+
<a name='L1049'></a><a href='#L1049'>1049</a>
|
|
1115
|
+
<a name='L1050'></a><a href='#L1050'>1050</a>
|
|
1116
|
+
<a name='L1051'></a><a href='#L1051'>1051</a>
|
|
1117
|
+
<a name='L1052'></a><a href='#L1052'>1052</a>
|
|
1118
|
+
<a name='L1053'></a><a href='#L1053'>1053</a>
|
|
1119
|
+
<a name='L1054'></a><a href='#L1054'>1054</a>
|
|
1120
|
+
<a name='L1055'></a><a href='#L1055'>1055</a>
|
|
1121
|
+
<a name='L1056'></a><a href='#L1056'>1056</a>
|
|
1122
|
+
<a name='L1057'></a><a href='#L1057'>1057</a>
|
|
1123
|
+
<a name='L1058'></a><a href='#L1058'>1058</a>
|
|
1124
|
+
<a name='L1059'></a><a href='#L1059'>1059</a>
|
|
1125
|
+
<a name='L1060'></a><a href='#L1060'>1060</a>
|
|
1126
|
+
<a name='L1061'></a><a href='#L1061'>1061</a>
|
|
1127
|
+
<a name='L1062'></a><a href='#L1062'>1062</a>
|
|
1128
|
+
<a name='L1063'></a><a href='#L1063'>1063</a>
|
|
1129
|
+
<a name='L1064'></a><a href='#L1064'>1064</a>
|
|
1130
|
+
<a name='L1065'></a><a href='#L1065'>1065</a>
|
|
1131
|
+
<a name='L1066'></a><a href='#L1066'>1066</a>
|
|
1132
|
+
<a name='L1067'></a><a href='#L1067'>1067</a>
|
|
1133
|
+
<a name='L1068'></a><a href='#L1068'>1068</a>
|
|
1134
|
+
<a name='L1069'></a><a href='#L1069'>1069</a>
|
|
1135
|
+
<a name='L1070'></a><a href='#L1070'>1070</a>
|
|
1136
|
+
<a name='L1071'></a><a href='#L1071'>1071</a>
|
|
1137
|
+
<a name='L1072'></a><a href='#L1072'>1072</a>
|
|
1138
|
+
<a name='L1073'></a><a href='#L1073'>1073</a>
|
|
1139
|
+
<a name='L1074'></a><a href='#L1074'>1074</a>
|
|
1140
|
+
<a name='L1075'></a><a href='#L1075'>1075</a>
|
|
1141
|
+
<a name='L1076'></a><a href='#L1076'>1076</a>
|
|
1142
|
+
<a name='L1077'></a><a href='#L1077'>1077</a>
|
|
1143
|
+
<a name='L1078'></a><a href='#L1078'>1078</a>
|
|
1144
|
+
<a name='L1079'></a><a href='#L1079'>1079</a>
|
|
1145
|
+
<a name='L1080'></a><a href='#L1080'>1080</a>
|
|
1146
|
+
<a name='L1081'></a><a href='#L1081'>1081</a>
|
|
1147
|
+
<a name='L1082'></a><a href='#L1082'>1082</a>
|
|
1148
|
+
<a name='L1083'></a><a href='#L1083'>1083</a>
|
|
1149
|
+
<a name='L1084'></a><a href='#L1084'>1084</a>
|
|
1150
|
+
<a name='L1085'></a><a href='#L1085'>1085</a>
|
|
1151
|
+
<a name='L1086'></a><a href='#L1086'>1086</a>
|
|
1152
|
+
<a name='L1087'></a><a href='#L1087'>1087</a>
|
|
1153
|
+
<a name='L1088'></a><a href='#L1088'>1088</a>
|
|
1154
|
+
<a name='L1089'></a><a href='#L1089'>1089</a>
|
|
1155
|
+
<a name='L1090'></a><a href='#L1090'>1090</a>
|
|
1156
|
+
<a name='L1091'></a><a href='#L1091'>1091</a>
|
|
1157
|
+
<a name='L1092'></a><a href='#L1092'>1092</a>
|
|
1158
|
+
<a name='L1093'></a><a href='#L1093'>1093</a>
|
|
1159
|
+
<a name='L1094'></a><a href='#L1094'>1094</a>
|
|
1160
|
+
<a name='L1095'></a><a href='#L1095'>1095</a>
|
|
1161
|
+
<a name='L1096'></a><a href='#L1096'>1096</a>
|
|
1162
|
+
<a name='L1097'></a><a href='#L1097'>1097</a>
|
|
1163
|
+
<a name='L1098'></a><a href='#L1098'>1098</a>
|
|
1164
|
+
<a name='L1099'></a><a href='#L1099'>1099</a>
|
|
1165
|
+
<a name='L1100'></a><a href='#L1100'>1100</a>
|
|
1166
|
+
<a name='L1101'></a><a href='#L1101'>1101</a>
|
|
1167
|
+
<a name='L1102'></a><a href='#L1102'>1102</a>
|
|
1168
|
+
<a name='L1103'></a><a href='#L1103'>1103</a>
|
|
1169
|
+
<a name='L1104'></a><a href='#L1104'>1104</a>
|
|
1170
|
+
<a name='L1105'></a><a href='#L1105'>1105</a>
|
|
1171
|
+
<a name='L1106'></a><a href='#L1106'>1106</a>
|
|
1172
|
+
<a name='L1107'></a><a href='#L1107'>1107</a>
|
|
1173
|
+
<a name='L1108'></a><a href='#L1108'>1108</a>
|
|
1174
|
+
<a name='L1109'></a><a href='#L1109'>1109</a>
|
|
1175
|
+
<a name='L1110'></a><a href='#L1110'>1110</a>
|
|
1176
|
+
<a name='L1111'></a><a href='#L1111'>1111</a>
|
|
1177
|
+
<a name='L1112'></a><a href='#L1112'>1112</a>
|
|
1178
|
+
<a name='L1113'></a><a href='#L1113'>1113</a>
|
|
1179
|
+
<a name='L1114'></a><a href='#L1114'>1114</a>
|
|
1180
|
+
<a name='L1115'></a><a href='#L1115'>1115</a>
|
|
1181
|
+
<a name='L1116'></a><a href='#L1116'>1116</a>
|
|
1182
|
+
<a name='L1117'></a><a href='#L1117'>1117</a>
|
|
1183
|
+
<a name='L1118'></a><a href='#L1118'>1118</a>
|
|
1184
|
+
<a name='L1119'></a><a href='#L1119'>1119</a>
|
|
1185
|
+
<a name='L1120'></a><a href='#L1120'>1120</a>
|
|
1186
|
+
<a name='L1121'></a><a href='#L1121'>1121</a>
|
|
1187
|
+
<a name='L1122'></a><a href='#L1122'>1122</a>
|
|
1188
|
+
<a name='L1123'></a><a href='#L1123'>1123</a>
|
|
1189
|
+
<a name='L1124'></a><a href='#L1124'>1124</a>
|
|
1190
|
+
<a name='L1125'></a><a href='#L1125'>1125</a>
|
|
1191
|
+
<a name='L1126'></a><a href='#L1126'>1126</a>
|
|
1192
|
+
<a name='L1127'></a><a href='#L1127'>1127</a>
|
|
1193
|
+
<a name='L1128'></a><a href='#L1128'>1128</a>
|
|
1194
|
+
<a name='L1129'></a><a href='#L1129'>1129</a>
|
|
1195
|
+
<a name='L1130'></a><a href='#L1130'>1130</a>
|
|
1196
|
+
<a name='L1131'></a><a href='#L1131'>1131</a>
|
|
1197
|
+
<a name='L1132'></a><a href='#L1132'>1132</a>
|
|
1198
|
+
<a name='L1133'></a><a href='#L1133'>1133</a>
|
|
1199
|
+
<a name='L1134'></a><a href='#L1134'>1134</a>
|
|
1200
|
+
<a name='L1135'></a><a href='#L1135'>1135</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1221
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1239
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1255
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1256
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1257
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1289
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1304
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1306
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1315
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1324
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1329
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1331
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-no"> </span>
|
|
1342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1358
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1359
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1360
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1361
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1368
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
+
<span class="cline-any cline-no"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1395
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1397
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1401
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1404
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1405
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1410
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1425
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1426
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1427
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1433
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1434
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1435
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1437
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1438
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1439
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1440
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1442
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1448
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1450
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1454
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </span>
|
|
1465
|
+
<span class="cline-any cline-no"> </span>
|
|
1466
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1469
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1470
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1471
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1474
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1475
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1478
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1489
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1490
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1492
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1493
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1494
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1495
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1501
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1502
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1503
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1505
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1515
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1516
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1522
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1535
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1537
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1541
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1550
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1561
|
+
<span class="cline-any cline-yes">36x</span>
|
|
1562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1564
|
+
<span class="cline-any cline-yes">36x</span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1569
|
+
<span class="cline-any cline-yes">36x</span>
|
|
1570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
1585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-no"> </span>
|
|
1592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1594
|
+
<span class="cline-any cline-no"> </span>
|
|
1595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1603
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1616
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1619
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1620
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1621
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1622
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1628
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1629
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1634
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1638
|
+
<span class="cline-any cline-no"> </span>
|
|
1639
|
+
<span class="cline-any cline-no"> </span>
|
|
1640
|
+
<span class="cline-any cline-no"> </span>
|
|
1641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1642
|
+
<span class="cline-any cline-no"> </span>
|
|
1643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1652
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1664
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1665
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1667
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1673
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1674
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1678
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1679
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1680
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1681
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1686
|
+
<span class="cline-any cline-no"> </span>
|
|
1687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1696
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1699
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1700
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1702
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1704
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1709
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1710
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1711
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1712
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1715
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1726
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1730
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1735
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1738
|
+
<span class="cline-any cline-no"> </span>
|
|
1739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1748
|
+
<span class="cline-any cline-no"> </span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1753
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1754
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1755
|
+
<span class="cline-any cline-no"> </span>
|
|
1756
|
+
<span class="cline-any cline-no"> </span>
|
|
1757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1760
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1761
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1762
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1763
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1765
|
+
<span class="cline-any cline-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1776
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1778
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1780
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1789
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1790
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1793
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1794
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1796
|
+
<span class="cline-any cline-no"> </span>
|
|
1797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1808
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1813
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1814
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1815
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1819
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1826
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1829
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1830
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1832
|
+
<span class="cline-any cline-no"> </span>
|
|
1833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1843
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1846
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1847
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1850
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1851
|
+
<span class="cline-any cline-yes">126x</span>
|
|
1852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1853
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1856
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1857
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1858
|
+
<span class="cline-any cline-yes">114x</span>
|
|
1859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1860
|
+
<span class="cline-any cline-yes">66x</span>
|
|
1861
|
+
<span class="cline-any cline-yes">66x</span>
|
|
1862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1864
|
+
<span class="cline-any cline-yes">48x</span>
|
|
1865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1868
|
+
<span class="cline-any cline-yes">60x</span>
|
|
1869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1872
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1875
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1877
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1879
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1880
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1881
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1882
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1887
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1893
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1894
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1896
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1897
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1898
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1901
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1904
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1905
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1908
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1916
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1917
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1918
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1924
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1927
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1930
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1932
|
+
<span class="cline-any cline-no"> </span>
|
|
1933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1935
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1936
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1941
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1943
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1944
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1945
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1947
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1948
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1951
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1953
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1954
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1957
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
+
<span class="cline-any cline-no"> </span>
|
|
1960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1968
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1971
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1973
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1976
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1980
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1989
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1990
|
+
<span class="cline-any cline-yes">56x</span>
|
|
1991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1992
|
+
<span class="cline-any cline-yes">119x</span>
|
|
1993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2001
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2003
|
+
<span class="cline-any cline-no"> </span>
|
|
2004
|
+
<span class="cline-any cline-no"> </span>
|
|
2005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2008
|
+
<span class="cline-any cline-no"> </span>
|
|
2009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2012
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2015
|
+
<span class="cline-any cline-no"> </span>
|
|
2016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2017
|
+
<span class="cline-any cline-no"> </span>
|
|
2018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2019
|
+
<span class="cline-any cline-no"> </span>
|
|
2020
|
+
<span class="cline-any cline-no"> </span>
|
|
2021
|
+
<span class="cline-any cline-no"> </span>
|
|
2022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
+
<span class="cline-any cline-no"> </span>
|
|
2025
|
+
<span class="cline-any cline-no"> </span>
|
|
2026
|
+
<span class="cline-any cline-no"> </span>
|
|
2027
|
+
<span class="cline-any cline-no"> </span>
|
|
2028
|
+
<span class="cline-any cline-no"> </span>
|
|
2029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2031
|
+
<span class="cline-any cline-no"> </span>
|
|
2032
|
+
<span class="cline-any cline-no"> </span>
|
|
2033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2034
|
+
<span class="cline-any cline-no"> </span>
|
|
2035
|
+
<span class="cline-any cline-no"> </span>
|
|
2036
|
+
<span class="cline-any cline-no"> </span>
|
|
2037
|
+
<span class="cline-any cline-no"> </span>
|
|
2038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2040
|
+
<span class="cline-any cline-no"> </span>
|
|
2041
|
+
<span class="cline-any cline-no"> </span>
|
|
2042
|
+
<span class="cline-any cline-no"> </span>
|
|
2043
|
+
<span class="cline-any cline-no"> </span>
|
|
2044
|
+
<span class="cline-any cline-no"> </span>
|
|
2045
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2046
|
+
<span class="cline-any cline-no"> </span>
|
|
2047
|
+
<span class="cline-any cline-no"> </span>
|
|
2048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2050
|
+
<span class="cline-any cline-no"> </span>
|
|
2051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2054
|
+
<span class="cline-any cline-no"> </span>
|
|
2055
|
+
<span class="cline-any cline-no"> </span>
|
|
2056
|
+
<span class="cline-any cline-no"> </span>
|
|
2057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2058
|
+
<span class="cline-any cline-no"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2060
|
+
<span class="cline-any cline-no"> </span>
|
|
2061
|
+
<span class="cline-any cline-no"> </span>
|
|
2062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2064
|
+
<span class="cline-any cline-no"> </span>
|
|
2065
|
+
<span class="cline-any cline-no"> </span>
|
|
2066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2068
|
+
<span class="cline-any cline-no"> </span>
|
|
2069
|
+
<span class="cline-any cline-no"> </span>
|
|
2070
|
+
<span class="cline-any cline-no"> </span>
|
|
2071
|
+
<span class="cline-any cline-no"> </span>
|
|
2072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2074
|
+
<span class="cline-any cline-no"> </span>
|
|
2075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2076
|
+
<span class="cline-any cline-no"> </span>
|
|
2077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2078
|
+
<span class="cline-any cline-no"> </span>
|
|
2079
|
+
<span class="cline-any cline-no"> </span>
|
|
2080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2081
|
+
<span class="cline-any cline-no"> </span>
|
|
2082
|
+
<span class="cline-any cline-no"> </span>
|
|
2083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2085
|
+
<span class="cline-any cline-no"> </span>
|
|
2086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2091
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2093
|
+
<span class="cline-any cline-no"> </span>
|
|
2094
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2098
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2101
|
+
<span class="cline-any cline-no"> </span>
|
|
2102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2103
|
+
<span class="cline-any cline-no"> </span>
|
|
2104
|
+
<span class="cline-any cline-no"> </span>
|
|
2105
|
+
<span class="cline-any cline-no"> </span>
|
|
2106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2108
|
+
<span class="cline-any cline-no"> </span>
|
|
2109
|
+
<span class="cline-any cline-no"> </span>
|
|
2110
|
+
<span class="cline-any cline-no"> </span>
|
|
2111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2113
|
+
<span class="cline-any cline-no"> </span>
|
|
2114
|
+
<span class="cline-any cline-no"> </span>
|
|
2115
|
+
<span class="cline-any cline-no"> </span>
|
|
2116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2119
|
+
<span class="cline-any cline-no"> </span>
|
|
2120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2124
|
+
<span class="cline-any cline-no"> </span>
|
|
2125
|
+
<span class="cline-any cline-no"> </span>
|
|
2126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2131
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2139
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2140
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2142
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2143
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2146
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2147
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2159
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2165
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2168
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2170
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2171
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2172
|
+
<span class="cline-any cline-no"> </span>
|
|
2173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2175
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2176
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2177
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2178
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2184
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2186
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2188
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2192
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2194
|
+
<span class="cline-any cline-no"> </span>
|
|
2195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2196
|
+
<span class="cline-any cline-no"> </span>
|
|
2197
|
+
<span class="cline-any cline-no"> </span>
|
|
2198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2201
|
+
<span class="cline-any cline-no"> </span>
|
|
2202
|
+
<span class="cline-any cline-no"> </span>
|
|
2203
|
+
<span class="cline-any cline-no"> </span>
|
|
2204
|
+
<span class="cline-any cline-no"> </span>
|
|
2205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2209
|
+
<span class="cline-any cline-no"> </span>
|
|
2210
|
+
<span class="cline-any cline-no"> </span>
|
|
2211
|
+
<span class="cline-any cline-no"> </span>
|
|
2212
|
+
<span class="cline-any cline-no"> </span>
|
|
2213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2218
|
+
<span class="cline-any cline-no"> </span>
|
|
2219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2221
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2225
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2227
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2230
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2231
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2235
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2239
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2242
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2244
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2247
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2248
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2249
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2253
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2260
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2262
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2263
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2265
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2266
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2267
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2268
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2269
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2274
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2277
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2278
|
+
<span class="cline-any cline-no"> </span>
|
|
2279
|
+
<span class="cline-any cline-no"> </span>
|
|
2280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2284
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2287
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2288
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2289
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2294
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2295
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2298
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2301
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2304
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2311
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2312
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2314
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2317
|
+
<span class="cline-any cline-yes">21x</span>
|
|
2318
|
+
<span class="cline-any cline-yes">37x</span>
|
|
2319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2321
|
+
<span class="cline-any cline-yes">37x</span>
|
|
2322
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2323
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2324
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2326
|
+
<span class="cline-any cline-yes">28x</span>
|
|
2327
|
+
<span class="cline-any cline-yes">28x</span>
|
|
2328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2329
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2332
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2334
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
2335
|
+
* KLB Upload Module
|
|
2336
|
+
*
|
|
2337
|
+
* This module handles file uploads to KLB API endpoints.
|
|
2338
|
+
* It supports both browser and Node.js environments with a unified API.
|
|
2339
|
+
*
|
|
2340
|
+
* The module handles:
|
|
2341
|
+
* - File upload to KLB API endpoints
|
|
2342
|
+
* - Multiple upload protocols (PUT and AWS multipart)
|
|
2343
|
+
* - Progress tracking
|
|
2344
|
+
* - Pause, resume, retry, and cancel operations
|
|
2345
|
+
* - Browser and Node.js compatibility
|
|
2346
|
+
*
|
|
2347
|
+
* Browser usage:
|
|
2348
|
+
* ```js
|
|
2349
|
+
* // Open file picker and upload selected files
|
|
2350
|
+
* upload.upload.init('Misc/Debug:testUpload')()
|
|
2351
|
+
* .then(result => console.log('Upload complete', result));
|
|
2352
|
+
*
|
|
2353
|
+
* // Upload a specific File object
|
|
2354
|
+
* upload.upload.append('Misc/Debug:testUpload', fileObject)
|
|
2355
|
+
* .then(result => console.log('Upload complete', result));
|
|
2356
|
+
*
|
|
2357
|
+
* // Track progress
|
|
2358
|
+
* upload.upload.onprogress = (status) => {
|
|
2359
|
+
* console.log('Progress:', status.running.map(i => i.status));
|
|
2360
|
+
* };
|
|
2361
|
+
*
|
|
2362
|
+
* // Cancel an upload
|
|
2363
|
+
* upload.upload.cancelItem(uploadId);
|
|
2364
|
+
* ```
|
|
2365
|
+
*
|
|
2366
|
+
* Node.js usage:
|
|
2367
|
+
* ```js
|
|
2368
|
+
* // For Node.js environments, first install dependencies:
|
|
2369
|
+
* // npm install node-fetch xmldom
|
|
2370
|
+
*
|
|
2371
|
+
* // Initialize upload with specific file paths
|
|
2372
|
+
* upload.upload.init('Misc/Debug:testUpload')(['./file1.txt', './file2.jpg'])
|
|
2373
|
+
* .then(result => console.log('Upload complete', result));
|
|
2374
|
+
*
|
|
2375
|
+
* // Or create a custom file object with path
|
|
2376
|
+
* const file = {
|
|
2377
|
+
* name: 'test.txt',
|
|
2378
|
+
* size: 1024,
|
|
2379
|
+
* type: 'text/plain',
|
|
2380
|
+
* path: '/path/to/file.txt'
|
|
2381
|
+
* };
|
|
2382
|
+
* upload.upload.append('Misc/Debug:testUpload', file)
|
|
2383
|
+
* .then(result => console.log('Upload complete', result));
|
|
2384
|
+
* ```
|
|
2385
|
+
*
|
|
2386
|
+
* @module upload
|
|
2387
|
+
*/
|
|
2388
|
+
|
|
2389
|
+
const rest = require('./rest');
|
|
2390
|
+
const fwWrapper = require('./fw-wrapper');
|
|
2391
|
+
const sha256 = require('js-sha256').sha256;
|
|
2392
|
+
|
|
2393
|
+
/**
|
|
2394
|
+
* Environment detection and cross-platform utilities
|
|
2395
|
+
*/
|
|
2396
|
+
const env = {
|
|
2397
|
+
/**
|
|
2398
|
+
* Detect if running in a browser environment
|
|
2399
|
+
*/
|
|
2400
|
+
isBrowser: typeof window !== 'undefined' && typeof document !== 'undefined',
|
|
2401
|
+
|
|
2402
|
+
/**
|
|
2403
|
+
* Detect if running in a Node.js environment
|
|
2404
|
+
*/
|
|
2405
|
+
isNode: typeof process !== 'undefined' && process.versions && process.versions.node,
|
|
2406
|
+
|
|
2407
|
+
/**
|
|
2408
|
+
* Node.js specific modules (lazy-loaded)
|
|
2409
|
+
*/
|
|
2410
|
+
node: {
|
|
2411
|
+
fetch: null,
|
|
2412
|
+
xmlParser: null,
|
|
2413
|
+
fs: null,
|
|
2414
|
+
path: null,
|
|
2415
|
+
EventEmitter: null,
|
|
2416
|
+
eventEmitter: null
|
|
2417
|
+
}
|
|
2418
|
+
};
|
|
2419
|
+
|
|
2420
|
+
/**
|
|
2421
|
+
* Initialize Node.js dependencies when in Node environment
|
|
2422
|
+
*/
|
|
2423
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (env.isNode && !env.isBrowser) {
|
|
2424
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2425
|
+
<span class="cstat-no" title="statement not covered" > env.node.fetch = require('node-fetch');</span>
|
|
2426
|
+
<span class="cstat-no" title="statement not covered" > env.node.xmlParser = require('xmldom');</span>
|
|
2427
|
+
<span class="cstat-no" title="statement not covered" > env.node.fs = require('fs');</span>
|
|
2428
|
+
<span class="cstat-no" title="statement not covered" > env.node.path = require('path');</span>
|
|
2429
|
+
<span class="cstat-no" title="statement not covered" > env.node.EventEmitter = require('events');</span>
|
|
2430
|
+
<span class="cstat-no" title="statement not covered" > env.node.eventEmitter = new (env.node.EventEmitter)();</span>
|
|
2431
|
+
} catch (e) {
|
|
2432
|
+
<span class="cstat-no" title="statement not covered" > console.warn('Node.js dependencies not available. Some functionality may be limited:', e.message);</span>
|
|
2433
|
+
<span class="cstat-no" title="statement not covered" > console.warn('To use in Node.js, install: npm install node-fetch xmldom');</span>
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
|
|
2437
|
+
/**
|
|
2438
|
+
* Cross-platform utilities
|
|
2439
|
+
*/
|
|
2440
|
+
const utils = {
|
|
2441
|
+
/**
|
|
2442
|
+
* Environment-agnostic fetch implementation
|
|
2443
|
+
* @param {string} url - The URL to fetch
|
|
2444
|
+
* @param {Object} options - Fetch options
|
|
2445
|
+
* @returns {Promise} - Fetch promise
|
|
2446
|
+
*/
|
|
2447
|
+
fetch(url, options) {
|
|
2448
|
+
if (env.isBrowser && typeof window.fetch === 'function') {
|
|
2449
|
+
return window.fetch(url, options);
|
|
2450
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (env.isNode && env.node.fetch) {</span>
|
|
2451
|
+
<span class="cstat-no" title="statement not covered" > return env.node.fetch(url, options);</span>
|
|
2452
|
+
} else <span class="cstat-no" title="statement not covered" >if (typeof fetch === 'function') {</span>
|
|
2453
|
+
// For environments where fetch is globally available
|
|
2454
|
+
<span class="cstat-no" title="statement not covered" > return fetch(url, options);</span>
|
|
2455
|
+
}
|
|
2456
|
+
<span class="cstat-no" title="statement not covered" > return Promise.reject(new Error('fetch not available in this environment'));</span>
|
|
2457
|
+
},
|
|
2458
|
+
|
|
2459
|
+
/**
|
|
2460
|
+
* Environment-agnostic XML parser
|
|
2461
|
+
* @param {string} xmlString - XML string to parse
|
|
2462
|
+
* @returns {Document} - DOM-like document
|
|
2463
|
+
*/
|
|
2464
|
+
parseXML(xmlString) {
|
|
2465
|
+
if (env.isBrowser) {
|
|
2466
|
+
return new DOMParser().parseFromString(xmlString, 'text/xml');
|
|
2467
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (env.isNode && env.node.xmlParser) {</span>
|
|
2468
|
+
const DOMParserNode = <span class="cstat-no" title="statement not covered" >env.node.xmlParser.DOMParser;</span>
|
|
2469
|
+
const dom = <span class="cstat-no" title="statement not covered" >new DOMParserNode().parseFromString(xmlString, 'text/xml');</span>
|
|
2470
|
+
|
|
2471
|
+
// Add querySelector interface for compatibility
|
|
2472
|
+
<span class="cstat-no" title="statement not covered" > dom.querySelector = <span class="fstat-no" title="function not covered" >fu</span>nction(selector) {</span>
|
|
2473
|
+
<span class="cstat-no" title="statement not covered" > if (selector === 'UploadId') {</span>
|
|
2474
|
+
const elements = <span class="cstat-no" title="statement not covered" >this.getElementsByTagName('UploadId');</span>
|
|
2475
|
+
<span class="cstat-no" title="statement not covered" > return elements.length > 0 ? { innerHTML: elements[0].textContent } : null;</span>
|
|
2476
|
+
}
|
|
2477
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
2478
|
+
};
|
|
2479
|
+
|
|
2480
|
+
<span class="cstat-no" title="statement not covered" > return dom;</span>
|
|
2481
|
+
}
|
|
2482
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('XML parsing not available in this environment');</span>
|
|
2483
|
+
},
|
|
2484
|
+
|
|
2485
|
+
/**
|
|
2486
|
+
* Read a file as ArrayBuffer in any environment
|
|
2487
|
+
* @param {File|Object} file - File object or file-like object with path
|
|
2488
|
+
* @param {Function} callback - Callback function(buffer, error)
|
|
2489
|
+
*/
|
|
2490
|
+
readFileAsArrayBuffer(file, callback) {
|
|
2491
|
+
if (env.isBrowser) {
|
|
2492
|
+
const reader = new FileReader();
|
|
2493
|
+
reader.addEventListener('loadend', () => callback(reader.result));
|
|
2494
|
+
reader.addEventListener('error', <span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >callback(null, e))</span>;
|
|
2495
|
+
reader.readAsArrayBuffer(file);
|
|
2496
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (env.isNode && env.node.fs) {</span>
|
|
2497
|
+
<span class="cstat-no" title="statement not covered" > if (file.path) {</span>
|
|
2498
|
+
// Read from filesystem
|
|
2499
|
+
const readStream = <span class="cstat-no" title="statement not covered" >env.node.fs.createReadStream(file.path, {</span>
|
|
2500
|
+
start: file.start || 0,
|
|
2501
|
+
end: file.end || undefined
|
|
2502
|
+
});
|
|
2503
|
+
|
|
2504
|
+
const chunks = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
2505
|
+
<span class="cstat-no" title="statement not covered" > readStream.on('data', <span class="fstat-no" title="function not covered" >ch</span>unk => <span class="cstat-no" title="statement not covered" >chunks.push(chunk))</span>;</span>
|
|
2506
|
+
<span class="cstat-no" title="statement not covered" > readStream.on('end', <span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
2507
|
+
const buffer = <span class="cstat-no" title="statement not covered" >Buffer.concat(chunks);</span>
|
|
2508
|
+
<span class="cstat-no" title="statement not covered" > callback(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));</span>
|
|
2509
|
+
});
|
|
2510
|
+
<span class="cstat-no" title="statement not covered" > readStream.on('error', <span class="fstat-no" title="function not covered" >er</span>r => <span class="cstat-no" title="statement not covered" >callback(null, err))</span>;</span>
|
|
2511
|
+
} else <span class="cstat-no" title="statement not covered" >if (file.content) {</span>
|
|
2512
|
+
// Memory buffer
|
|
2513
|
+
const buffer = <span class="cstat-no" title="statement not covered" >Buffer.from(file.content);</span>
|
|
2514
|
+
<span class="cstat-no" title="statement not covered" > callback(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));</span>
|
|
2515
|
+
} else {
|
|
2516
|
+
<span class="cstat-no" title="statement not covered" > callback(null, new Error('No file path or content provided'));</span>
|
|
2517
|
+
}
|
|
2518
|
+
} else {
|
|
2519
|
+
<span class="cstat-no" title="statement not covered" > callback(null, new Error('File reading not available in this environment'));</span>
|
|
2520
|
+
}
|
|
2521
|
+
},
|
|
2522
|
+
|
|
2523
|
+
/**
|
|
2524
|
+
* Dispatch a custom event in any environment
|
|
2525
|
+
* @param {string} eventName - Event name
|
|
2526
|
+
* @param {Object} detail - Event details
|
|
2527
|
+
*/
|
|
2528
|
+
dispatchEvent(eventName, detail) {
|
|
2529
|
+
if (env.isBrowser) {
|
|
2530
|
+
const evt = new CustomEvent(eventName, { detail });
|
|
2531
|
+
document.dispatchEvent(evt);
|
|
2532
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (env.isNode && env.node.eventEmitter) {</span>
|
|
2533
|
+
<span class="cstat-no" title="statement not covered" > env.node.eventEmitter.emit(eventName, detail);</span>
|
|
2534
|
+
}
|
|
2535
|
+
// In other environments, events are silently ignored
|
|
2536
|
+
},
|
|
2537
|
+
|
|
2538
|
+
/**
|
|
2539
|
+
* Format a date for AWS (YYYYMMDDTHHMMSSZ)
|
|
2540
|
+
* @returns {string} Formatted date
|
|
2541
|
+
*/
|
|
2542
|
+
getAmzTime() {
|
|
2543
|
+
const t = new Date();
|
|
2544
|
+
return t.getUTCFullYear() +
|
|
2545
|
+
this.pad(t.getUTCMonth() + 1) +
|
|
2546
|
+
this.pad(t.getUTCDate()) +
|
|
2547
|
+
'T' + this.pad(t.getUTCHours()) +
|
|
2548
|
+
this.pad(t.getUTCMinutes()) +
|
|
2549
|
+
this.pad(t.getUTCSeconds()) +
|
|
2550
|
+
'Z';
|
|
2551
|
+
},
|
|
2552
|
+
|
|
2553
|
+
/**
|
|
2554
|
+
* Pad a number with leading zero if needed
|
|
2555
|
+
* @param {number} number - Number to pad
|
|
2556
|
+
* @returns {string} Padded number
|
|
2557
|
+
*/
|
|
2558
|
+
pad(number) {
|
|
2559
|
+
return number < 10 ? '0' + number : String(number);
|
|
2560
|
+
}
|
|
2561
|
+
};
|
|
2562
|
+
|
|
2563
|
+
/**
|
|
2564
|
+
* AWS S3 request handler
|
|
2565
|
+
* Performs a signed request to AWS S3 using a signature obtained from the server
|
|
2566
|
+
*
|
|
2567
|
+
* @param {Object} upInfo - Upload info including bucket endpoint and key
|
|
2568
|
+
* @param {string} method - HTTP method (GET, POST, PUT)
|
|
2569
|
+
* @param {string} query - Query parameters
|
|
2570
|
+
* @param {*} body - Request body
|
|
2571
|
+
* @param {Object} headers - Request headers
|
|
2572
|
+
* @param {Object} context - Request context
|
|
2573
|
+
* @returns {Promise} - Request promise
|
|
2574
|
+
*/
|
|
2575
|
+
function awsReq(upInfo, method, query, body, headers, context) {
|
|
2576
|
+
headers = headers || {};
|
|
2577
|
+
context = context || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
|
|
2578
|
+
|
|
2579
|
+
// Calculate body hash for AWS signature
|
|
2580
|
+
let bodyHash;
|
|
2581
|
+
|
|
2582
|
+
if (!body || body === "") {
|
|
2583
|
+
// Empty body hash
|
|
2584
|
+
bodyHash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
|
|
2585
|
+
} else {
|
|
2586
|
+
try {
|
|
2587
|
+
// Handle different body types
|
|
2588
|
+
let bodyForHash = body;
|
|
2589
|
+
|
|
2590
|
+
if (body instanceof ArrayBuffer || (body.constructor && body.constructor.name === 'ArrayBuffer')) {
|
|
2591
|
+
bodyForHash = new Uint8Array(body);
|
|
2592
|
+
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (body.constructor && body.constructor.name === 'Buffer') {
|
|
2593
|
+
<span class="cstat-no" title="statement not covered" > bodyForHash = Buffer.from(body).toString();</span>
|
|
2594
|
+
}
|
|
2595
|
+
|
|
2596
|
+
bodyHash = sha256(bodyForHash);
|
|
2597
|
+
} catch (e) {
|
|
2598
|
+
<span class="cstat-no" title="statement not covered" > console.error("Error calculating hash:", e.message);</span>
|
|
2599
|
+
<span class="cstat-no" title="statement not covered" > bodyHash = "UNSIGNED-PAYLOAD";</span>
|
|
2600
|
+
}
|
|
2601
|
+
}
|
|
2602
|
+
|
|
2603
|
+
// Create AWS timestamp
|
|
2604
|
+
const timestamp = utils.getAmzTime();
|
|
2605
|
+
const datestamp = timestamp.substring(0, 8);
|
|
2606
|
+
|
|
2607
|
+
// Set AWS headers
|
|
2608
|
+
headers["X-Amz-Content-Sha256"] = bodyHash;
|
|
2609
|
+
headers["X-Amz-Date"] = timestamp;
|
|
2610
|
+
|
|
2611
|
+
// Prepare the string to sign
|
|
2612
|
+
const authStringParts = [
|
|
2613
|
+
"AWS4-HMAC-SHA256",
|
|
2614
|
+
timestamp,
|
|
2615
|
+
`${datestamp}/${upInfo.Bucket_Endpoint.Region}/s3/aws4_request`,
|
|
2616
|
+
method,
|
|
2617
|
+
`/${upInfo.Bucket_Endpoint.Name}/${upInfo.Key}`,
|
|
2618
|
+
query,
|
|
2619
|
+
`host:${upInfo.Bucket_Endpoint.Host}`
|
|
2620
|
+
];
|
|
2621
|
+
|
|
2622
|
+
// Add x-* headers to sign
|
|
2623
|
+
const headersToSign = ['host'];
|
|
2624
|
+
const sortedHeaderKeys = Object.keys(headers).sort();
|
|
2625
|
+
|
|
2626
|
+
for (const key of sortedHeaderKeys) {
|
|
2627
|
+
const lowerKey = key.toLowerCase();
|
|
2628
|
+
if (lowerKey.startsWith('x-')) {
|
|
2629
|
+
headersToSign.push(lowerKey);
|
|
2630
|
+
authStringParts.push(`${lowerKey}:${headers[key]}`);
|
|
2631
|
+
}
|
|
2632
|
+
}
|
|
2633
|
+
|
|
2634
|
+
// Complete the string to sign
|
|
2635
|
+
authStringParts.push('');
|
|
2636
|
+
authStringParts.push(headersToSign.join(';'));
|
|
2637
|
+
authStringParts.push(bodyHash);
|
|
2638
|
+
|
|
2639
|
+
return new Promise((resolve, reject) => {
|
|
2640
|
+
// Get signature from server
|
|
2641
|
+
rest.rest(
|
|
2642
|
+
`Cloud/Aws/Bucket/Upload/${upInfo.Cloud_Aws_Bucket_Upload__}:signV4`,
|
|
2643
|
+
"POST",
|
|
2644
|
+
{ headers: authStringParts.join("\n") },
|
|
2645
|
+
context
|
|
2646
|
+
)
|
|
2647
|
+
.then(response => {
|
|
2648
|
+
// Construct the S3 URL
|
|
2649
|
+
let url = `https://${upInfo.Bucket_Endpoint.Host}/${upInfo.Bucket_Endpoint.Name}/${upInfo.Key}`;
|
|
2650
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (query) url += `?${query}`;
|
|
2651
|
+
|
|
2652
|
+
// Add the authorization header
|
|
2653
|
+
headers["Authorization"] = response.data.authorization;
|
|
2654
|
+
|
|
2655
|
+
// Make the actual request to S3
|
|
2656
|
+
return utils.fetch(url, {
|
|
2657
|
+
method,
|
|
2658
|
+
body,
|
|
2659
|
+
headers
|
|
2660
|
+
});
|
|
2661
|
+
})
|
|
2662
|
+
.then(resolve)
|
|
2663
|
+
.catch(reject);
|
|
2664
|
+
});
|
|
2665
|
+
}
|
|
2666
|
+
|
|
2667
|
+
/**
|
|
2668
|
+
* Upload module (IIFE pattern)
|
|
2669
|
+
* @returns {Object} Upload interface
|
|
2670
|
+
*/
|
|
2671
|
+
module.exports.upload = (function () {
|
|
2672
|
+
/**
|
|
2673
|
+
* Upload state
|
|
2674
|
+
*/
|
|
2675
|
+
const state = {
|
|
2676
|
+
queue: [], // Queued uploads
|
|
2677
|
+
failed: [], // Failed uploads
|
|
2678
|
+
running: {}, // Currently processing uploads
|
|
2679
|
+
nextId: 0, // Next upload ID
|
|
2680
|
+
lastInput: null // Last created file input element (browser only)
|
|
2681
|
+
};
|
|
2682
|
+
|
|
2683
|
+
// Public API object
|
|
2684
|
+
const upload = {};
|
|
2685
|
+
|
|
2686
|
+
/**
|
|
2687
|
+
* Helper Functions
|
|
2688
|
+
*/
|
|
2689
|
+
|
|
2690
|
+
/**
|
|
2691
|
+
* Notify progress to listeners
|
|
2692
|
+
* Calls onprogress callback and dispatches events
|
|
2693
|
+
*/
|
|
2694
|
+
function sendProgress() {
|
|
2695
|
+
const status = upload.getStatus();
|
|
2696
|
+
|
|
2697
|
+
// Call the onprogress callback if defined
|
|
2698
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (typeof upload.onprogress === "function") {
|
|
2699
|
+
<span class="cstat-no" title="statement not covered" > upload.onprogress(status);</span>
|
|
2700
|
+
}
|
|
2701
|
+
|
|
2702
|
+
// Dispatch event for listeners
|
|
2703
|
+
utils.dispatchEvent("upload:progress", status);
|
|
2704
|
+
}
|
|
2705
|
+
|
|
2706
|
+
/**
|
|
2707
|
+
* Handle upload failure
|
|
2708
|
+
* @param {Object} up - Upload object
|
|
2709
|
+
* @param {*} error - Error data
|
|
2710
|
+
*/
|
|
2711
|
+
function <span class="fstat-no" title="function not covered" >handleFailure(</span>up, error) {
|
|
2712
|
+
// Skip if upload is no longer running
|
|
2713
|
+
<span class="cstat-no" title="statement not covered" > if (!(up.up_id in state.running)) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
2714
|
+
|
|
2715
|
+
// Check if already in failed list
|
|
2716
|
+
<span class="cstat-no" title="statement not covered" > for (const failedItem of state.failed) {</span>
|
|
2717
|
+
<span class="cstat-no" title="statement not covered" > if (failedItem.up_id === up.up_id) {</span>
|
|
2718
|
+
<span class="cstat-no" title="statement not covered" > return; </span>// Already recorded as failed
|
|
2719
|
+
}
|
|
2720
|
+
}
|
|
2721
|
+
|
|
2722
|
+
// Record failure
|
|
2723
|
+
<span class="cstat-no" title="statement not covered" > up.failure = error;</span>
|
|
2724
|
+
<span class="cstat-no" title="statement not covered" > state.failed.push(up);</span>
|
|
2725
|
+
<span class="cstat-no" title="statement not covered" > delete state.running[up.up_id];</span>
|
|
2726
|
+
|
|
2727
|
+
// Continue processing queue
|
|
2728
|
+
<span class="cstat-no" title="statement not covered" > upload.run();</span>
|
|
2729
|
+
|
|
2730
|
+
// Notify progress
|
|
2731
|
+
<span class="cstat-no" title="statement not covered" > sendProgress();</span>
|
|
2732
|
+
|
|
2733
|
+
// Dispatch failure event
|
|
2734
|
+
<span class="cstat-no" title="statement not covered" > utils.dispatchEvent("upload:failed", {</span>
|
|
2735
|
+
item: up,
|
|
2736
|
+
res: error
|
|
2737
|
+
});
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
/**
|
|
2741
|
+
* Process a pending upload
|
|
2742
|
+
* Initiates the upload process with the server
|
|
2743
|
+
* @param {Object} up - Upload object
|
|
2744
|
+
*/
|
|
2745
|
+
function processUpload(up) {
|
|
2746
|
+
// Mark as processing
|
|
2747
|
+
up.status = "pending-wip";
|
|
2748
|
+
|
|
2749
|
+
// Prepare parameters
|
|
2750
|
+
const params = up.params || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
|
|
2751
|
+
|
|
2752
|
+
// Set file metadata
|
|
2753
|
+
params.filename = up.file.name;
|
|
2754
|
+
params.size = up.file.size;
|
|
2755
|
+
params.lastModified = up.file.lastModified / 1000;
|
|
2756
|
+
params.type = up.file.type;
|
|
2757
|
+
|
|
2758
|
+
// Initialize upload with the server
|
|
2759
|
+
rest.rest(up.path, "POST", params, up.context)
|
|
2760
|
+
.then(function(response) {
|
|
2761
|
+
// Method 1: AWS signed multipart upload
|
|
2762
|
+
if (response.data.Cloud_Aws_Bucket_Upload__) {
|
|
2763
|
+
return handleAwsMultipartUpload(up, response.data);
|
|
2764
|
+
}
|
|
2765
|
+
|
|
2766
|
+
// Method 2: Direct PUT upload
|
|
2767
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (response.data.PUT) {
|
|
2768
|
+
return handlePutUpload(up, response.data);
|
|
2769
|
+
}
|
|
2770
|
+
|
|
2771
|
+
// Invalid response format
|
|
2772
|
+
<span class="cstat-no" title="statement not covered" > delete state.running[up.up_id];</span>
|
|
2773
|
+
<span class="cstat-no" title="statement not covered" > state.failed.push(up);</span>
|
|
2774
|
+
<span class="cstat-no" title="statement not covered" > up.reject(new Error('Invalid upload response format'));</span>
|
|
2775
|
+
})
|
|
2776
|
+
.catch(<span class="fstat-no" title="function not covered" >er</span>ror => <span class="cstat-no" title="statement not covered" >handleFailure(up, error))</span>;
|
|
2777
|
+
}
|
|
2778
|
+
|
|
2779
|
+
/**
|
|
2780
|
+
* Set up AWS multipart upload
|
|
2781
|
+
* @param {Object} up - Upload object
|
|
2782
|
+
* @param {Object} data - Server response data
|
|
2783
|
+
*/
|
|
2784
|
+
function handleAwsMultipartUpload(up, data) {
|
|
2785
|
+
// Store upload info
|
|
2786
|
+
up.info = data;
|
|
2787
|
+
|
|
2788
|
+
// Initialize multipart upload
|
|
2789
|
+
return awsReq(
|
|
2790
|
+
up.info,
|
|
2791
|
+
"POST",
|
|
2792
|
+
"uploads=",
|
|
2793
|
+
"",
|
|
2794
|
+
{"Content-Type": up.file.type, "X-Amz-Acl": "private"},
|
|
2795
|
+
up.context
|
|
2796
|
+
)
|
|
2797
|
+
.then(response => response.text())
|
|
2798
|
+
.then(str => utils.parseXML(str))
|
|
2799
|
+
.then(dom => dom.querySelector('UploadId').innerHTML)
|
|
2800
|
+
.then(uploadId => {
|
|
2801
|
+
up.uploadId = uploadId;
|
|
2802
|
+
|
|
2803
|
+
// Calculate optimal block size
|
|
2804
|
+
const fileSize = up.file.size;
|
|
2805
|
+
|
|
2806
|
+
// Target ~10k parts, but minimum 5MB per AWS requirements
|
|
2807
|
+
let blockSize = Math.ceil(fileSize / 10000);
|
|
2808
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (blockSize < 5242880) blockSize = 5242880;
|
|
2809
|
+
|
|
2810
|
+
// Set up upload parameters
|
|
2811
|
+
up.method = 'aws';
|
|
2812
|
+
up.bsize = blockSize;
|
|
2813
|
+
up.blocks = Math.ceil(fileSize / blockSize);
|
|
2814
|
+
up.b = {};
|
|
2815
|
+
up.status = 'uploading';
|
|
2816
|
+
|
|
2817
|
+
// Continue upload process
|
|
2818
|
+
upload.run();
|
|
2819
|
+
})
|
|
2820
|
+
.catch(<span class="fstat-no" title="function not covered" >er</span>ror => <span class="cstat-no" title="statement not covered" >handleFailure(up, error))</span>;
|
|
2821
|
+
}
|
|
2822
|
+
|
|
2823
|
+
/**
|
|
2824
|
+
* Set up direct PUT upload
|
|
2825
|
+
* @param {Object} up - Upload object
|
|
2826
|
+
* @param {Object} data - Server response data
|
|
2827
|
+
*/
|
|
2828
|
+
function handlePutUpload(up, data) {
|
|
2829
|
+
// Store upload info
|
|
2830
|
+
up.info = data;
|
|
2831
|
+
|
|
2832
|
+
// Calculate block size (if multipart PUT is supported)
|
|
2833
|
+
const fileSize = up.file.size;
|
|
2834
|
+
let blockSize = fileSize; // Default: single block
|
|
2835
|
+
|
|
2836
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (data.Blocksize) {
|
|
2837
|
+
// Server supports multipart upload
|
|
2838
|
+
blockSize = data.Blocksize;
|
|
2839
|
+
}
|
|
2840
|
+
|
|
2841
|
+
// Set up upload parameters
|
|
2842
|
+
up.method = 'put';
|
|
2843
|
+
up.bsize = blockSize;
|
|
2844
|
+
up.blocks = Math.ceil(fileSize / blockSize);
|
|
2845
|
+
up.b = {};
|
|
2846
|
+
up.status = 'uploading';
|
|
2847
|
+
|
|
2848
|
+
// Continue upload process
|
|
2849
|
+
upload.run();
|
|
2850
|
+
}
|
|
2851
|
+
|
|
2852
|
+
/**
|
|
2853
|
+
* Upload a single part of a file
|
|
2854
|
+
* Handles both AWS multipart and direct PUT methods
|
|
2855
|
+
* @param {Object} up - Upload object
|
|
2856
|
+
* @param {number} partNumber - Part number (0-based)
|
|
2857
|
+
*/
|
|
2858
|
+
function uploadPart(up, partNumber) {
|
|
2859
|
+
// Mark part as pending
|
|
2860
|
+
up.b[partNumber] = "pending";
|
|
2861
|
+
|
|
2862
|
+
// Calculate byte range for this part
|
|
2863
|
+
const startByte = partNumber * up.bsize;
|
|
2864
|
+
const endByte = Math.min(startByte + up.bsize, up.file.size);
|
|
2865
|
+
|
|
2866
|
+
// Get file slice based on environment
|
|
2867
|
+
let filePart;
|
|
2868
|
+
|
|
2869
|
+
if (env.isBrowser) {
|
|
2870
|
+
// Browser: use native File.slice
|
|
2871
|
+
filePart = up.file.slice(startByte, endByte);
|
|
2872
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (env.isNode) {</span>
|
|
2873
|
+
// Node.js: create a reference with start/end positions
|
|
2874
|
+
<span class="cstat-no" title="statement not covered" > filePart = {</span>
|
|
2875
|
+
path: up.file.path,
|
|
2876
|
+
start: startByte,
|
|
2877
|
+
end: endByte,
|
|
2878
|
+
type: up.file.type,
|
|
2879
|
+
content: up.file.content // For memory buffer based files
|
|
2880
|
+
};
|
|
2881
|
+
} else {
|
|
2882
|
+
<span class="cstat-no" title="statement not covered" > handleFailure(up, new Error('Environment not supported'));</span>
|
|
2883
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2884
|
+
}
|
|
2885
|
+
|
|
2886
|
+
// Read the file part as ArrayBuffer
|
|
2887
|
+
utils.readFileAsArrayBuffer(filePart, (arrayBuffer, error) => {
|
|
2888
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (error) {
|
|
2889
|
+
<span class="cstat-no" title="statement not covered" > handleFailure(up, error);</span>
|
|
2890
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2891
|
+
}
|
|
2892
|
+
|
|
2893
|
+
// Choose upload method based on protocol
|
|
2894
|
+
if (up.method === 'aws') {
|
|
2895
|
+
uploadAwsPart(up, partNumber, arrayBuffer);
|
|
2896
|
+
} else if (up.method === 'put') {
|
|
2897
|
+
uploadPutPart(up, partNumber, startByte, arrayBuffer);
|
|
2898
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
|
|
2899
|
+
<span class="cstat-no" title="statement not covered" > handleFailure(up, new Error(`Unknown upload method: ${up.method}`));</span>
|
|
2900
|
+
}
|
|
2901
|
+
});
|
|
2902
|
+
}
|
|
2903
|
+
|
|
2904
|
+
/**
|
|
2905
|
+
* Upload a part using AWS multipart upload
|
|
2906
|
+
* @param {Object} up - Upload object
|
|
2907
|
+
* @param {number} partNumber - Part number (0-based)
|
|
2908
|
+
* @param {ArrayBuffer} data - Part data
|
|
2909
|
+
*/
|
|
2910
|
+
function uploadAwsPart(up, partNumber, data) {
|
|
2911
|
+
// AWS part numbers are 1-based
|
|
2912
|
+
const awsPartNumber = partNumber + 1;
|
|
2913
|
+
|
|
2914
|
+
awsReq(
|
|
2915
|
+
up.info,
|
|
2916
|
+
"PUT",
|
|
2917
|
+
`partNumber=${awsPartNumber}&uploadId=${up.uploadId}`,
|
|
2918
|
+
data,
|
|
2919
|
+
null,
|
|
2920
|
+
up.context
|
|
2921
|
+
)
|
|
2922
|
+
.then(response => {
|
|
2923
|
+
// Store ETag for this part (needed for completion)
|
|
2924
|
+
up.b[partNumber] = response.headers.get("ETag");
|
|
2925
|
+
|
|
2926
|
+
// Update progress and continue processing
|
|
2927
|
+
sendProgress();
|
|
2928
|
+
upload.run();
|
|
2929
|
+
})
|
|
2930
|
+
.catch(<span class="fstat-no" title="function not covered" >er</span>ror => <span class="cstat-no" title="statement not covered" >handleFailure(up, error))</span>;
|
|
2931
|
+
}
|
|
2932
|
+
|
|
2933
|
+
/**
|
|
2934
|
+
* Upload a part using direct PUT
|
|
2935
|
+
* @param {Object} up - Upload object
|
|
2936
|
+
* @param {number} partNumber - Part number (0-based)
|
|
2937
|
+
* @param {number} startByte - Starting byte position
|
|
2938
|
+
* @param {ArrayBuffer} data - Part data
|
|
2939
|
+
*/
|
|
2940
|
+
function uploadPutPart(up, partNumber, startByte, data) {
|
|
2941
|
+
// Set up headers
|
|
2942
|
+
const headers = {
|
|
2943
|
+
"Content-Type": up.file.type
|
|
2944
|
+
};
|
|
2945
|
+
|
|
2946
|
+
// Add Content-Range header for multipart PUT
|
|
2947
|
+
if (up.blocks > 1) {
|
|
2948
|
+
const endByte = startByte + data.byteLength - 1; // inclusive
|
|
2949
|
+
headers["Content-Range"] = `bytes ${startByte}-${endByte}/*`;
|
|
2950
|
+
}
|
|
2951
|
+
|
|
2952
|
+
// Perform the PUT request
|
|
2953
|
+
utils.fetch(up.info.PUT, {
|
|
2954
|
+
method: "PUT",
|
|
2955
|
+
body: data,
|
|
2956
|
+
headers: headers,
|
|
2957
|
+
})
|
|
2958
|
+
.then(response => {
|
|
2959
|
+
// Mark part as done
|
|
2960
|
+
up.b[partNumber] = "done";
|
|
2961
|
+
|
|
2962
|
+
// Update progress and continue processing
|
|
2963
|
+
sendProgress();
|
|
2964
|
+
upload.run();
|
|
2965
|
+
})
|
|
2966
|
+
.catch(<span class="fstat-no" title="function not covered" >er</span>ror => <span class="cstat-no" title="statement not covered" >handleFailure(up, error))</span>;
|
|
2967
|
+
}
|
|
2968
|
+
|
|
2969
|
+
|
|
2970
|
+
/**
|
|
2971
|
+
* Process an upload in progress
|
|
2972
|
+
* Manages uploading parts and completing the upload
|
|
2973
|
+
* @param {Object} up - Upload object
|
|
2974
|
+
*/
|
|
2975
|
+
function processActiveUpload(up) {
|
|
2976
|
+
// Skip if paused or canceled
|
|
2977
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (up.paused || up.canceled) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
2978
|
+
|
|
2979
|
+
// Track upload progress
|
|
2980
|
+
let pendingParts = 0;
|
|
2981
|
+
let completedParts = 0;
|
|
2982
|
+
|
|
2983
|
+
// Process each part
|
|
2984
|
+
for (let i = 0; i < up.blocks; i++) {
|
|
2985
|
+
if (up.b[i] === undefined) {
|
|
2986
|
+
// Part not started yet
|
|
2987
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (up.paused) <span class="cstat-no" title="statement not covered" >break; </span>// Don't start new parts when paused
|
|
2988
|
+
|
|
2989
|
+
// Start uploading this part
|
|
2990
|
+
uploadPart(up, i);
|
|
2991
|
+
pendingParts++;
|
|
2992
|
+
} else if (up.b[i] !== "pending") {
|
|
2993
|
+
// Part completed
|
|
2994
|
+
completedParts++;
|
|
2995
|
+
continue;
|
|
2996
|
+
} else {
|
|
2997
|
+
// Part in progress
|
|
2998
|
+
pendingParts++;
|
|
2999
|
+
}
|
|
3000
|
+
|
|
3001
|
+
// Limit concurrent uploads
|
|
3002
|
+
if (pendingParts >= 3) break;
|
|
3003
|
+
}
|
|
3004
|
+
|
|
3005
|
+
// Update upload progress
|
|
3006
|
+
up.done = completedParts;
|
|
3007
|
+
|
|
3008
|
+
// Check if all parts are complete
|
|
3009
|
+
if (pendingParts === 0) {
|
|
3010
|
+
// All parts complete, finalize the upload
|
|
3011
|
+
up.status = "validating";
|
|
3012
|
+
|
|
3013
|
+
if (up.method === 'aws') {
|
|
3014
|
+
completeAwsUpload(up);
|
|
3015
|
+
} else <span class="missing-if-branch" title="else path not taken" >E</span>if (up.method === 'put') {
|
|
3016
|
+
completePutUpload(up);
|
|
3017
|
+
}
|
|
3018
|
+
}
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
/**
|
|
3022
|
+
* Complete AWS multipart upload
|
|
3023
|
+
* @param {Object} up - Upload object
|
|
3024
|
+
*/
|
|
3025
|
+
function completeAwsUpload(up) {
|
|
3026
|
+
// Create completion XML
|
|
3027
|
+
// See: https://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html
|
|
3028
|
+
let xml = "<CompleteMultipartUpload>";
|
|
3029
|
+
|
|
3030
|
+
for (let i = 0; i < up.blocks; i++) {
|
|
3031
|
+
// AWS part numbers are 1-based
|
|
3032
|
+
xml += `<Part><PartNumber>${i + 1}</PartNumber><ETag>${up.b[i]}</ETag></Part>`;
|
|
3033
|
+
}
|
|
3034
|
+
|
|
3035
|
+
xml += "</CompleteMultipartUpload>";
|
|
3036
|
+
|
|
3037
|
+
// Send completion request
|
|
3038
|
+
awsReq(up.info, "POST", `uploadId=${up.uploadId}`, xml, null, up.context)
|
|
3039
|
+
.then(response => response.text())
|
|
3040
|
+
.then(() => {
|
|
3041
|
+
// Call server-side completion handler
|
|
3042
|
+
return rest.rest(
|
|
3043
|
+
`Cloud/Aws/Bucket/Upload/${up.info.Cloud_Aws_Bucket_Upload__}:handleComplete`,
|
|
3044
|
+
"POST",
|
|
3045
|
+
{},
|
|
3046
|
+
up.context
|
|
3047
|
+
);
|
|
3048
|
+
})
|
|
3049
|
+
.then(response => {
|
|
3050
|
+
// Mark upload as complete
|
|
3051
|
+
up.status = "complete";
|
|
3052
|
+
up.final = response.data;
|
|
3053
|
+
|
|
3054
|
+
// Notify listeners
|
|
3055
|
+
sendProgress();
|
|
3056
|
+
|
|
3057
|
+
// Remove from running uploads
|
|
3058
|
+
delete state.running[up.up_id];
|
|
3059
|
+
|
|
3060
|
+
// Resolve the upload promise
|
|
3061
|
+
up.resolve(up);
|
|
3062
|
+
|
|
3063
|
+
// Continue processing queue
|
|
3064
|
+
upload.run();
|
|
3065
|
+
})
|
|
3066
|
+
.catch(<span class="fstat-no" title="function not covered" >er</span>ror => <span class="cstat-no" title="statement not covered" >handleFailure(up, error))</span>;
|
|
3067
|
+
}
|
|
3068
|
+
|
|
3069
|
+
/**
|
|
3070
|
+
* Complete direct PUT upload
|
|
3071
|
+
* @param {Object} up - Upload object
|
|
3072
|
+
*/
|
|
3073
|
+
function completePutUpload(up) {
|
|
3074
|
+
// Call completion endpoint
|
|
3075
|
+
rest.rest(up.info.Complete, "POST", {}, up.context)
|
|
3076
|
+
.then(response => {
|
|
3077
|
+
// Mark upload as complete
|
|
3078
|
+
up.status = "complete";
|
|
3079
|
+
up.final = response.data;
|
|
3080
|
+
|
|
3081
|
+
// Notify listeners
|
|
3082
|
+
sendProgress();
|
|
3083
|
+
|
|
3084
|
+
// Remove from running uploads
|
|
3085
|
+
delete state.running[up.up_id];
|
|
3086
|
+
|
|
3087
|
+
// Resolve the upload promise
|
|
3088
|
+
up.resolve(up);
|
|
3089
|
+
|
|
3090
|
+
// Continue processing queue
|
|
3091
|
+
upload.run();
|
|
3092
|
+
})
|
|
3093
|
+
.catch(<span class="fstat-no" title="function not covered" >er</span>ror => <span class="cstat-no" title="statement not covered" >handleFailure(up, error))</span>;
|
|
3094
|
+
}
|
|
3095
|
+
|
|
3096
|
+
/**
|
|
3097
|
+
* Fill the upload queue with new upload tasks
|
|
3098
|
+
* Takes items from the queue and adds them to running uploads
|
|
3099
|
+
*/
|
|
3100
|
+
function fillUploadQueue() {
|
|
3101
|
+
// Skip if we're already running the maximum number of uploads
|
|
3102
|
+
if (Object.keys(state.running).length >= 3) return;
|
|
3103
|
+
|
|
3104
|
+
// Maximum of 3 concurrent uploads
|
|
3105
|
+
while (Object.keys(state.running).length < 3 && state.queue.length > 0) {
|
|
3106
|
+
// Get next upload from queue
|
|
3107
|
+
const upload = state.queue.shift();
|
|
3108
|
+
|
|
3109
|
+
// Add to running uploads
|
|
3110
|
+
state.running[upload.up_id] = upload;
|
|
3111
|
+
}
|
|
3112
|
+
|
|
3113
|
+
// Notify progress
|
|
3114
|
+
sendProgress();
|
|
3115
|
+
}
|
|
3116
|
+
|
|
3117
|
+
// No need for backward compatibility for private methods
|
|
3118
|
+
|
|
3119
|
+
/**
|
|
3120
|
+
* Get current upload status
|
|
3121
|
+
* @returns {Object} Status object with queued, running and failed uploads
|
|
3122
|
+
*/
|
|
3123
|
+
upload.getStatus = function() {
|
|
3124
|
+
return {
|
|
3125
|
+
queue: state.queue,
|
|
3126
|
+
running: Object.keys(state.running).map(id => state.running[id]),
|
|
3127
|
+
failed: state.failed
|
|
3128
|
+
};
|
|
3129
|
+
};
|
|
3130
|
+
|
|
3131
|
+
/**
|
|
3132
|
+
* Resume all failed uploads
|
|
3133
|
+
* Moves failed uploads back to the queue
|
|
3134
|
+
*/
|
|
3135
|
+
upload.resume = <span class="fstat-no" title="function not covered" >fu</span>nction() {
|
|
3136
|
+
// Move all failed uploads back to the queue
|
|
3137
|
+
<span class="cstat-no" title="statement not covered" > while (state.failed.length > 0) {</span>
|
|
3138
|
+
<span class="cstat-no" title="statement not covered" > state.queue.push(state.failed.shift());</span>
|
|
3139
|
+
}
|
|
3140
|
+
|
|
3141
|
+
// Restart upload process
|
|
3142
|
+
<span class="cstat-no" title="statement not covered" > upload.run();</span>
|
|
3143
|
+
};
|
|
3144
|
+
|
|
3145
|
+
// Environment-specific initialization
|
|
3146
|
+
upload.init = <span class="fstat-no" title="function not covered" >fu</span>nction (path, params, notify) {
|
|
3147
|
+
// perform upload to a given API, for example Drive/Item/<id>:upload
|
|
3148
|
+
// will allow multiple files to be uploaded
|
|
3149
|
+
<span class="cstat-no" title="statement not covered" > params = params || {};</span>
|
|
3150
|
+
|
|
3151
|
+
<span class="cstat-no" title="statement not covered" > if (isBrowser) {</span>
|
|
3152
|
+
// Browser implementation
|
|
3153
|
+
<span class="cstat-no" title="statement not covered" > if (last_input != null) {</span>
|
|
3154
|
+
<span class="cstat-no" title="statement not covered" > last_input.parentNode.removeChild(last_input);</span>
|
|
3155
|
+
<span class="cstat-no" title="statement not covered" > last_input = null;</span>
|
|
3156
|
+
}
|
|
3157
|
+
|
|
3158
|
+
var input = <span class="cstat-no" title="statement not covered" >document.createElement("input");</span>
|
|
3159
|
+
<span class="cstat-no" title="statement not covered" > input.type = "file";</span>
|
|
3160
|
+
<span class="cstat-no" title="statement not covered" > input.style.display = "none";</span>
|
|
3161
|
+
<span class="cstat-no" title="statement not covered" > if (!params["single"]) {</span>
|
|
3162
|
+
<span class="cstat-no" title="statement not covered" > input.multiple = "multiple";</span>
|
|
3163
|
+
}
|
|
3164
|
+
|
|
3165
|
+
<span class="cstat-no" title="statement not covered" > document.getElementsByTagName('body')[0].appendChild(input);</span>
|
|
3166
|
+
<span class="cstat-no" title="statement not covered" > last_input = input;</span>
|
|
3167
|
+
|
|
3168
|
+
var promise = <span class="cstat-no" title="statement not covered" >new Promise(<span class="fstat-no" title="function not covered" >fu</span>nction (resolve, reject) {</span>
|
|
3169
|
+
<span class="cstat-no" title="statement not covered" > input.onchange = <span class="fstat-no" title="function not covered" >fu</span>nction () {</span>
|
|
3170
|
+
<span class="cstat-no" title="statement not covered" > if (this.files.length == 0) {</span>
|
|
3171
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
3172
|
+
}
|
|
3173
|
+
|
|
3174
|
+
var count = <span class="cstat-no" title="statement not covered" >this.files.length;</span>
|
|
3175
|
+
<span class="cstat-no" title="statement not covered" > if (notify !== undefined) <span class="cstat-no" title="statement not covered" >notify({status: 'init', count: count});</span></span>
|
|
3176
|
+
<span class="cstat-no" title="statement not covered" > for (var i = <span class="cstat-no" title="statement not covered" >0;</span> i < this.files.length; i++) {</span>
|
|
3177
|
+
<span class="cstat-no" title="statement not covered" > upload.append(path, this.files[i], params, fwWrapper.getContext()).then(<span class="fstat-no" title="function not covered" >fu</span>nction (obj) {</span>
|
|
3178
|
+
<span class="cstat-no" title="statement not covered" > count -= 1;</span>
|
|
3179
|
+
// Todo notify process
|
|
3180
|
+
<span class="cstat-no" title="statement not covered" > if (notify !== undefined) <span class="cstat-no" title="statement not covered" >notify(obj);</span></span>
|
|
3181
|
+
<span class="cstat-no" title="statement not covered" > if (count == 0) <span class="cstat-no" title="statement not covered" >resolve();</span></span>
|
|
3182
|
+
});
|
|
3183
|
+
}
|
|
3184
|
+
<span class="cstat-no" title="statement not covered" > upload.run();</span>
|
|
3185
|
+
};
|
|
3186
|
+
});
|
|
3187
|
+
|
|
3188
|
+
<span class="cstat-no" title="statement not covered" > input.click();</span>
|
|
3189
|
+
<span class="cstat-no" title="statement not covered" > return promise;</span>
|
|
3190
|
+
} else <span class="cstat-no" title="statement not covered" >if (isNode) {</span>
|
|
3191
|
+
// Node.js implementation
|
|
3192
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >fu</span>nction(filePaths) {</span>
|
|
3193
|
+
// Convert string to array if single file path provided
|
|
3194
|
+
<span class="cstat-no" title="statement not covered" > if (typeof filePaths === 'string') {</span>
|
|
3195
|
+
<span class="cstat-no" title="statement not covered" > filePaths = [filePaths];</span>
|
|
3196
|
+
}
|
|
3197
|
+
|
|
3198
|
+
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(filePaths)) {</span>
|
|
3199
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('filePaths must be a string or array of strings');</span>
|
|
3200
|
+
}
|
|
3201
|
+
|
|
3202
|
+
<span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >fu</span>nction(resolve, reject) {</span>
|
|
3203
|
+
const count = <span class="cstat-no" title="statement not covered" >filePaths.length;</span>
|
|
3204
|
+
<span class="cstat-no" title="statement not covered" > if (count === 0) {</span>
|
|
3205
|
+
<span class="cstat-no" title="statement not covered" > return resolve();</span>
|
|
3206
|
+
}
|
|
3207
|
+
|
|
3208
|
+
<span class="cstat-no" title="statement not covered" > if (notify !== undefined) <span class="cstat-no" title="statement not covered" >notify({status: 'init', count: count});</span></span>
|
|
3209
|
+
|
|
3210
|
+
let remainingCount = <span class="cstat-no" title="statement not covered" >count;</span>
|
|
3211
|
+
|
|
3212
|
+
<span class="cstat-no" title="statement not covered" > filePaths.forEach(<span class="fstat-no" title="function not covered" >fi</span>lePath => {</span>
|
|
3213
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3214
|
+
// Get file info
|
|
3215
|
+
const stats = <span class="cstat-no" title="statement not covered" >nodeFs.statSync(filePath);</span>
|
|
3216
|
+
const fileName = <span class="cstat-no" title="statement not covered" >nodePath.basename(filePath);</span>
|
|
3217
|
+
|
|
3218
|
+
// Create a file-like object
|
|
3219
|
+
const file = <span class="cstat-no" title="statement not covered" >{</span>
|
|
3220
|
+
name: fileName,
|
|
3221
|
+
size: stats.size,
|
|
3222
|
+
lastModified: stats.mtimeMs,
|
|
3223
|
+
type: 'application/octet-stream', // Default type
|
|
3224
|
+
path: filePath, // For Node.js reading
|
|
3225
|
+
// Mock methods needed by upload.js
|
|
3226
|
+
slice: <span class="fstat-no" title="function not covered" >fu</span>nction(start, end) {
|
|
3227
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
3228
|
+
path: filePath,
|
|
3229
|
+
start: start,
|
|
3230
|
+
end: end || stats.size
|
|
3231
|
+
};
|
|
3232
|
+
}
|
|
3233
|
+
};
|
|
3234
|
+
|
|
3235
|
+
<span class="cstat-no" title="statement not covered" > upload.append(path, file, params, fwWrapper.getContext())</span>
|
|
3236
|
+
.then(<span class="fstat-no" title="function not covered" >fu</span>nction(obj) {
|
|
3237
|
+
<span class="cstat-no" title="statement not covered" > remainingCount -= 1;</span>
|
|
3238
|
+
<span class="cstat-no" title="statement not covered" > if (notify !== undefined) <span class="cstat-no" title="statement not covered" >notify(obj);</span></span>
|
|
3239
|
+
<span class="cstat-no" title="statement not covered" > if (remainingCount === 0) <span class="cstat-no" title="statement not covered" >resolve();</span></span>
|
|
3240
|
+
})
|
|
3241
|
+
.catch(<span class="fstat-no" title="function not covered" >fu</span>nction(err) {
|
|
3242
|
+
<span class="cstat-no" title="statement not covered" > remainingCount -= 1;</span>
|
|
3243
|
+
<span class="cstat-no" title="statement not covered" > console.error('Error uploading file:', err);</span>
|
|
3244
|
+
<span class="cstat-no" title="statement not covered" > if (remainingCount === 0) <span class="cstat-no" title="statement not covered" >resolve();</span></span>
|
|
3245
|
+
});
|
|
3246
|
+
} catch (err) {
|
|
3247
|
+
<span class="cstat-no" title="statement not covered" > remainingCount -= 1;</span>
|
|
3248
|
+
<span class="cstat-no" title="statement not covered" > console.error('Error processing file:', err);</span>
|
|
3249
|
+
<span class="cstat-no" title="statement not covered" > if (remainingCount === 0) <span class="cstat-no" title="statement not covered" >resolve();</span></span>
|
|
3250
|
+
}
|
|
3251
|
+
});
|
|
3252
|
+
|
|
3253
|
+
<span class="cstat-no" title="statement not covered" > upload.run();</span>
|
|
3254
|
+
});
|
|
3255
|
+
};
|
|
3256
|
+
} else {
|
|
3257
|
+
// Default implementation for other environments
|
|
3258
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >fu</span>nction() {</span>
|
|
3259
|
+
<span class="cstat-no" title="statement not covered" > return Promise.reject(new Error('File upload not supported in this environment'));</span>
|
|
3260
|
+
};
|
|
3261
|
+
}
|
|
3262
|
+
};
|
|
3263
|
+
|
|
3264
|
+
|
|
3265
|
+
/**
|
|
3266
|
+
* Add a file to the upload queue
|
|
3267
|
+
* @param {string} path - API path to upload to
|
|
3268
|
+
* @param {File|Object} file - File to upload
|
|
3269
|
+
* @param {Object} params - Upload parameters
|
|
3270
|
+
* @param {Object} context - Request context
|
|
3271
|
+
* @returns {Promise} - Upload promise
|
|
3272
|
+
*/
|
|
3273
|
+
upload.append = function(path, file, params, context) {
|
|
3274
|
+
return new Promise((resolve, reject) => {
|
|
3275
|
+
// Process parameters
|
|
3276
|
+
params = params || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
|
|
3277
|
+
context = context || fwWrapper.getContext();
|
|
3278
|
+
|
|
3279
|
+
// Create an upload object
|
|
3280
|
+
const uploadObject = {
|
|
3281
|
+
path: path,
|
|
3282
|
+
file: file,
|
|
3283
|
+
resolve: resolve,
|
|
3284
|
+
reject: reject,
|
|
3285
|
+
status: "pending",
|
|
3286
|
+
paused: false,
|
|
3287
|
+
up_id: state.nextId++,
|
|
3288
|
+
params: params,
|
|
3289
|
+
context: { ...context } // Create a copy to avoid modification
|
|
3290
|
+
};
|
|
3291
|
+
|
|
3292
|
+
// Add to queue
|
|
3293
|
+
state.queue.push(uploadObject);
|
|
3294
|
+
});
|
|
3295
|
+
};
|
|
3296
|
+
|
|
3297
|
+
|
|
3298
|
+
/**
|
|
3299
|
+
* Cancel an upload in progress or in queue
|
|
3300
|
+
* @param {number} uploadId - Upload ID to cancel
|
|
3301
|
+
*/
|
|
3302
|
+
upload.cancelItem = function(uploadId) {
|
|
3303
|
+
// Check running uploads
|
|
3304
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (state.running[uploadId]) {
|
|
3305
|
+
// Mark running upload as canceled
|
|
3306
|
+
<span class="cstat-no" title="statement not covered" > state.running[uploadId].canceled = true;</span>
|
|
3307
|
+
} else {
|
|
3308
|
+
// Check queued uploads
|
|
3309
|
+
for (let i = 0; i < state.queue.length; i++) {
|
|
3310
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (state.queue[i].up_id === uploadId) {
|
|
3311
|
+
state.queue[i].canceled = true;
|
|
3312
|
+
break;
|
|
3313
|
+
}
|
|
3314
|
+
}
|
|
3315
|
+
}
|
|
3316
|
+
|
|
3317
|
+
// Update progress
|
|
3318
|
+
sendProgress();
|
|
3319
|
+
};
|
|
3320
|
+
|
|
3321
|
+
/**
|
|
3322
|
+
* Delete an upload from queue or failed list
|
|
3323
|
+
* Only canceled uploads can be removed from running list
|
|
3324
|
+
* @param {number} uploadId - Upload ID to delete
|
|
3325
|
+
*/
|
|
3326
|
+
upload.deleteItem = <span class="fstat-no" title="function not covered" >fu</span>nction(uploadId) {
|
|
3327
|
+
// Check running uploads
|
|
3328
|
+
<span class="cstat-no" title="statement not covered" > if (state.running[uploadId]) {</span>
|
|
3329
|
+
// Only delete if canceled
|
|
3330
|
+
<span class="cstat-no" title="statement not covered" > if (state.running[uploadId].canceled) {</span>
|
|
3331
|
+
<span class="cstat-no" title="statement not covered" > delete state.running[uploadId];</span>
|
|
3332
|
+
}
|
|
3333
|
+
} else {
|
|
3334
|
+
// Check queue
|
|
3335
|
+
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i < state.queue.length; i++) {</span>
|
|
3336
|
+
<span class="cstat-no" title="statement not covered" > if (state.queue[i].up_id === uploadId) {</span>
|
|
3337
|
+
<span class="cstat-no" title="statement not covered" > state.queue.splice(i, 1);</span>
|
|
3338
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3339
|
+
}
|
|
3340
|
+
}
|
|
3341
|
+
|
|
3342
|
+
// Check failed uploads
|
|
3343
|
+
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i < state.failed.length; i++) {</span>
|
|
3344
|
+
<span class="cstat-no" title="statement not covered" > if (state.failed[i].up_id === uploadId) {</span>
|
|
3345
|
+
<span class="cstat-no" title="statement not covered" > state.failed.splice(i, 1);</span>
|
|
3346
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3347
|
+
}
|
|
3348
|
+
}
|
|
3349
|
+
}
|
|
3350
|
+
|
|
3351
|
+
// Update progress
|
|
3352
|
+
<span class="cstat-no" title="statement not covered" > sendProgress();</span>
|
|
3353
|
+
};
|
|
3354
|
+
|
|
3355
|
+
/**
|
|
3356
|
+
* Pause an active upload
|
|
3357
|
+
* @param {number} uploadId - Upload ID to pause
|
|
3358
|
+
*/
|
|
3359
|
+
upload.pauseItem = function(uploadId) {
|
|
3360
|
+
// Find upload in running list
|
|
3361
|
+
const upload = state.running[uploadId];
|
|
3362
|
+
|
|
3363
|
+
// Only pause if active
|
|
3364
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (upload && upload.status === "uploading") {
|
|
3365
|
+
upload.paused = true;
|
|
3366
|
+
}
|
|
3367
|
+
|
|
3368
|
+
// Update progress
|
|
3369
|
+
sendProgress();
|
|
3370
|
+
};
|
|
3371
|
+
|
|
3372
|
+
/**
|
|
3373
|
+
* Resume a paused upload
|
|
3374
|
+
* @param {number} uploadId - Upload ID to resume
|
|
3375
|
+
*/
|
|
3376
|
+
upload.resumeItem = function(uploadId) {
|
|
3377
|
+
// Find upload in running list
|
|
3378
|
+
const upload = state.running[uploadId];
|
|
3379
|
+
|
|
3380
|
+
// Only resume if paused
|
|
3381
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (upload && upload.paused) {
|
|
3382
|
+
upload.paused = false;
|
|
3383
|
+
processActiveUpload(upload);
|
|
3384
|
+
}
|
|
3385
|
+
|
|
3386
|
+
// Update progress
|
|
3387
|
+
sendProgress();
|
|
3388
|
+
};
|
|
3389
|
+
|
|
3390
|
+
/**
|
|
3391
|
+
* Retry a failed upload
|
|
3392
|
+
* @param {number} uploadId - Upload ID to retry
|
|
3393
|
+
*/
|
|
3394
|
+
upload.retryItem = function(uploadId) {
|
|
3395
|
+
// Find upload in failed list
|
|
3396
|
+
let failedUpload = null;
|
|
3397
|
+
let failedIndex = -1;
|
|
3398
|
+
|
|
3399
|
+
for (let i = 0; i < state.failed.length; i++) {
|
|
3400
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (state.failed[i].up_id === uploadId) {
|
|
3401
|
+
failedUpload = state.failed[i];
|
|
3402
|
+
failedIndex = i;
|
|
3403
|
+
break;
|
|
3404
|
+
}
|
|
3405
|
+
}
|
|
3406
|
+
|
|
3407
|
+
// Skip if not found
|
|
3408
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!failedUpload) <span class="cstat-no" title="statement not covered" >return;</span>
|
|
3409
|
+
|
|
3410
|
+
// Check if already in queue
|
|
3411
|
+
for (let i = 0; i < state.queue.length; i++) {
|
|
3412
|
+
<span class="cstat-no" title="statement not covered" > if (state.queue[i].up_id === uploadId) {</span>
|
|
3413
|
+
<span class="cstat-no" title="statement not covered" > return; </span>// Already in queue
|
|
3414
|
+
}
|
|
3415
|
+
}
|
|
3416
|
+
|
|
3417
|
+
// Reset failure data
|
|
3418
|
+
failedUpload.failure = {};
|
|
3419
|
+
|
|
3420
|
+
// Reset pending parts
|
|
3421
|
+
for (let i = 0; i < failedUpload.blocks; i++) {
|
|
3422
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (failedUpload.b[i] === "pending") {
|
|
3423
|
+
failedUpload.b[i] = undefined;
|
|
3424
|
+
}
|
|
3425
|
+
}
|
|
3426
|
+
|
|
3427
|
+
// Move from failed to queue
|
|
3428
|
+
state.failed.splice(failedIndex, 1);
|
|
3429
|
+
state.queue.push(failedUpload);
|
|
3430
|
+
|
|
3431
|
+
// Restart upload
|
|
3432
|
+
upload.run();
|
|
3433
|
+
|
|
3434
|
+
// Dispatch retry event
|
|
3435
|
+
utils.dispatchEvent("upload:retry", { item: failedUpload });
|
|
3436
|
+
|
|
3437
|
+
// Update progress
|
|
3438
|
+
sendProgress();
|
|
3439
|
+
};
|
|
3440
|
+
|
|
3441
|
+
|
|
3442
|
+
/**
|
|
3443
|
+
* Start or continue the upload process
|
|
3444
|
+
* Processes queued uploads and continues running uploads
|
|
3445
|
+
*/
|
|
3446
|
+
upload.run = function() {
|
|
3447
|
+
// Fill queue with new uploads
|
|
3448
|
+
fillUploadQueue();
|
|
3449
|
+
|
|
3450
|
+
// Process running uploads
|
|
3451
|
+
for (const uploadId in state.running) {
|
|
3452
|
+
const upload = state.running[uploadId];
|
|
3453
|
+
|
|
3454
|
+
// Process based on status
|
|
3455
|
+
switch (upload.status) {
|
|
3456
|
+
case "pending":
|
|
3457
|
+
processUpload(upload);
|
|
3458
|
+
break;
|
|
3459
|
+
case "uploading":
|
|
3460
|
+
processActiveUpload(upload);
|
|
3461
|
+
break;
|
|
3462
|
+
}
|
|
3463
|
+
}
|
|
3464
|
+
};
|
|
3465
|
+
|
|
3466
|
+
return upload;
|
|
3467
|
+
}());
|
|
3468
|
+
</pre></td></tr></table></pre>
|
|
3469
|
+
|
|
3470
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
3471
|
+
</div><!-- /wrapper -->
|
|
3472
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
3473
|
+
Code coverage generated by
|
|
3474
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3475
|
+
at 2025-03-16T00:48:14.583Z
|
|
3476
|
+
</div>
|
|
3477
|
+
<script src="../prettify.js"></script>
|
|
3478
|
+
<script>
|
|
3479
|
+
window.onload = function () {
|
|
3480
|
+
prettyPrint();
|
|
3481
|
+
};
|
|
3482
|
+
</script>
|
|
3483
|
+
<script src="../sorter.js"></script>
|
|
3484
|
+
<script src="../block-navigation.js"></script>
|
|
3485
|
+
</body>
|
|
3486
|
+
</html>
|
|
3487
|
+
|