@spooky-sync/core 0.0.1-canary.239 → 0.0.1-canary.240
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/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +476 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/boot/auth-flip.saga.ts.html +271 -0
- package/coverage/lcov-report/src/boot/boot.saga.ts.html +469 -0
- package/coverage/lcov-report/src/boot/bucket-switch.saga.ts.html +430 -0
- package/coverage/lcov-report/src/boot/index.html +161 -0
- package/coverage/lcov-report/src/boot/preload.saga.ts.html +178 -0
- package/coverage/lcov-report/src/client/bucket-handle.ts.html +766 -0
- package/coverage/lcov-report/src/client/index.html +161 -0
- package/coverage/lcov-report/src/client/router.ts.html +367 -0
- package/coverage/lcov-report/src/client/runtime.ts.html +940 -0
- package/coverage/lcov-report/src/client/sp00ky-client.ts.html +1531 -0
- package/coverage/lcov-report/src/events/index.html +116 -0
- package/coverage/lcov-report/src/events/index.ts.html +877 -0
- package/coverage/lcov-report/src/index.html +146 -0
- package/coverage/lcov-report/src/index.ts.html +202 -0
- package/coverage/lcov-report/src/kernel/constants.ts.html +247 -0
- package/coverage/lcov-report/src/kernel/effects.ts.html +562 -0
- package/coverage/lcov-report/src/kernel/events.ts.html +250 -0
- package/coverage/lcov-report/src/kernel/index.html +176 -0
- package/coverage/lcov-report/src/kernel/interpreter.ts.html +514 -0
- package/coverage/lcov-report/src/kernel/saga.ts.html +304 -0
- package/coverage/lcov-report/src/modules/app-release/index.html +116 -0
- package/coverage/lcov-report/src/modules/app-release/index.ts.html +712 -0
- package/coverage/lcov-report/src/modules/auth/events/index.html +116 -0
- package/coverage/lcov-report/src/modules/auth/events/index.ts.html +142 -0
- package/coverage/lcov-report/src/modules/auth/index.html +116 -0
- package/coverage/lcov-report/src/modules/auth/index.ts.html +1225 -0
- package/coverage/lcov-report/src/modules/crdt/crdt-field.ts.html +967 -0
- package/coverage/lcov-report/src/modules/crdt/index.html +146 -0
- package/coverage/lcov-report/src/modules/crdt/index.ts.html +1474 -0
- package/coverage/lcov-report/src/modules/crdt/loro-loader.ts.html +160 -0
- package/coverage/lcov-report/src/modules/devtools/flags.ts.html +1132 -0
- package/coverage/lcov-report/src/modules/devtools/index.html +161 -0
- package/coverage/lcov-report/src/modules/devtools/index.ts.html +2413 -0
- package/coverage/lcov-report/src/modules/devtools/storage-info.ts.html +589 -0
- package/coverage/lcov-report/src/modules/devtools/versions.ts.html +415 -0
- package/coverage/lcov-report/src/modules/feature-flag/index.html +116 -0
- package/coverage/lcov-report/src/modules/feature-flag/index.ts.html +1033 -0
- package/coverage/lcov-report/src/modules/index.html +116 -0
- package/coverage/lcov-report/src/modules/ref-tables.ts.html +349 -0
- package/coverage/lcov-report/src/mutation/index.html +191 -0
- package/coverage/lcov-report/src/mutation/jobs.ts.html +208 -0
- package/coverage/lcov-report/src/mutation/mutation-id.ts.html +190 -0
- package/coverage/lcov-report/src/mutation/push.saga.ts.html +730 -0
- package/coverage/lcov-report/src/mutation/rows.ts.html +1216 -0
- package/coverage/lcov-report/src/mutation/tray.saga.ts.html +229 -0
- package/coverage/lcov-report/src/mutation/write.saga.ts.html +583 -0
- package/coverage/lcov-report/src/otel/index.html +116 -0
- package/coverage/lcov-report/src/otel/index.ts.html +466 -0
- package/coverage/lcov-report/src/query/env.ts.html +253 -0
- package/coverage/lcov-report/src/query/fetch.saga.ts.html +412 -0
- package/coverage/lcov-report/src/query/hash.ts.html +139 -0
- package/coverage/lcov-report/src/query/index.html +281 -0
- package/coverage/lcov-report/src/query/lifecycle.saga.ts.html +388 -0
- package/coverage/lcov-report/src/query/materialize.saga.ts.html +310 -0
- package/coverage/lcov-report/src/query/materialize.ts.html +217 -0
- package/coverage/lcov-report/src/query/membership.saga.ts.html +709 -0
- package/coverage/lcov-report/src/query/membership.ts.html +559 -0
- package/coverage/lcov-report/src/query/register.saga.ts.html +655 -0
- package/coverage/lcov-report/src/query/render-set.ts.html +265 -0
- package/coverage/lcov-report/src/query/sql.ts.html +322 -0
- package/coverage/lcov-report/src/query/window-query.ts.html +670 -0
- package/coverage/lcov-report/src/services/blobs/blob-cache.ts.html +1894 -0
- package/coverage/lcov-report/src/services/blobs/blob-manifest.ts.html +766 -0
- package/coverage/lcov-report/src/services/blobs/blob-store.ts.html +1162 -0
- package/coverage/lcov-report/src/services/blobs/index.html +161 -0
- package/coverage/lcov-report/src/services/blobs/index.ts.html +295 -0
- package/coverage/lcov-report/src/services/database/cache-engine.ts.html +664 -0
- package/coverage/lcov-report/src/services/database/connection-supervisor.ts.html +1330 -0
- package/coverage/lcov-report/src/services/database/database.ts.html +658 -0
- package/coverage/lcov-report/src/services/database/engine-factory.ts.html +184 -0
- package/coverage/lcov-report/src/services/database/errors.ts.html +187 -0
- package/coverage/lcov-report/src/services/database/events/index.html +116 -0
- package/coverage/lcov-report/src/services/database/events/index.ts.html +184 -0
- package/coverage/lcov-report/src/services/database/index.html +386 -0
- package/coverage/lcov-report/src/services/database/index.ts.html +121 -0
- package/coverage/lcov-report/src/services/database/local-migrator.ts.html +703 -0
- package/coverage/lcov-report/src/services/database/local.ts.html +1633 -0
- package/coverage/lcov-report/src/services/database/plan-render.ts.html +409 -0
- package/coverage/lcov-report/src/services/database/relation-resolver.ts.html +682 -0
- package/coverage/lcov-report/src/services/database/remote.ts.html +1036 -0
- package/coverage/lcov-report/src/services/database/sqlite-cache-engine.ts.html +4132 -0
- package/coverage/lcov-report/src/services/database/sqlite-lock-verify.ts.html +220 -0
- package/coverage/lcov-report/src/services/database/sqlite-open.ts.html +577 -0
- package/coverage/lcov-report/src/services/database/sqlite-plan-sql.ts.html +499 -0
- package/coverage/lcov-report/src/services/database/sqlite-select.ts.html +478 -0
- package/coverage/lcov-report/src/services/database/sqlite-transport.ts.html +757 -0
- package/coverage/lcov-report/src/services/database/surql-translate.ts.html +1333 -0
- package/coverage/lcov-report/src/services/database/surreal-cache-engine.ts.html +568 -0
- package/coverage/lcov-report/src/services/logger/index.html +116 -0
- package/coverage/lcov-report/src/services/logger/index.ts.html +154 -0
- package/coverage/lcov-report/src/services/persistence/index.html +146 -0
- package/coverage/lcov-report/src/services/persistence/localstorage.ts.html +163 -0
- package/coverage/lcov-report/src/services/persistence/resilient.ts.html +208 -0
- package/coverage/lcov-report/src/services/persistence/surrealdb.ts.html +271 -0
- package/coverage/lcov-report/src/services/stream-processor/index.html +146 -0
- package/coverage/lcov-report/src/services/stream-processor/index.ts.html +3313 -0
- package/coverage/lcov-report/src/services/stream-processor/permissions.ts.html +244 -0
- package/coverage/lcov-report/src/services/stream-processor/wasm-types.ts.html +346 -0
- package/coverage/lcov-report/src/services/tabs/broker-client.ts.html +934 -0
- package/coverage/lcov-report/src/services/tabs/coordinator.ts.html +1984 -0
- package/coverage/lcov-report/src/services/tabs/index.html +191 -0
- package/coverage/lcov-report/src/services/tabs/leader-locks.ts.html +310 -0
- package/coverage/lcov-report/src/services/tabs/protocol.ts.html +871 -0
- package/coverage/lcov-report/src/services/tabs/support.ts.html +193 -0
- package/coverage/lcov-report/src/services/tabs/tabs-broker-worker.ts.html +2005 -0
- package/coverage/lcov-report/src/sp00ky.ts.html +100 -0
- package/coverage/lcov-report/src/state/client-state.ts.html +637 -0
- package/coverage/lcov-report/src/state/index.html +161 -0
- package/coverage/lcov-report/src/state/lifecycle.ts.html +343 -0
- package/coverage/lcov-report/src/state/reducers.ts.html +1471 -0
- package/coverage/lcov-report/src/state/selectors.ts.html +637 -0
- package/coverage/lcov-report/src/sync/connection.saga.ts.html +343 -0
- package/coverage/lcov-report/src/sync/index.html +176 -0
- package/coverage/lcov-report/src/sync/live.saga.ts.html +232 -0
- package/coverage/lcov-report/src/sync/policy.ts.html +1606 -0
- package/coverage/lcov-report/src/sync/poll.saga.ts.html +193 -0
- package/coverage/lcov-report/src/sync/tabs.saga.ts.html +361 -0
- package/coverage/lcov-report/src/types.ts.html +2419 -0
- package/coverage/lcov-report/src/utils/blurhash.ts.html +355 -0
- package/coverage/lcov-report/src/utils/error-classification.ts.html +244 -0
- package/coverage/lcov-report/src/utils/index.html +191 -0
- package/coverage/lcov-report/src/utils/index.ts.html +820 -0
- package/coverage/lcov-report/src/utils/parser.ts.html +313 -0
- package/coverage/lcov-report/src/utils/semver.ts.html +175 -0
- package/coverage/lcov-report/src/utils/surql.ts.html +667 -0
- package/coverage/lcov.info +19079 -0
- package/dist/index.js +3 -3
- package/dist/sqlite-open.js +20 -1
- package/package.json +3 -3
- package/src/services/database/relation-resolver.test.ts +55 -1
- package/src/services/database/relation-resolver.ts +0 -0
|
@@ -0,0 +1,4132 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/services/database/sqlite-cache-engine.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../index.html">All files</a> / <a href="index.html">src/services/database</a> sqlite-cache-engine.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">76.07% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>687/903</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">72.65% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>178/245</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">70.96% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>44/62</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">76.07% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>687/903</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>
|
|
1201
|
+
<a name='L1136'></a><a href='#L1136'>1136</a>
|
|
1202
|
+
<a name='L1137'></a><a href='#L1137'>1137</a>
|
|
1203
|
+
<a name='L1138'></a><a href='#L1138'>1138</a>
|
|
1204
|
+
<a name='L1139'></a><a href='#L1139'>1139</a>
|
|
1205
|
+
<a name='L1140'></a><a href='#L1140'>1140</a>
|
|
1206
|
+
<a name='L1141'></a><a href='#L1141'>1141</a>
|
|
1207
|
+
<a name='L1142'></a><a href='#L1142'>1142</a>
|
|
1208
|
+
<a name='L1143'></a><a href='#L1143'>1143</a>
|
|
1209
|
+
<a name='L1144'></a><a href='#L1144'>1144</a>
|
|
1210
|
+
<a name='L1145'></a><a href='#L1145'>1145</a>
|
|
1211
|
+
<a name='L1146'></a><a href='#L1146'>1146</a>
|
|
1212
|
+
<a name='L1147'></a><a href='#L1147'>1147</a>
|
|
1213
|
+
<a name='L1148'></a><a href='#L1148'>1148</a>
|
|
1214
|
+
<a name='L1149'></a><a href='#L1149'>1149</a>
|
|
1215
|
+
<a name='L1150'></a><a href='#L1150'>1150</a>
|
|
1216
|
+
<a name='L1151'></a><a href='#L1151'>1151</a>
|
|
1217
|
+
<a name='L1152'></a><a href='#L1152'>1152</a>
|
|
1218
|
+
<a name='L1153'></a><a href='#L1153'>1153</a>
|
|
1219
|
+
<a name='L1154'></a><a href='#L1154'>1154</a>
|
|
1220
|
+
<a name='L1155'></a><a href='#L1155'>1155</a>
|
|
1221
|
+
<a name='L1156'></a><a href='#L1156'>1156</a>
|
|
1222
|
+
<a name='L1157'></a><a href='#L1157'>1157</a>
|
|
1223
|
+
<a name='L1158'></a><a href='#L1158'>1158</a>
|
|
1224
|
+
<a name='L1159'></a><a href='#L1159'>1159</a>
|
|
1225
|
+
<a name='L1160'></a><a href='#L1160'>1160</a>
|
|
1226
|
+
<a name='L1161'></a><a href='#L1161'>1161</a>
|
|
1227
|
+
<a name='L1162'></a><a href='#L1162'>1162</a>
|
|
1228
|
+
<a name='L1163'></a><a href='#L1163'>1163</a>
|
|
1229
|
+
<a name='L1164'></a><a href='#L1164'>1164</a>
|
|
1230
|
+
<a name='L1165'></a><a href='#L1165'>1165</a>
|
|
1231
|
+
<a name='L1166'></a><a href='#L1166'>1166</a>
|
|
1232
|
+
<a name='L1167'></a><a href='#L1167'>1167</a>
|
|
1233
|
+
<a name='L1168'></a><a href='#L1168'>1168</a>
|
|
1234
|
+
<a name='L1169'></a><a href='#L1169'>1169</a>
|
|
1235
|
+
<a name='L1170'></a><a href='#L1170'>1170</a>
|
|
1236
|
+
<a name='L1171'></a><a href='#L1171'>1171</a>
|
|
1237
|
+
<a name='L1172'></a><a href='#L1172'>1172</a>
|
|
1238
|
+
<a name='L1173'></a><a href='#L1173'>1173</a>
|
|
1239
|
+
<a name='L1174'></a><a href='#L1174'>1174</a>
|
|
1240
|
+
<a name='L1175'></a><a href='#L1175'>1175</a>
|
|
1241
|
+
<a name='L1176'></a><a href='#L1176'>1176</a>
|
|
1242
|
+
<a name='L1177'></a><a href='#L1177'>1177</a>
|
|
1243
|
+
<a name='L1178'></a><a href='#L1178'>1178</a>
|
|
1244
|
+
<a name='L1179'></a><a href='#L1179'>1179</a>
|
|
1245
|
+
<a name='L1180'></a><a href='#L1180'>1180</a>
|
|
1246
|
+
<a name='L1181'></a><a href='#L1181'>1181</a>
|
|
1247
|
+
<a name='L1182'></a><a href='#L1182'>1182</a>
|
|
1248
|
+
<a name='L1183'></a><a href='#L1183'>1183</a>
|
|
1249
|
+
<a name='L1184'></a><a href='#L1184'>1184</a>
|
|
1250
|
+
<a name='L1185'></a><a href='#L1185'>1185</a>
|
|
1251
|
+
<a name='L1186'></a><a href='#L1186'>1186</a>
|
|
1252
|
+
<a name='L1187'></a><a href='#L1187'>1187</a>
|
|
1253
|
+
<a name='L1188'></a><a href='#L1188'>1188</a>
|
|
1254
|
+
<a name='L1189'></a><a href='#L1189'>1189</a>
|
|
1255
|
+
<a name='L1190'></a><a href='#L1190'>1190</a>
|
|
1256
|
+
<a name='L1191'></a><a href='#L1191'>1191</a>
|
|
1257
|
+
<a name='L1192'></a><a href='#L1192'>1192</a>
|
|
1258
|
+
<a name='L1193'></a><a href='#L1193'>1193</a>
|
|
1259
|
+
<a name='L1194'></a><a href='#L1194'>1194</a>
|
|
1260
|
+
<a name='L1195'></a><a href='#L1195'>1195</a>
|
|
1261
|
+
<a name='L1196'></a><a href='#L1196'>1196</a>
|
|
1262
|
+
<a name='L1197'></a><a href='#L1197'>1197</a>
|
|
1263
|
+
<a name='L1198'></a><a href='#L1198'>1198</a>
|
|
1264
|
+
<a name='L1199'></a><a href='#L1199'>1199</a>
|
|
1265
|
+
<a name='L1200'></a><a href='#L1200'>1200</a>
|
|
1266
|
+
<a name='L1201'></a><a href='#L1201'>1201</a>
|
|
1267
|
+
<a name='L1202'></a><a href='#L1202'>1202</a>
|
|
1268
|
+
<a name='L1203'></a><a href='#L1203'>1203</a>
|
|
1269
|
+
<a name='L1204'></a><a href='#L1204'>1204</a>
|
|
1270
|
+
<a name='L1205'></a><a href='#L1205'>1205</a>
|
|
1271
|
+
<a name='L1206'></a><a href='#L1206'>1206</a>
|
|
1272
|
+
<a name='L1207'></a><a href='#L1207'>1207</a>
|
|
1273
|
+
<a name='L1208'></a><a href='#L1208'>1208</a>
|
|
1274
|
+
<a name='L1209'></a><a href='#L1209'>1209</a>
|
|
1275
|
+
<a name='L1210'></a><a href='#L1210'>1210</a>
|
|
1276
|
+
<a name='L1211'></a><a href='#L1211'>1211</a>
|
|
1277
|
+
<a name='L1212'></a><a href='#L1212'>1212</a>
|
|
1278
|
+
<a name='L1213'></a><a href='#L1213'>1213</a>
|
|
1279
|
+
<a name='L1214'></a><a href='#L1214'>1214</a>
|
|
1280
|
+
<a name='L1215'></a><a href='#L1215'>1215</a>
|
|
1281
|
+
<a name='L1216'></a><a href='#L1216'>1216</a>
|
|
1282
|
+
<a name='L1217'></a><a href='#L1217'>1217</a>
|
|
1283
|
+
<a name='L1218'></a><a href='#L1218'>1218</a>
|
|
1284
|
+
<a name='L1219'></a><a href='#L1219'>1219</a>
|
|
1285
|
+
<a name='L1220'></a><a href='#L1220'>1220</a>
|
|
1286
|
+
<a name='L1221'></a><a href='#L1221'>1221</a>
|
|
1287
|
+
<a name='L1222'></a><a href='#L1222'>1222</a>
|
|
1288
|
+
<a name='L1223'></a><a href='#L1223'>1223</a>
|
|
1289
|
+
<a name='L1224'></a><a href='#L1224'>1224</a>
|
|
1290
|
+
<a name='L1225'></a><a href='#L1225'>1225</a>
|
|
1291
|
+
<a name='L1226'></a><a href='#L1226'>1226</a>
|
|
1292
|
+
<a name='L1227'></a><a href='#L1227'>1227</a>
|
|
1293
|
+
<a name='L1228'></a><a href='#L1228'>1228</a>
|
|
1294
|
+
<a name='L1229'></a><a href='#L1229'>1229</a>
|
|
1295
|
+
<a name='L1230'></a><a href='#L1230'>1230</a>
|
|
1296
|
+
<a name='L1231'></a><a href='#L1231'>1231</a>
|
|
1297
|
+
<a name='L1232'></a><a href='#L1232'>1232</a>
|
|
1298
|
+
<a name='L1233'></a><a href='#L1233'>1233</a>
|
|
1299
|
+
<a name='L1234'></a><a href='#L1234'>1234</a>
|
|
1300
|
+
<a name='L1235'></a><a href='#L1235'>1235</a>
|
|
1301
|
+
<a name='L1236'></a><a href='#L1236'>1236</a>
|
|
1302
|
+
<a name='L1237'></a><a href='#L1237'>1237</a>
|
|
1303
|
+
<a name='L1238'></a><a href='#L1238'>1238</a>
|
|
1304
|
+
<a name='L1239'></a><a href='#L1239'>1239</a>
|
|
1305
|
+
<a name='L1240'></a><a href='#L1240'>1240</a>
|
|
1306
|
+
<a name='L1241'></a><a href='#L1241'>1241</a>
|
|
1307
|
+
<a name='L1242'></a><a href='#L1242'>1242</a>
|
|
1308
|
+
<a name='L1243'></a><a href='#L1243'>1243</a>
|
|
1309
|
+
<a name='L1244'></a><a href='#L1244'>1244</a>
|
|
1310
|
+
<a name='L1245'></a><a href='#L1245'>1245</a>
|
|
1311
|
+
<a name='L1246'></a><a href='#L1246'>1246</a>
|
|
1312
|
+
<a name='L1247'></a><a href='#L1247'>1247</a>
|
|
1313
|
+
<a name='L1248'></a><a href='#L1248'>1248</a>
|
|
1314
|
+
<a name='L1249'></a><a href='#L1249'>1249</a>
|
|
1315
|
+
<a name='L1250'></a><a href='#L1250'>1250</a>
|
|
1316
|
+
<a name='L1251'></a><a href='#L1251'>1251</a>
|
|
1317
|
+
<a name='L1252'></a><a href='#L1252'>1252</a>
|
|
1318
|
+
<a name='L1253'></a><a href='#L1253'>1253</a>
|
|
1319
|
+
<a name='L1254'></a><a href='#L1254'>1254</a>
|
|
1320
|
+
<a name='L1255'></a><a href='#L1255'>1255</a>
|
|
1321
|
+
<a name='L1256'></a><a href='#L1256'>1256</a>
|
|
1322
|
+
<a name='L1257'></a><a href='#L1257'>1257</a>
|
|
1323
|
+
<a name='L1258'></a><a href='#L1258'>1258</a>
|
|
1324
|
+
<a name='L1259'></a><a href='#L1259'>1259</a>
|
|
1325
|
+
<a name='L1260'></a><a href='#L1260'>1260</a>
|
|
1326
|
+
<a name='L1261'></a><a href='#L1261'>1261</a>
|
|
1327
|
+
<a name='L1262'></a><a href='#L1262'>1262</a>
|
|
1328
|
+
<a name='L1263'></a><a href='#L1263'>1263</a>
|
|
1329
|
+
<a name='L1264'></a><a href='#L1264'>1264</a>
|
|
1330
|
+
<a name='L1265'></a><a href='#L1265'>1265</a>
|
|
1331
|
+
<a name='L1266'></a><a href='#L1266'>1266</a>
|
|
1332
|
+
<a name='L1267'></a><a href='#L1267'>1267</a>
|
|
1333
|
+
<a name='L1268'></a><a href='#L1268'>1268</a>
|
|
1334
|
+
<a name='L1269'></a><a href='#L1269'>1269</a>
|
|
1335
|
+
<a name='L1270'></a><a href='#L1270'>1270</a>
|
|
1336
|
+
<a name='L1271'></a><a href='#L1271'>1271</a>
|
|
1337
|
+
<a name='L1272'></a><a href='#L1272'>1272</a>
|
|
1338
|
+
<a name='L1273'></a><a href='#L1273'>1273</a>
|
|
1339
|
+
<a name='L1274'></a><a href='#L1274'>1274</a>
|
|
1340
|
+
<a name='L1275'></a><a href='#L1275'>1275</a>
|
|
1341
|
+
<a name='L1276'></a><a href='#L1276'>1276</a>
|
|
1342
|
+
<a name='L1277'></a><a href='#L1277'>1277</a>
|
|
1343
|
+
<a name='L1278'></a><a href='#L1278'>1278</a>
|
|
1344
|
+
<a name='L1279'></a><a href='#L1279'>1279</a>
|
|
1345
|
+
<a name='L1280'></a><a href='#L1280'>1280</a>
|
|
1346
|
+
<a name='L1281'></a><a href='#L1281'>1281</a>
|
|
1347
|
+
<a name='L1282'></a><a href='#L1282'>1282</a>
|
|
1348
|
+
<a name='L1283'></a><a href='#L1283'>1283</a>
|
|
1349
|
+
<a name='L1284'></a><a href='#L1284'>1284</a>
|
|
1350
|
+
<a name='L1285'></a><a href='#L1285'>1285</a>
|
|
1351
|
+
<a name='L1286'></a><a href='#L1286'>1286</a>
|
|
1352
|
+
<a name='L1287'></a><a href='#L1287'>1287</a>
|
|
1353
|
+
<a name='L1288'></a><a href='#L1288'>1288</a>
|
|
1354
|
+
<a name='L1289'></a><a href='#L1289'>1289</a>
|
|
1355
|
+
<a name='L1290'></a><a href='#L1290'>1290</a>
|
|
1356
|
+
<a name='L1291'></a><a href='#L1291'>1291</a>
|
|
1357
|
+
<a name='L1292'></a><a href='#L1292'>1292</a>
|
|
1358
|
+
<a name='L1293'></a><a href='#L1293'>1293</a>
|
|
1359
|
+
<a name='L1294'></a><a href='#L1294'>1294</a>
|
|
1360
|
+
<a name='L1295'></a><a href='#L1295'>1295</a>
|
|
1361
|
+
<a name='L1296'></a><a href='#L1296'>1296</a>
|
|
1362
|
+
<a name='L1297'></a><a href='#L1297'>1297</a>
|
|
1363
|
+
<a name='L1298'></a><a href='#L1298'>1298</a>
|
|
1364
|
+
<a name='L1299'></a><a href='#L1299'>1299</a>
|
|
1365
|
+
<a name='L1300'></a><a href='#L1300'>1300</a>
|
|
1366
|
+
<a name='L1301'></a><a href='#L1301'>1301</a>
|
|
1367
|
+
<a name='L1302'></a><a href='#L1302'>1302</a>
|
|
1368
|
+
<a name='L1303'></a><a href='#L1303'>1303</a>
|
|
1369
|
+
<a name='L1304'></a><a href='#L1304'>1304</a>
|
|
1370
|
+
<a name='L1305'></a><a href='#L1305'>1305</a>
|
|
1371
|
+
<a name='L1306'></a><a href='#L1306'>1306</a>
|
|
1372
|
+
<a name='L1307'></a><a href='#L1307'>1307</a>
|
|
1373
|
+
<a name='L1308'></a><a href='#L1308'>1308</a>
|
|
1374
|
+
<a name='L1309'></a><a href='#L1309'>1309</a>
|
|
1375
|
+
<a name='L1310'></a><a href='#L1310'>1310</a>
|
|
1376
|
+
<a name='L1311'></a><a href='#L1311'>1311</a>
|
|
1377
|
+
<a name='L1312'></a><a href='#L1312'>1312</a>
|
|
1378
|
+
<a name='L1313'></a><a href='#L1313'>1313</a>
|
|
1379
|
+
<a name='L1314'></a><a href='#L1314'>1314</a>
|
|
1380
|
+
<a name='L1315'></a><a href='#L1315'>1315</a>
|
|
1381
|
+
<a name='L1316'></a><a href='#L1316'>1316</a>
|
|
1382
|
+
<a name='L1317'></a><a href='#L1317'>1317</a>
|
|
1383
|
+
<a name='L1318'></a><a href='#L1318'>1318</a>
|
|
1384
|
+
<a name='L1319'></a><a href='#L1319'>1319</a>
|
|
1385
|
+
<a name='L1320'></a><a href='#L1320'>1320</a>
|
|
1386
|
+
<a name='L1321'></a><a href='#L1321'>1321</a>
|
|
1387
|
+
<a name='L1322'></a><a href='#L1322'>1322</a>
|
|
1388
|
+
<a name='L1323'></a><a href='#L1323'>1323</a>
|
|
1389
|
+
<a name='L1324'></a><a href='#L1324'>1324</a>
|
|
1390
|
+
<a name='L1325'></a><a href='#L1325'>1325</a>
|
|
1391
|
+
<a name='L1326'></a><a href='#L1326'>1326</a>
|
|
1392
|
+
<a name='L1327'></a><a href='#L1327'>1327</a>
|
|
1393
|
+
<a name='L1328'></a><a href='#L1328'>1328</a>
|
|
1394
|
+
<a name='L1329'></a><a href='#L1329'>1329</a>
|
|
1395
|
+
<a name='L1330'></a><a href='#L1330'>1330</a>
|
|
1396
|
+
<a name='L1331'></a><a href='#L1331'>1331</a>
|
|
1397
|
+
<a name='L1332'></a><a href='#L1332'>1332</a>
|
|
1398
|
+
<a name='L1333'></a><a href='#L1333'>1333</a>
|
|
1399
|
+
<a name='L1334'></a><a href='#L1334'>1334</a>
|
|
1400
|
+
<a name='L1335'></a><a href='#L1335'>1335</a>
|
|
1401
|
+
<a name='L1336'></a><a href='#L1336'>1336</a>
|
|
1402
|
+
<a name='L1337'></a><a href='#L1337'>1337</a>
|
|
1403
|
+
<a name='L1338'></a><a href='#L1338'>1338</a>
|
|
1404
|
+
<a name='L1339'></a><a href='#L1339'>1339</a>
|
|
1405
|
+
<a name='L1340'></a><a href='#L1340'>1340</a>
|
|
1406
|
+
<a name='L1341'></a><a href='#L1341'>1341</a>
|
|
1407
|
+
<a name='L1342'></a><a href='#L1342'>1342</a>
|
|
1408
|
+
<a name='L1343'></a><a href='#L1343'>1343</a>
|
|
1409
|
+
<a name='L1344'></a><a href='#L1344'>1344</a>
|
|
1410
|
+
<a name='L1345'></a><a href='#L1345'>1345</a>
|
|
1411
|
+
<a name='L1346'></a><a href='#L1346'>1346</a>
|
|
1412
|
+
<a name='L1347'></a><a href='#L1347'>1347</a>
|
|
1413
|
+
<a name='L1348'></a><a href='#L1348'>1348</a>
|
|
1414
|
+
<a name='L1349'></a><a href='#L1349'>1349</a>
|
|
1415
|
+
<a name='L1350'></a><a href='#L1350'>1350</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</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-neutral"> </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-neutral"> </span>
|
|
1443
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1454
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1459
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1460
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1465
|
+
<span class="cline-any cline-neutral"> </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">1x</span>
|
|
1471
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1472
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1473
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1476
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1477
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1478
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1479
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1480
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1481
|
+
<span class="cline-any cline-yes">1x</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-yes">1x</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-neutral"> </span>
|
|
1490
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1491
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1492
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1495
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1497
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1498
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1499
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1500
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1501
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1502
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1503
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
1516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1520
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1523
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1524
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1525
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1526
|
+
<span class="cline-any cline-yes">35x</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-yes">35x</span>
|
|
1531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1532
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1533
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1534
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1535
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1537
|
+
<span class="cline-any cline-yes">35x</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">35x</span>
|
|
1542
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1546
|
+
<span class="cline-any cline-yes">35x</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">35x</span>
|
|
1551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1554
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1556
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1557
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1558
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1559
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1560
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1561
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1562
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1563
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1564
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1565
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1566
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1568
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1569
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1570
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1572
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1573
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1574
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1577
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1578
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1582
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1583
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1584
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1585
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1586
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1587
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1588
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1589
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1591
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1592
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1593
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1594
|
+
<span class="cline-any cline-yes">37x</span>
|
|
1595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1596
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-neutral"> </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-yes">35x</span>
|
|
1606
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1607
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1608
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1609
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1610
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1611
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1612
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1613
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1614
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1615
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1616
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1619
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1620
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1621
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1622
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1623
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1624
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1625
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1626
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1628
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1629
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1630
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1631
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1632
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1633
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1634
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1635
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1636
|
+
<span class="cline-any cline-no"> </span>
|
|
1637
|
+
<span class="cline-any cline-no"> </span>
|
|
1638
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1639
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1640
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1641
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1642
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1643
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1646
|
+
<span class="cline-any cline-no"> </span>
|
|
1647
|
+
<span class="cline-any cline-no"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1650
|
+
<span class="cline-any cline-no"> </span>
|
|
1651
|
+
<span class="cline-any cline-no"> </span>
|
|
1652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1655
|
+
<span class="cline-any cline-no"> </span>
|
|
1656
|
+
<span class="cline-any cline-no"> </span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1660
|
+
<span class="cline-any cline-no"> </span>
|
|
1661
|
+
<span class="cline-any cline-no"> </span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1673
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1674
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1679
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1680
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1681
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1682
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1685
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1686
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1687
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1688
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1689
|
+
<span class="cline-any cline-yes">63x</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-neutral"> </span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1702
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1703
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1704
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1705
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1706
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1707
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1708
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1709
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1710
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1711
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1712
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1713
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1714
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1715
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1716
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1719
|
+
<span class="cline-any cline-yes">100x</span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1722
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1723
|
+
<span class="cline-any cline-yes">100x</span>
|
|
1724
|
+
<span class="cline-any cline-yes">100x</span>
|
|
1725
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1726
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1727
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1728
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1729
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1730
|
+
<span class="cline-any cline-yes">100x</span>
|
|
1731
|
+
<span class="cline-any cline-yes">99x</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">99x</span>
|
|
1736
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1737
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1738
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1739
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1740
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1741
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1742
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1743
|
+
<span class="cline-any cline-yes">99x</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-neutral"> </span>
|
|
1749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1751
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1752
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1753
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1754
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1755
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1756
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1757
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1758
|
+
<span class="cline-any cline-yes">95x</span>
|
|
1759
|
+
<span class="cline-any cline-yes">95x</span>
|
|
1760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1762
|
+
<span class="cline-any cline-yes">95x</span>
|
|
1763
|
+
<span class="cline-any cline-yes">95x</span>
|
|
1764
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1765
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1766
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1767
|
+
<span class="cline-any cline-yes">95x</span>
|
|
1768
|
+
<span class="cline-any cline-yes">95x</span>
|
|
1769
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1770
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1771
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1772
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1773
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1774
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1775
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1776
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1777
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1778
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1779
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1780
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1781
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1782
|
+
<span class="cline-any cline-yes">99x</span>
|
|
1783
|
+
<span class="cline-any cline-yes">100x</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-neutral"> </span>
|
|
1791
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1792
|
+
<span class="cline-any cline-no"> </span>
|
|
1793
|
+
<span class="cline-any cline-no"> </span>
|
|
1794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1795
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1796
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1797
|
+
<span class="cline-any cline-yes">35x</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-yes">35x</span>
|
|
1802
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1803
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1804
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-no"> </span>
|
|
1809
|
+
<span class="cline-any cline-no"> </span>
|
|
1810
|
+
<span class="cline-any cline-no"> </span>
|
|
1811
|
+
<span class="cline-any cline-no"> </span>
|
|
1812
|
+
<span class="cline-any cline-no"> </span>
|
|
1813
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1815
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </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-yes">35x</span>
|
|
1826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1828
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1829
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1830
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1831
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1832
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1833
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1834
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1835
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1836
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1837
|
+
<span class="cline-any cline-yes">35x</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-yes">35x</span>
|
|
1843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1846
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1847
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1848
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1849
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1850
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1851
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1852
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1853
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1854
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1855
|
+
<span class="cline-any cline-yes">33x</span>
|
|
1856
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1857
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1858
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1859
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1860
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1861
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1862
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1863
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1864
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1865
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1866
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1867
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1872
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1873
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1874
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1875
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1876
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1877
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1878
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1880
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1883
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1884
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1887
|
+
<span class="cline-any cline-yes">1x</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-yes">1x</span>
|
|
1896
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1897
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1898
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1900
|
+
<span class="cline-any cline-no"> </span>
|
|
1901
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1902
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1903
|
+
<span class="cline-any cline-yes">1x</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-yes">1x</span>
|
|
1907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1908
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1909
|
+
<span class="cline-any cline-no"> </span>
|
|
1910
|
+
<span class="cline-any cline-no"> </span>
|
|
1911
|
+
<span class="cline-any cline-no"> </span>
|
|
1912
|
+
<span class="cline-any cline-no"> </span>
|
|
1913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1914
|
+
<span class="cline-any cline-no"> </span>
|
|
1915
|
+
<span class="cline-any cline-no"> </span>
|
|
1916
|
+
<span class="cline-any cline-no"> </span>
|
|
1917
|
+
<span class="cline-any cline-no"> </span>
|
|
1918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1926
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1929
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1932
|
+
<span class="cline-any cline-neutral"> </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-yes">35x</span>
|
|
1940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1941
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1942
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1943
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1944
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1945
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1946
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1947
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1948
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1950
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1951
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1952
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1953
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1954
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1955
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1956
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1957
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1960
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1961
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1964
|
+
<span class="cline-any cline-no"> </span>
|
|
1965
|
+
<span class="cline-any cline-no"> </span>
|
|
1966
|
+
<span class="cline-any cline-no"> </span>
|
|
1967
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1968
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1970
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1971
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1972
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1973
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1974
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1975
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1976
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </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-yes">35x</span>
|
|
1985
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1986
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1991
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1992
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1993
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1994
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1995
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1996
|
+
<span class="cline-any cline-no"> </span>
|
|
1997
|
+
<span class="cline-any cline-no"> </span>
|
|
1998
|
+
<span class="cline-any cline-no"> </span>
|
|
1999
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2000
|
+
<span class="cline-any cline-no"> </span>
|
|
2001
|
+
<span class="cline-any cline-no"> </span>
|
|
2002
|
+
<span class="cline-any cline-no"> </span>
|
|
2003
|
+
<span class="cline-any cline-no"> </span>
|
|
2004
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2005
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2006
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2007
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2008
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2009
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2011
|
+
<span class="cline-any cline-no"> </span>
|
|
2012
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2013
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2014
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2015
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2016
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2017
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2018
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2019
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2020
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2021
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2022
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2023
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2024
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2025
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2026
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2027
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2030
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2031
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2032
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2033
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2034
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2035
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2036
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2037
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2038
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2039
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2040
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2041
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2042
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2043
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2044
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2045
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2046
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2047
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2048
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2049
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2050
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2051
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2052
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2053
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2054
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2055
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2056
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2057
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2061
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2062
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2063
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2068
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2069
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2070
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2071
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2072
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2073
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2075
|
+
<span class="cline-any cline-no"> </span>
|
|
2076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2079
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2080
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2081
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2082
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2083
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2084
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2085
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2086
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2087
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2088
|
+
<span class="cline-any cline-yes">2x</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-yes">35x</span>
|
|
2094
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2095
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2096
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2097
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2098
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2099
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2100
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2103
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2104
|
+
<span class="cline-any cline-no"> </span>
|
|
2105
|
+
<span class="cline-any cline-no"> </span>
|
|
2106
|
+
<span class="cline-any cline-no"> </span>
|
|
2107
|
+
<span class="cline-any cline-no"> </span>
|
|
2108
|
+
<span class="cline-any cline-no"> </span>
|
|
2109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2110
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2111
|
+
<span class="cline-any cline-no"> </span>
|
|
2112
|
+
<span class="cline-any cline-no"> </span>
|
|
2113
|
+
<span class="cline-any cline-no"> </span>
|
|
2114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2117
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2118
|
+
<span class="cline-any cline-no"> </span>
|
|
2119
|
+
<span class="cline-any cline-no"> </span>
|
|
2120
|
+
<span class="cline-any cline-no"> </span>
|
|
2121
|
+
<span class="cline-any cline-no"> </span>
|
|
2122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2123
|
+
<span class="cline-any cline-no"> </span>
|
|
2124
|
+
<span class="cline-any cline-no"> </span>
|
|
2125
|
+
<span class="cline-any cline-no"> </span>
|
|
2126
|
+
<span class="cline-any cline-no"> </span>
|
|
2127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2128
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2129
|
+
<span class="cline-any cline-yes">27x</span>
|
|
2130
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2131
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2132
|
+
<span class="cline-any cline-yes">19x</span>
|
|
2133
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2134
|
+
<span class="cline-any cline-yes">27x</span>
|
|
2135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2136
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2137
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2138
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2139
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2140
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2141
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2142
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2143
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2144
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2145
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2146
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2147
|
+
<span class="cline-any cline-yes">18x</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-yes">35x</span>
|
|
2152
|
+
<span class="cline-any cline-yes">8x</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-neutral"> </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-yes">6x</span>
|
|
2168
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2169
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2170
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2171
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2172
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2173
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2174
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2175
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2176
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2177
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2179
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2180
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2181
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2182
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2183
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2184
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2185
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2186
|
+
<span class="cline-any cline-no"> </span>
|
|
2187
|
+
<span class="cline-any cline-no"> </span>
|
|
2188
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2189
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2190
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2191
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2196
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2197
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2198
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2199
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2201
|
+
<span class="cline-any cline-yes">3x</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-no"> </span>
|
|
2206
|
+
<span class="cline-any cline-no"> </span>
|
|
2207
|
+
<span class="cline-any cline-no"> </span>
|
|
2208
|
+
<span class="cline-any cline-no"> </span>
|
|
2209
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2210
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2212
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2213
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2214
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2215
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2216
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2217
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2221
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2222
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2223
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2224
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2225
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2226
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2227
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2229
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2230
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2231
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2232
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2233
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2234
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2235
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2236
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2237
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2238
|
+
<span class="cline-any cline-no"> </span>
|
|
2239
|
+
<span class="cline-any cline-no"> </span>
|
|
2240
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2241
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2242
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2243
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2245
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2246
|
+
<span class="cline-any cline-no"> </span>
|
|
2247
|
+
<span class="cline-any cline-no"> </span>
|
|
2248
|
+
<span class="cline-any cline-no"> </span>
|
|
2249
|
+
<span class="cline-any cline-no"> </span>
|
|
2250
|
+
<span class="cline-any cline-no"> </span>
|
|
2251
|
+
<span class="cline-any cline-no"> </span>
|
|
2252
|
+
<span class="cline-any cline-no"> </span>
|
|
2253
|
+
<span class="cline-any cline-no"> </span>
|
|
2254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2256
|
+
<span class="cline-any cline-no"> </span>
|
|
2257
|
+
<span class="cline-any cline-no"> </span>
|
|
2258
|
+
<span class="cline-any cline-no"> </span>
|
|
2259
|
+
<span class="cline-any cline-no"> </span>
|
|
2260
|
+
<span class="cline-any cline-no"> </span>
|
|
2261
|
+
<span class="cline-any cline-no"> </span>
|
|
2262
|
+
<span class="cline-any cline-no"> </span>
|
|
2263
|
+
<span class="cline-any cline-no"> </span>
|
|
2264
|
+
<span class="cline-any cline-no"> </span>
|
|
2265
|
+
<span class="cline-any cline-no"> </span>
|
|
2266
|
+
<span class="cline-any cline-no"> </span>
|
|
2267
|
+
<span class="cline-any cline-no"> </span>
|
|
2268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2269
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2270
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2271
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2272
|
+
<span class="cline-any cline-yes">4x</span>
|
|
2273
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2280
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2281
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2282
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2283
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2284
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2285
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2286
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2287
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2288
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2289
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2290
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2291
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2292
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2293
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2295
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2296
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2297
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2298
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2299
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2300
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2301
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2302
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2303
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2304
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2305
|
+
<span class="cline-any cline-no"> </span>
|
|
2306
|
+
<span class="cline-any cline-no"> </span>
|
|
2307
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2308
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2309
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2310
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2311
|
+
<span class="cline-any cline-no"> </span>
|
|
2312
|
+
<span class="cline-any cline-no"> </span>
|
|
2313
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2314
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2315
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2316
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2318
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2320
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2321
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2322
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2323
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2324
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2325
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2326
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2327
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2328
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2329
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2330
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2332
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2333
|
+
<span class="cline-any cline-no"> </span>
|
|
2334
|
+
<span class="cline-any cline-no"> </span>
|
|
2335
|
+
<span class="cline-any cline-no"> </span>
|
|
2336
|
+
<span class="cline-any cline-no"> </span>
|
|
2337
|
+
<span class="cline-any cline-no"> </span>
|
|
2338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2341
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2342
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2343
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2344
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2348
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2349
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2350
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2351
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2352
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2353
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2354
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2355
|
+
<span class="cline-any cline-no"> </span>
|
|
2356
|
+
<span class="cline-any cline-no"> </span>
|
|
2357
|
+
<span class="cline-any cline-no"> </span>
|
|
2358
|
+
<span class="cline-any cline-no"> </span>
|
|
2359
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2361
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2363
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2364
|
+
<span class="cline-any cline-no"> </span>
|
|
2365
|
+
<span class="cline-any cline-no"> </span>
|
|
2366
|
+
<span class="cline-any cline-no"> </span>
|
|
2367
|
+
<span class="cline-any cline-no"> </span>
|
|
2368
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2369
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2370
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2371
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2372
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2382
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2383
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2384
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2385
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2386
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2387
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2388
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2389
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2390
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2391
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2397
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2398
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2399
|
+
<span class="cline-any cline-no"> </span>
|
|
2400
|
+
<span class="cline-any cline-no"> </span>
|
|
2401
|
+
<span class="cline-any cline-no"> </span>
|
|
2402
|
+
<span class="cline-any cline-no"> </span>
|
|
2403
|
+
<span class="cline-any cline-no"> </span>
|
|
2404
|
+
<span class="cline-any cline-no"> </span>
|
|
2405
|
+
<span class="cline-any cline-no"> </span>
|
|
2406
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2407
|
+
<span class="cline-any cline-no"> </span>
|
|
2408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2414
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2415
|
+
<span class="cline-any cline-no"> </span>
|
|
2416
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2417
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2418
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2420
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2421
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2422
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2423
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2424
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2425
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2426
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2427
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2428
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2429
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2430
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2431
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2432
|
+
<span class="cline-any cline-yes">17x</span>
|
|
2433
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2434
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2435
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2436
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2437
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2438
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2439
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2440
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2441
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2442
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2443
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2445
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2446
|
+
<span class="cline-any cline-no"> </span>
|
|
2447
|
+
<span class="cline-any cline-no"> </span>
|
|
2448
|
+
<span class="cline-any cline-no"> </span>
|
|
2449
|
+
<span class="cline-any cline-no"> </span>
|
|
2450
|
+
<span class="cline-any cline-no"> </span>
|
|
2451
|
+
<span class="cline-any cline-no"> </span>
|
|
2452
|
+
<span class="cline-any cline-no"> </span>
|
|
2453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2454
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2455
|
+
<span class="cline-any cline-no"> </span>
|
|
2456
|
+
<span class="cline-any cline-no"> </span>
|
|
2457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2458
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2459
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2460
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2461
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2462
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2463
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2464
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2465
|
+
<span class="cline-any cline-no"> </span>
|
|
2466
|
+
<span class="cline-any cline-no"> </span>
|
|
2467
|
+
<span class="cline-any cline-no"> </span>
|
|
2468
|
+
<span class="cline-any cline-no"> </span>
|
|
2469
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2470
|
+
<span class="cline-any cline-no"> </span>
|
|
2471
|
+
<span class="cline-any cline-no"> </span>
|
|
2472
|
+
<span class="cline-any cline-no"> </span>
|
|
2473
|
+
<span class="cline-any cline-no"> </span>
|
|
2474
|
+
<span class="cline-any cline-no"> </span>
|
|
2475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2477
|
+
<span class="cline-any cline-no"> </span>
|
|
2478
|
+
<span class="cline-any cline-no"> </span>
|
|
2479
|
+
<span class="cline-any cline-no"> </span>
|
|
2480
|
+
<span class="cline-any cline-no"> </span>
|
|
2481
|
+
<span class="cline-any cline-no"> </span>
|
|
2482
|
+
<span class="cline-any cline-no"> </span>
|
|
2483
|
+
<span class="cline-any cline-no"> </span>
|
|
2484
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2485
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2486
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2487
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2488
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2489
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2490
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2491
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2492
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2493
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2494
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2495
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2496
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2497
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2500
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2501
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2502
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2503
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2504
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2505
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2507
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2509
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2510
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2511
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2512
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2513
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2514
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2520
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2521
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2522
|
+
<span class="cline-any cline-no"> </span>
|
|
2523
|
+
<span class="cline-any cline-no"> </span>
|
|
2524
|
+
<span class="cline-any cline-no"> </span>
|
|
2525
|
+
<span class="cline-any cline-no"> </span>
|
|
2526
|
+
<span class="cline-any cline-no"> </span>
|
|
2527
|
+
<span class="cline-any cline-no"> </span>
|
|
2528
|
+
<span class="cline-any cline-no"> </span>
|
|
2529
|
+
<span class="cline-any cline-no"> </span>
|
|
2530
|
+
<span class="cline-any cline-no"> </span>
|
|
2531
|
+
<span class="cline-any cline-no"> </span>
|
|
2532
|
+
<span class="cline-any cline-no"> </span>
|
|
2533
|
+
<span class="cline-any cline-no"> </span>
|
|
2534
|
+
<span class="cline-any cline-no"> </span>
|
|
2535
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2536
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2537
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2538
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2539
|
+
<span class="cline-any cline-no"> </span>
|
|
2540
|
+
<span class="cline-any cline-no"> </span>
|
|
2541
|
+
<span class="cline-any cline-no"> </span>
|
|
2542
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2543
|
+
<span class="cline-any cline-no"> </span>
|
|
2544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2547
|
+
<span class="cline-any cline-no"> </span>
|
|
2548
|
+
<span class="cline-any cline-no"> </span>
|
|
2549
|
+
<span class="cline-any cline-no"> </span>
|
|
2550
|
+
<span class="cline-any cline-no"> </span>
|
|
2551
|
+
<span class="cline-any cline-no"> </span>
|
|
2552
|
+
<span class="cline-any cline-no"> </span>
|
|
2553
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2554
|
+
<span class="cline-any cline-no"> </span>
|
|
2555
|
+
<span class="cline-any cline-no"> </span>
|
|
2556
|
+
<span class="cline-any cline-no"> </span>
|
|
2557
|
+
<span class="cline-any cline-no"> </span>
|
|
2558
|
+
<span class="cline-any cline-no"> </span>
|
|
2559
|
+
<span class="cline-any cline-no"> </span>
|
|
2560
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2561
|
+
<span class="cline-any cline-no"> </span>
|
|
2562
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2563
|
+
<span class="cline-any cline-yes">18x</span>
|
|
2564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2570
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2571
|
+
<span class="cline-any cline-no"> </span>
|
|
2572
|
+
<span class="cline-any cline-no"> </span>
|
|
2573
|
+
<span class="cline-any cline-no"> </span>
|
|
2574
|
+
<span class="cline-any cline-no"> </span>
|
|
2575
|
+
<span class="cline-any cline-no"> </span>
|
|
2576
|
+
<span class="cline-any cline-no"> </span>
|
|
2577
|
+
<span class="cline-any cline-no"> </span>
|
|
2578
|
+
<span class="cline-any cline-no"> </span>
|
|
2579
|
+
<span class="cline-any cline-no"> </span>
|
|
2580
|
+
<span class="cline-any cline-no"> </span>
|
|
2581
|
+
<span class="cline-any cline-no"> </span>
|
|
2582
|
+
<span class="cline-any cline-no"> </span>
|
|
2583
|
+
<span class="cline-any cline-no"> </span>
|
|
2584
|
+
<span class="cline-any cline-no"> </span>
|
|
2585
|
+
<span class="cline-any cline-no"> </span>
|
|
2586
|
+
<span class="cline-any cline-no"> </span>
|
|
2587
|
+
<span class="cline-any cline-no"> </span>
|
|
2588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2591
|
+
<span class="cline-any cline-no"> </span>
|
|
2592
|
+
<span class="cline-any cline-no"> </span>
|
|
2593
|
+
<span class="cline-any cline-no"> </span>
|
|
2594
|
+
<span class="cline-any cline-no"> </span>
|
|
2595
|
+
<span class="cline-any cline-no"> </span>
|
|
2596
|
+
<span class="cline-any cline-no"> </span>
|
|
2597
|
+
<span class="cline-any cline-no"> </span>
|
|
2598
|
+
<span class="cline-any cline-no"> </span>
|
|
2599
|
+
<span class="cline-any cline-no"> </span>
|
|
2600
|
+
<span class="cline-any cline-no"> </span>
|
|
2601
|
+
<span class="cline-any cline-no"> </span>
|
|
2602
|
+
<span class="cline-any cline-no"> </span>
|
|
2603
|
+
<span class="cline-any cline-no"> </span>
|
|
2604
|
+
<span class="cline-any cline-no"> </span>
|
|
2605
|
+
<span class="cline-any cline-no"> </span>
|
|
2606
|
+
<span class="cline-any cline-no"> </span>
|
|
2607
|
+
<span class="cline-any cline-no"> </span>
|
|
2608
|
+
<span class="cline-any cline-no"> </span>
|
|
2609
|
+
<span class="cline-any cline-no"> </span>
|
|
2610
|
+
<span class="cline-any cline-no"> </span>
|
|
2611
|
+
<span class="cline-any cline-no"> </span>
|
|
2612
|
+
<span class="cline-any cline-no"> </span>
|
|
2613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2614
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2615
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2616
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2617
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2618
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2619
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2620
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2621
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2622
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2623
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2624
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2627
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2628
|
+
<span class="cline-any cline-yes">2x</span>
|
|
2629
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2630
|
+
<span class="cline-any cline-yes">7x</span>
|
|
2631
|
+
<span class="cline-any cline-yes">8x</span>
|
|
2632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2633
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2638
|
+
<span class="cline-any cline-no"> </span>
|
|
2639
|
+
<span class="cline-any cline-no"> </span>
|
|
2640
|
+
<span class="cline-any cline-no"> </span>
|
|
2641
|
+
<span class="cline-any cline-no"> </span>
|
|
2642
|
+
<span class="cline-any cline-no"> </span>
|
|
2643
|
+
<span class="cline-any cline-no"> </span>
|
|
2644
|
+
<span class="cline-any cline-no"> </span>
|
|
2645
|
+
<span class="cline-any cline-yes">35x</span>
|
|
2646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2682
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2683
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2684
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2685
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2686
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2687
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2688
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2689
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2690
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2691
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2692
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2693
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2694
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2695
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2696
|
+
<span class="cline-any cline-yes">1x</span>
|
|
2697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2703
|
+
<span class="cline-any cline-yes">236x</span>
|
|
2704
|
+
<span class="cline-any cline-yes">236x</span>
|
|
2705
|
+
<span class="cline-any cline-yes">236x</span>
|
|
2706
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2707
|
+
<span class="cline-any cline-yes">236x</span>
|
|
2708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2709
|
+
<span class="cline-any cline-yes">231x</span>
|
|
2710
|
+
<span class="cline-any cline-yes">3003x</span>
|
|
2711
|
+
<span class="cline-any cline-yes">3003x</span>
|
|
2712
|
+
<span class="cline-any cline-yes">231x</span>
|
|
2713
|
+
<span class="cline-any cline-yes">236x</span>
|
|
2714
|
+
<span class="cline-any cline-yes">236x</span>
|
|
2715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2729
|
+
<span class="cline-any cline-yes">11x</span>
|
|
2730
|
+
<span class="cline-any cline-yes">11x</span>
|
|
2731
|
+
<span class="cline-any cline-yes">11x</span>
|
|
2732
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2733
|
+
<span class="cline-any cline-yes">11x</span>
|
|
2734
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2735
|
+
<span class="cline-any cline-yes">3x</span>
|
|
2736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2737
|
+
<span class="cline-any cline-yes">11x</span>
|
|
2738
|
+
<span class="cline-any cline-yes">11x</span>
|
|
2739
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2740
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2741
|
+
<span class="cline-any cline-no"> </span>
|
|
2742
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2743
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2744
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2746
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2747
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2748
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2749
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2750
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2751
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2752
|
+
<span class="cline-any cline-yes">5x</span>
|
|
2753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2756
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2757
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2758
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2759
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2760
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2761
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2762
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2763
|
+
<span class="cline-any cline-yes">6x</span>
|
|
2764
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { applyPatch, type Operation } from 'fast-json-patch';
|
|
2765
|
+
import { DEFAULT_LOCAL_OP_TIMEOUT_MS, LocalOpTimeoutError } from './errors';
|
|
2766
|
+
import { withTimeout } from '../../utils/index';
|
|
2767
|
+
import type { QueryPlan, RelationPlan, WhereNode } from '@spooky-sync/query-builder';
|
|
2768
|
+
import {
|
|
2769
|
+
renderOrderSql,
|
|
2770
|
+
renderWhereSql,
|
|
2771
|
+
reviveRow,
|
|
2772
|
+
serializeRow,
|
|
2773
|
+
project,
|
|
2774
|
+
projectedDataSql,
|
|
2775
|
+
} from './sqlite-plan-sql';
|
|
2776
|
+
import type { Logger } from '../logger/index';
|
|
2777
|
+
import type { Sp00kyConfig, StorageHealth } from '../../types';
|
|
2778
|
+
import type { SnapshotMeta, StoredSnapshot } from './cache-engine';
|
|
2779
|
+
import type { SealedQuery } from '../../utils/surql';
|
|
2780
|
+
import { resolveRelations, stableKey } from './relation-resolver';
|
|
2781
|
+
import {
|
|
2782
|
+
createDatabaseEventSystem,
|
|
2783
|
+
DatabaseEventTypes,
|
|
2784
|
+
type DatabaseEventSystem,
|
|
2785
|
+
} from './events/index';
|
|
2786
|
+
import { StaleEpochError } from './local';
|
|
2787
|
+
import { translateSurql, tableOf, setPath, getPath, type SqlOp } from './surql-translate';
|
|
2788
|
+
import {
|
|
2789
|
+
BrokerPortClosedError,
|
|
2790
|
+
PortSqliteTransport,
|
|
2791
|
+
WorkerSqliteTransport,
|
|
2792
|
+
type SqliteTransport,
|
|
2793
|
+
} from './sqlite-transport';
|
|
2794
|
+
import { PROMOTION_OPEN_OPTIONS } from './sqlite-open';
|
|
2795
|
+
import type { EngineTx, Id, LocalStore, OrderBy, RelationFetch, Row } from './cache-engine';
|
|
2796
|
+
import type { EngineStorageDiagnostics } from '../../modules/devtools/storage-info';
|
|
2797
|
+
|
|
2798
|
+
/**
|
|
2799
|
+
* The statement result a pure-write op contributes to a query's results array.
|
|
2800
|
+
* Single source of truth shared by the per-op path (`execOp`) and the batched
|
|
2801
|
+
* fast path in `query()`, so the two can never diverge: a caller that reads a
|
|
2802
|
+
* statement's output sees the same shape whether or not the transaction took the
|
|
2803
|
+
* batch fast path. In particular `create()` compiles to an all-upsert tx
|
|
2804
|
+
* (`createSet` + `createMutation`) and reads `resultIndex:0` for the new row and
|
|
2805
|
+
* its id — the fast path previously returned empty arrays there, so the row (and
|
|
2806
|
+
* its id) was lost and the reconcile crashed in `encodeRecordId`.
|
|
2807
|
+
*
|
|
2808
|
+
* An upsert echoes the written row (`{...data, id}`) with no read-back — the
|
|
2809
|
+
* full merged row is only materialized for a LET-wrapped upsert (see the 'let'
|
|
2810
|
+
* case). delete/deleteAll yield `[]`; noop yields `null`.
|
|
2811
|
+
*/
|
|
2812
|
+
/**
|
|
2813
|
+
* The `_00_*` internal tables the client relies on. The LocalMigrator DEFINEs
|
|
2814
|
+
* them, but every DEFINE lowers to a noop on the SQLite engine, so they must be
|
|
2815
|
+
* created physically at open (see `openInternal`) or a read-before-first-write
|
|
2816
|
+
* on a fresh bucket throws "no such table". Keep in sync with the systemSchema
|
|
2817
|
+
* block in `local-migrator.ts`.
|
|
2818
|
+
*/
|
|
2819
|
+
const SNAPSHOT_TABLE = '_00_circuit_snapshot';
|
|
2820
|
+
|
|
2821
|
+
const SYSTEM_TABLES = [
|
|
2822
|
+
'_00_stream_processor_state',
|
|
2823
|
+
// In-browser circuit snapshot: one BLOB row (`circuit`) + a JSON meta row.
|
|
2824
|
+
// Excluded from DevTools' table listing, since its data column is not JSON.
|
|
2825
|
+
'_00_circuit_snapshot',
|
|
2826
|
+
'_00_view',
|
|
2827
|
+
'_00_window',
|
|
2828
|
+
'_00_failed_mutations',
|
|
2829
|
+
'_00_schema',
|
|
2830
|
+
'_00_pending_mutations',
|
|
2831
|
+
// Blob cache manifest. Read before its first write on every boot (reconcile
|
|
2832
|
+
// asks for the ids it found in OPFS), so it has to exist up front like the
|
|
2833
|
+
// rest — otherwise the very first reconcile throws and the cache runs cold.
|
|
2834
|
+
'_00_blob',
|
|
2835
|
+
// Server-written, synced-down meta tables (see meta_tables_client.surql).
|
|
2836
|
+
// DEFINE is a noop on this engine, so without seeding them here their synced
|
|
2837
|
+
// rows have no local table to land in: feature flags silently fall back to
|
|
2838
|
+
// defaults and app-release update notifications never show.
|
|
2839
|
+
'_00_user_feature',
|
|
2840
|
+
'_00_app_release',
|
|
2841
|
+
] as const;
|
|
2842
|
+
|
|
2843
|
+
export function pureWriteOpResult(op: SqlOp): unknown {
|
|
2844
|
+
switch (op.kind) {
|
|
2845
|
+
case 'upsert':
|
|
2846
|
+
return { ...op.data, id: stableKey(op.id) };
|
|
2847
|
+
case 'noop':
|
|
2848
|
+
return null;
|
|
2849
|
+
default:
|
|
2850
|
+
return [];
|
|
2851
|
+
}
|
|
2852
|
+
}
|
|
2853
|
+
|
|
2854
|
+
/**
|
|
2855
|
+
* Local cache backend on official SQLite-WASM in a dedicated Worker (see
|
|
2856
|
+
* `sqlite-worker.ts`), with OPFS SAHPool persistence. Storage model: one table
|
|
2857
|
+
* per schema table, `id TEXT PRIMARY KEY, data TEXT` where `data` is the row as
|
|
2858
|
+
* JSON. Filtering/ordering use `json_extract`. Relations are decomposed by the
|
|
2859
|
+
* shared {@link resolveRelations} — identical to the SurrealDB backend.
|
|
2860
|
+
*
|
|
2861
|
+
* Value normalization (JSON round-trip):
|
|
2862
|
+
* - `Uint8Array`/bytes → `{ "__u8": <base64> }` (CRDT snapshots survive).
|
|
2863
|
+
* - Record links / ids → their `table:id` string form (so `json_extract`
|
|
2864
|
+
* comparisons and `IN` matching are consistent). NOTE: link fields therefore
|
|
2865
|
+
* read back as strings, not `RecordId` instances — the one shape difference
|
|
2866
|
+
* from the SurrealDB backend, to be closed with schema-driven revival + an
|
|
2867
|
+
* oracle E2E in the browser.
|
|
2868
|
+
*/
|
|
2869
|
+
export class SqliteCacheEngine implements LocalStore {
|
|
2870
|
+
/** The wire to the SQLite worker: an owned dedicated Worker (solo/leader) or
|
|
2871
|
+
* a MessagePort into another tab's worker (follower). See sqlite-transport. */
|
|
2872
|
+
private transport: SqliteTransport | null = null;
|
|
2873
|
+
private storeEpoch = 0;
|
|
2874
|
+
private knownTables = new Set<string>();
|
|
2875
|
+
private useOpfs: boolean;
|
|
2876
|
+
/** Whether `select` runs as one worker round-trip (plan executed in-worker).
|
|
2877
|
+
* Flipped off at runtime if the worker script predates the `select` op
|
|
2878
|
+
* (stale cached bundle) — degrade to the legacy multi-hop path, don't break. */
|
|
2879
|
+
private workerSelect: boolean;
|
|
2880
|
+
/** What `workerSelect` was at construction, so DevTools can tell a runtime
|
|
2881
|
+
* downgrade (configured true, effective false) from a configured-off. */
|
|
2882
|
+
private workerSelectConfigured: boolean;
|
|
2883
|
+
private events: DatabaseEventSystem = createDatabaseEventSystem();
|
|
2884
|
+
private bucketId = 'anon';
|
|
2885
|
+
/** Deadline for one worker round trip; see `localOpTimeoutMs`. */
|
|
2886
|
+
private readonly localOpTimeoutMs: number;
|
|
2887
|
+
/** Durability of the local store, set on every open. A plain Set of callbacks
|
|
2888
|
+
* rather than a `DatabaseEventSystem` event: this changes at most once per
|
|
2889
|
+
* open, and the typed event map is about query traffic. */
|
|
2890
|
+
private storageHealthValue: StorageHealth = { status: 'unknown', fallback: false };
|
|
2891
|
+
private storageHealthSubs = new Set<(health: StorageHealth) => void>();
|
|
2892
|
+
/** Schemaless — tables are created lazily on first write; no migrator. */
|
|
2893
|
+
readonly usesSurqlSchema = false;
|
|
2894
|
+
|
|
2895
|
+
readonly engineKind = 'sqlite' as const;
|
|
2896
|
+
|
|
2897
|
+
/** Shared-tabs mode: the engine's transport is swapped at runtime by the
|
|
2898
|
+
* TabsCoordinator (owner worker as leader, leader's port as follower). */
|
|
2899
|
+
private shared: boolean;
|
|
2900
|
+
/** Leaderless parking (shared mode): ops entering the opQueue await this
|
|
2901
|
+
* gate until a new role lands or the timeout rejects them. */
|
|
2902
|
+
private roleGate: { promise: Promise<void>; release: () => void } | null = null;
|
|
2903
|
+
private roleGateTimer: ReturnType<typeof setTimeout> | null = null;
|
|
2904
|
+
|
|
2905
|
+
constructor(
|
|
2906
|
+
private config: Sp00kyConfig<any>['database'],
|
|
2907
|
+
private logger: Logger,
|
|
2908
|
+
opts: { useOpfs?: boolean; workerSelect?: boolean; shared?: boolean } = {}
|
|
2909
|
+
) {
|
|
2910
|
+
this.localOpTimeoutMs = Math.max(0, config.localOpTimeoutMs ?? DEFAULT_LOCAL_OP_TIMEOUT_MS);
|
|
2911
|
+
this.useOpfs = opts.useOpfs ?? true;
|
|
2912
|
+
this.workerSelect = opts.workerSelect ?? config.workerSelect ?? true;
|
|
2913
|
+
this.workerSelectConfigured = this.workerSelect;
|
|
2914
|
+
this.shared = opts.shared ?? false;
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2917
|
+
get epoch(): number {
|
|
2918
|
+
return this.storeEpoch;
|
|
2919
|
+
}
|
|
2920
|
+
|
|
2921
|
+
get currentBucketId(): string {
|
|
2922
|
+
return this.bucketId;
|
|
2923
|
+
}
|
|
2924
|
+
|
|
2925
|
+
get storageHealth(): StorageHealth {
|
|
2926
|
+
return this.storageHealthValue;
|
|
2927
|
+
}
|
|
2928
|
+
|
|
2929
|
+
/** Fires immediately with the current snapshot (the store opens during
|
|
2930
|
+
* `connect()`, before app components mount, so a late subscriber must still
|
|
2931
|
+
* learn a fallback happened), then on every change. */
|
|
2932
|
+
subscribeToStorageHealth(cb: (health: StorageHealth) => void): () => void {
|
|
2933
|
+
cb(this.storageHealthValue);
|
|
2934
|
+
this.storageHealthSubs.add(cb);
|
|
2935
|
+
return () => {
|
|
2936
|
+
this.storageHealthSubs.delete(cb);
|
|
2937
|
+
};
|
|
2938
|
+
}
|
|
2939
|
+
|
|
2940
|
+
private setStorageHealth(health: StorageHealth): void {
|
|
2941
|
+
this.storageHealthValue = health;
|
|
2942
|
+
for (const cb of this.storageHealthSubs) <span class="branch-0 cbranch-no" title="branch not covered" >cb(health);</span>
|
|
2943
|
+
}
|
|
2944
|
+
|
|
2945
|
+
<span class="fstat-no" title="function not covered" > getConfig(): Sp00kyConfig<any>['database'] {</span>
|
|
2946
|
+
<span class="cstat-no" title="statement not covered" > return this.config;</span>
|
|
2947
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2948
|
+
|
|
2949
|
+
/**
|
|
2950
|
+
* Storage numbers for the DevTools Storage tab. Uses {@link call} so the
|
|
2951
|
+
* reads serialize with regular traffic (no SQLITE_BUSY). Never throws — the
|
|
2952
|
+
* worker may be mid bucket-switch; a failure lands in `error` instead.
|
|
2953
|
+
*/
|
|
2954
|
+
async getStorageDiagnostics(opts?: { tableCounts?: boolean }): Promise<EngineStorageDiagnostics> {
|
|
2955
|
+
const diag: EngineStorageDiagnostics = {
|
|
2956
|
+
engine: 'sqlite',
|
|
2957
|
+
bucketId: this.bucketId,
|
|
2958
|
+
useOpfs: this.useOpfs,
|
|
2959
|
+
workerSelectConfigured: this.workerSelectConfigured,
|
|
2960
|
+
workerSelectEffective: this.workerSelect,
|
|
2961
|
+
};
|
|
2962
|
+
try {
|
|
2963
|
+
const { rows } = await this.call<{ rows: { bytes: number; freelist: number }[] }>('exec', {
|
|
2964
|
+
sql:
|
|
2965
|
+
'SELECT (SELECT * FROM pragma_page_count()) * (SELECT * FROM pragma_page_size()) AS bytes, ' +
|
|
2966
|
+
'(SELECT * FROM pragma_freelist_count()) * (SELECT * FROM pragma_page_size()) AS freelist',
|
|
2967
|
+
});
|
|
2968
|
+
diag.dbSizeBytes = rows?.[0]?.bytes;
|
|
2969
|
+
diag.freelistBytes = rows?.[0]?.freelist;
|
|
2970
|
+
if (opts?.tableCounts) {
|
|
2971
|
+
const { rows: tables } = await this.call<{ rows: { name: string }[] }>('exec', {
|
|
2972
|
+
sql: "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name",
|
|
2973
|
+
});
|
|
2974
|
+
const names = (<span class="branch-0 cbranch-no" title="branch not covered" >tables ?? []).m</span>ap((r) => r.name).filter((n) => n !== SNAPSHOT_TABLE);
|
|
2975
|
+
if (names.length) {
|
|
2976
|
+
// Names come from sqlite_master itself; double-quoting is enough.
|
|
2977
|
+
const sql = names
|
|
2978
|
+
.map((n) => `SELECT '${n.replace(/'/g, "''")}' AS t, COUNT(*) AS n FROM "${n.replace(/"/g, '""')}"`)
|
|
2979
|
+
.join(' UNION ALL ');
|
|
2980
|
+
const { rows: counts } = await this.call<{ rows: { t: string; n: number }[] }>('exec', {
|
|
2981
|
+
sql,
|
|
2982
|
+
});
|
|
2983
|
+
diag.tableCounts = (<span class="branch-0 cbranch-no" title="branch not covered" >counts ?? []).m</span>ap((r) => ({ table: r.t, rows: r.n }));
|
|
2984
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
|
|
2985
|
+
<span class="cstat-no" title="statement not covered" > diag.tableCounts = [];</span>
|
|
2986
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2987
|
+
}
|
|
2988
|
+
} catch (e) {
|
|
2989
|
+
diag.error = e instanceof Error ? e.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(e);</span>
|
|
2990
|
+
}
|
|
2991
|
+
return diag;
|
|
2992
|
+
}
|
|
2993
|
+
|
|
2994
|
+
<span class="fstat-no" title="function not covered" > getEvents(): DatabaseEventSystem {</span>
|
|
2995
|
+
<span class="cstat-no" title="statement not covered" > return this.events;</span>
|
|
2996
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2997
|
+
|
|
2998
|
+
<span class="fstat-no" title="function not covered" > getClient(): unknown {</span>
|
|
2999
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('SqliteCacheEngine has no SurrealDB client (getClient is unavailable).');</span>
|
|
3000
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3001
|
+
|
|
3002
|
+
/** LocalStore alias; SQLite has no in-flight gate, so this maps to a rebuild. */
|
|
3003
|
+
<span class="fstat-no" title="function not covered" > switchStore(bucketId: string): Promise<void> {</span>
|
|
3004
|
+
<span class="cstat-no" title="statement not covered" > return this.switchBucket(bucketId);</span>
|
|
3005
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3006
|
+
|
|
3007
|
+
/** SQLite has no switch gate window; the epoch bump alone fences stale writes. */
|
|
3008
|
+
<span class="fstat-no" title="function not covered" > beginSwitch(): () => void {</span>
|
|
3009
|
+
<span class="cstat-no" title="statement not covered" > return () => {};</span>
|
|
3010
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3011
|
+
|
|
3012
|
+
// ---- worker plumbing -----------------------------------------------------
|
|
3013
|
+
|
|
3014
|
+
/** Serializes every worker op so reads/writes never overlap at the VFS layer
|
|
3015
|
+
* (overlapping ops trip SQLITE_BUSY). Mirrors the SurrealDB engine's
|
|
3016
|
+
* single-flight query queue. (The worker keeps its own chain too, for
|
|
3017
|
+
* multi-client mode; this one additionally provides the queue-wait stat and
|
|
3018
|
+
* the boot/switch atomicity below.) */
|
|
3019
|
+
private opQueue: Promise<unknown> = Promise.resolve();
|
|
3020
|
+
|
|
3021
|
+
private call<T = any>(type: string, payload?: unknown): Promise<T> {
|
|
3022
|
+
const enqueuedAt = performance.now();
|
|
3023
|
+
const run = async () => {
|
|
3024
|
+
// Leaderless window (shared mode): park behind the role gate instead of
|
|
3025
|
+
// failing; a new leader releases it, the timeout rejects it.
|
|
3026
|
+
if (this.roleGate) await this.roleGate.promise;
|
|
3027
|
+
// Time spent waiting behind other ops in the queue, not doing work.
|
|
3028
|
+
getStats().queueWaitMs += performance.now() - enqueuedAt;
|
|
3029
|
+
return this.rawCall<T>(type, payload);
|
|
3030
|
+
};
|
|
3031
|
+
const result = this.opQueue.then(run, run);
|
|
3032
|
+
// Keep the chain alive regardless of individual failures.
|
|
3033
|
+
this.opQueue = result.then(
|
|
3034
|
+
() => undefined,
|
|
3035
|
+
() => undefined
|
|
3036
|
+
);
|
|
3037
|
+
return result;
|
|
3038
|
+
}
|
|
3039
|
+
|
|
3040
|
+
/**
|
|
3041
|
+
* Ops dispatched to the worker and not yet answered. Role transitions run on
|
|
3042
|
+
* their own chain (see {@link transitionChain}), so they can start while the
|
|
3043
|
+
* opQueue still has an op at the worker; tearing the transport down under it
|
|
3044
|
+
* would reject that op — and its caller may be a query whose only fetch this
|
|
3045
|
+
* was. {@link drainInFlight} lets a deliberate teardown wait them out.
|
|
3046
|
+
*/
|
|
3047
|
+
private inFlightCalls = new Set<Promise<unknown>>();
|
|
3048
|
+
|
|
3049
|
+
/** Wait for dispatched ops to answer before a deliberate transport teardown.
|
|
3050
|
+
* Bounded: a wedged worker must not block the role change forever. */
|
|
3051
|
+
private async drainInFlight(timeoutMs = 2_000): Promise<void> {
|
|
3052
|
+
if (this.inFlightCalls.size === 0) return;
|
|
3053
|
+
const settled = Promise.all([...this.inFlightCalls].map((p) => p.catch(() => undefined)));
|
|
3054
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
3055
|
+
try {
|
|
3056
|
+
await Promise.race([
|
|
3057
|
+
settled,
|
|
3058
|
+
new Promise<void>((resolve) => {
|
|
3059
|
+
timer = setTimeout(resolve, timeoutMs);
|
|
3060
|
+
}),
|
|
3061
|
+
]);
|
|
3062
|
+
} finally {
|
|
3063
|
+
if (timer) clearTimeout(timer);
|
|
3064
|
+
}
|
|
3065
|
+
}
|
|
3066
|
+
|
|
3067
|
+
private rawCall<T = any>(type: string, payload?: unknown): Promise<T> {
|
|
3068
|
+
if (!this.transport) throw new Error('SqliteCacheEngine: not connected');
|
|
3069
|
+
// --- instrumentation: live, inspectable via `globalThis.__sqliteStats` ---
|
|
3070
|
+
const s = getStats();
|
|
3071
|
+
s.roundTrips++;
|
|
3072
|
+
s.byType[type] = (s.byType[type] ?? 0) + 1;
|
|
3073
|
+
if (type === 'batch' && Array.isArray(payload)) {
|
|
3074
|
+
s.batchStatements += payload.length;
|
|
3075
|
+
s.maxBatch = Math.max(s.maxBatch, payload.length);
|
|
3076
|
+
}
|
|
3077
|
+
s.inFlight++;
|
|
3078
|
+
s.maxInFlight = Math.max(s.maxInFlight, s.inFlight);
|
|
3079
|
+
if (this.transport.kind === 'port') s.proxiedOps = (s.proxiedOps ?? 0) + 1;
|
|
3080
|
+
const sentAt = performance.now();
|
|
3081
|
+
// Track the dispatch, not the returned promise: attaching a handler to
|
|
3082
|
+
// `result` would mark it handled and swallow the unhandled-rejection
|
|
3083
|
+
// reports that surface a caller which forgot to catch.
|
|
3084
|
+
let settle!: () => void;
|
|
3085
|
+
const tracked = new Promise<void>((res) => {
|
|
3086
|
+
settle = res;
|
|
3087
|
+
});
|
|
3088
|
+
this.inFlightCalls.add(tracked);
|
|
3089
|
+
const finish = () => {
|
|
3090
|
+
this.inFlightCalls.delete(tracked);
|
|
3091
|
+
settle();
|
|
3092
|
+
};
|
|
3093
|
+
// Deadline per op. The transport parks a call until the worker replies,
|
|
3094
|
+
// and a worker starved behind a long op (or wedged on an unbounded lock
|
|
3095
|
+
// check) answered never; every caller up the stack then waited forever.
|
|
3096
|
+
// Reject the CALLER only: the op is still queued in the worker and its
|
|
3097
|
+
// late reply is dropped by the transport (no pending entry left to
|
|
3098
|
+
// resolve). Deliberately no teardown here - a slow worker is not a dead
|
|
3099
|
+
// one, and killing it mid-write would cost more than the wait.
|
|
3100
|
+
const timeoutMs = this.localOpTimeoutMs;
|
|
3101
|
+
const result = withTimeout(
|
|
3102
|
+
this.transport.call<T>(type, payload),
|
|
3103
|
+
timeoutMs,
|
|
3104
|
+
() => new LocalOpTimeoutError(type, timeoutMs)
|
|
3105
|
+
).then(
|
|
3106
|
+
(v: T) => {
|
|
3107
|
+
finish();
|
|
3108
|
+
s.inFlight--;
|
|
3109
|
+
// Split the round-trip: `wt` is time inside the worker's handler,
|
|
3110
|
+
// the remainder is postMessage + scheduling overhead.
|
|
3111
|
+
const wt = (v as { wt?: unknown } | null)?.wt;
|
|
3112
|
+
if (typeof wt === 'number') {
|
|
3113
|
+
s.workerMs += wt;
|
|
3114
|
+
s.rpcOverheadMs += Math.max(0, performance.now() - sentAt - wt);
|
|
3115
|
+
}
|
|
3116
|
+
return v;
|
|
3117
|
+
},
|
|
3118
|
+
(e: unknown) => {
|
|
3119
|
+
finish();
|
|
3120
|
+
s.inFlight--;
|
|
3121
|
+
if (e instanceof LocalOpTimeoutError) {
|
|
3122
|
+
s.timeouts = (s.timeouts ?? 0) + 1;
|
|
3123
|
+
this.logger.error(
|
|
3124
|
+
{ type, timeoutMs, Category: 'sp00ky-client::SqliteCacheEngine::rawCall' },
|
|
3125
|
+
'Local store op did not answer within its deadline; rejecting the caller'
|
|
3126
|
+
);
|
|
3127
|
+
}
|
|
3128
|
+
throw e;
|
|
3129
|
+
}
|
|
3130
|
+
);
|
|
3131
|
+
return result;
|
|
3132
|
+
}
|
|
3133
|
+
|
|
3134
|
+
/**
|
|
3135
|
+
* Spawn the worker and open `bucketId`'s DB. Uses {@link rawCall} (NOT
|
|
3136
|
+
* {@link call}) so it can run as the body of an already-queued opQueue entry
|
|
3137
|
+
* without re-queuing onto itself. Callers must run it through the opQueue.
|
|
3138
|
+
*/
|
|
3139
|
+
/** Seam for tests: swap in a fake transport instead of a real Worker. */
|
|
3140
|
+
protected <span class="fstat-no" title="function not covered" >createTransport(): SqliteTransport {</span>
|
|
3141
|
+
<span class="cstat-no" title="statement not covered" > return new WorkerSqliteTransport(this.logger);</span>
|
|
3142
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3143
|
+
|
|
3144
|
+
private async openInternal(
|
|
3145
|
+
bucketId: string,
|
|
3146
|
+
extras?: {
|
|
3147
|
+
workerLockName?: string;
|
|
3148
|
+
openOptions?: { maxAttempts?: number; backoffMs?: number[]; disallowMemoryFallback?: boolean };
|
|
3149
|
+
}
|
|
3150
|
+
): Promise<void> {
|
|
3151
|
+
if (!this.<span class="branch-0 cbranch-no" title="branch not covered" >transport || this.transport.kind !== <span class="branch-0 cbranch-no" title="branch not covered" >'worker' || !</span>this.transport.connected) {</span>
|
|
3152
|
+
this.transport = this.createTransport();
|
|
3153
|
+
if (this.transport instanceof WorkerSqliteTransport) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3154
|
+
// The worker fencing itself (leadership stolen from a frozen tab that
|
|
3155
|
+
// thawed) is a leader-loss: park ops until the broker re-adopts us.
|
|
3156
|
+
<span class="cstat-no" title="statement not covered" > this.transport.onLockLost = <span class="fstat-no" title="function not covered" >(reason) => {</span></span>
|
|
3157
|
+
<span class="cstat-no" title="statement not covered" > this.transport = null;</span>
|
|
3158
|
+
<span class="cstat-no" title="statement not covered" > this.storeEpoch++;</span>
|
|
3159
|
+
<span class="cstat-no" title="statement not covered" > this.openRoleGate(`worker fenced: ${reason}`);</span>
|
|
3160
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
3161
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3162
|
+
}
|
|
3163
|
+
// Seed the `_00_*` system tables as part of `open` (worker-side, one round
|
|
3164
|
+
// trip). The LocalMigrator DEFINEs them, but `translateSurql` lowers every
|
|
3165
|
+
// DEFINE to a noop on this engine (SQLite has no DDL vocabulary), so
|
|
3166
|
+
// provisioning never actually creates them — they were only made lazily on
|
|
3167
|
+
// first WRITE. A fresh bucket (e.g. right after signup) that READS one first
|
|
3168
|
+
// (the sync layer selects `_00_query` before any row lands) hit
|
|
3169
|
+
// "no such table: _00_query" and the client wedged on "Loading database".
|
|
3170
|
+
// Creating them inside `open` guarantees any access order is safe without
|
|
3171
|
+
// adding ops to the engine's queue.
|
|
3172
|
+
// `opfsError` is absent from a worker bundle older than this field, which
|
|
3173
|
+
// just reads as "no reason given" rather than breaking the open.
|
|
3174
|
+
const { persisted, opfsError } = await this.rawCall<{
|
|
3175
|
+
persisted: boolean;
|
|
3176
|
+
opfsError?: string;
|
|
3177
|
+
}>('open', {
|
|
3178
|
+
dbName: bucketId,
|
|
3179
|
+
useOpfs: this.useOpfs,
|
|
3180
|
+
systemTables: SYSTEM_TABLES,
|
|
3181
|
+
...(extras?.workerLockName ? { workerLockName: extras.workerLockName } : {}),
|
|
3182
|
+
...(extras?.openOptions ? { openOptions: extras.openOptions } : {}),
|
|
3183
|
+
});
|
|
3184
|
+
this.knownTables.clear();
|
|
3185
|
+
for (const t of SYSTEM_TABLES) this.knownTables.add(t);
|
|
3186
|
+
this.bucketId = bucketId;
|
|
3187
|
+
// Durability was requested but could not be had: the store is in RAM, so it
|
|
3188
|
+
// loses local writes on reload and can OOM a wasm-heavy renderer. Report it
|
|
3189
|
+
// (the worker also console.errors, since host apps may run pino at `fatal`)
|
|
3190
|
+
// and publish it so the app can warn the user.
|
|
3191
|
+
const fellBack = this.useOpfs && !persisted;
|
|
3192
|
+
// Omit `error` rather than setting it to `undefined`: the devtools
|
|
3193
|
+
// serializer renders an undefined value as the STRING 'undefined'.
|
|
3194
|
+
const health: StorageHealth = {
|
|
3195
|
+
status: persisted ? 'persistent' : 'memory',
|
|
3196
|
+
fallback: fellBack,
|
|
3197
|
+
};
|
|
3198
|
+
if (fellBack && opfsError) health.error = opfsError;
|
|
3199
|
+
if (this.shared) health.role = this.roleLabel;
|
|
3200
|
+
this.setStorageHealth(health);
|
|
3201
|
+
const stats = getStats();
|
|
3202
|
+
stats.persisted = persisted;
|
|
3203
|
+
if (fellBack && opfsError) stats.opfsError = opfsError;
|
|
3204
|
+
else delete stats.opfsError;
|
|
3205
|
+
if (fellBack) {
|
|
3206
|
+
this.logger.error(
|
|
3207
|
+
{ bucketId, opfsError, Category: 'sp00ky-client::SqliteCacheEngine::connect' },
|
|
3208
|
+
'SQLite OPFS persistence failed; store is IN MEMORY and will not survive reload'
|
|
3209
|
+
);
|
|
3210
|
+
} else {
|
|
3211
|
+
this.logger.info(
|
|
3212
|
+
{ bucketId, persisted, Category: 'sp00ky-client::SqliteCacheEngine::connect' },
|
|
3213
|
+
persisted ? 'SQLite OPFS store opened' : 'SQLite in-memory store opened (as configured)'
|
|
3214
|
+
);
|
|
3215
|
+
}
|
|
3216
|
+
}
|
|
3217
|
+
|
|
3218
|
+
/** Enqueue `fn` as a single serialized opQueue entry (mirrors {@link call}'s
|
|
3219
|
+
* chaining) so it can't interleave with reads/writes at the worker. */
|
|
3220
|
+
private enqueue<T>(fn: () => Promise<T>): Promise<T> {
|
|
3221
|
+
const result = this.opQueue.then(fn, fn);
|
|
3222
|
+
this.opQueue = result.then(
|
|
3223
|
+
() => undefined,
|
|
3224
|
+
() => undefined
|
|
3225
|
+
);
|
|
3226
|
+
return result;
|
|
3227
|
+
}
|
|
3228
|
+
|
|
3229
|
+
async connect(bucketId: string): Promise<void> {
|
|
3230
|
+
// Serialize through the opQueue so an op racing boot can't dispatch to a
|
|
3231
|
+
// half-open worker.
|
|
3232
|
+
await this.enqueue(() => this.openInternal(bucketId));
|
|
3233
|
+
}
|
|
3234
|
+
|
|
3235
|
+
async switchBucket(bucketId: string): Promise<void> {
|
|
3236
|
+
this.storeEpoch++;
|
|
3237
|
+
// Run close → terminate → reopen as ONE opQueue entry. Previously `close`
|
|
3238
|
+
// and the new `open` were separate entries, so a query's `exec` (e.g. the
|
|
3239
|
+
// query re-registration fired by an auth/bucket change) could slot in
|
|
3240
|
+
// between and dispatch to the just-closed worker → "sqlite: DB not open".
|
|
3241
|
+
// As a single entry, every other op runs fully before the close or after
|
|
3242
|
+
// the reopen — never against a closed DB.
|
|
3243
|
+
await this.enqueue(async () => {
|
|
3244
|
+
if (this.transport) {
|
|
3245
|
+
try {
|
|
3246
|
+
await this.rawCall('close');
|
|
3247
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
|
|
3248
|
+
/* ignore */
|
|
3249
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3250
|
+
this.transport.close('bucket switch');
|
|
3251
|
+
this.transport = null;
|
|
3252
|
+
}
|
|
3253
|
+
await this.openInternal(bucketId);
|
|
3254
|
+
});
|
|
3255
|
+
}
|
|
3256
|
+
|
|
3257
|
+
<span class="fstat-no" title="function not covered" > async close(): Promise<void> {</span>
|
|
3258
|
+
<span class="cstat-no" title="statement not covered" > if (!this.transport) return;</span>
|
|
3259
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3260
|
+
<span class="cstat-no" title="statement not covered" > await this.call('close');</span>
|
|
3261
|
+
<span class="cstat-no" title="statement not covered" > } catch {</span>
|
|
3262
|
+
/* ignore */
|
|
3263
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3264
|
+
<span class="cstat-no" title="statement not covered" > this.transport.close('engine closed');</span>
|
|
3265
|
+
<span class="cstat-no" title="statement not covered" > this.transport = null;</span>
|
|
3266
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3267
|
+
|
|
3268
|
+
// ---- shared-tabs role modes ------------------------------------------------
|
|
3269
|
+
// The TabsCoordinator drives these; solo mode never touches them. The engine
|
|
3270
|
+
// object is never replaced across role changes, so `storeEpoch` stays one
|
|
3271
|
+
// monotonic per-tab counter and every existing fencing consumer keeps
|
|
3272
|
+
// working unchanged.
|
|
3273
|
+
|
|
3274
|
+
/** Which role the current transport represents, for StorageHealth. */
|
|
3275
|
+
private roleLabel: 'leader' | 'follower' | 'solo' = 'solo';
|
|
3276
|
+
/** True once this engine has had a usable store at least once; role changes
|
|
3277
|
+
* after that point invalidate in-flight reads and must bump the epoch. */
|
|
3278
|
+
private hadStore = false;
|
|
3279
|
+
|
|
3280
|
+
/**
|
|
3281
|
+
* Role transitions run on their OWN chain, never on the opQueue: parked ops
|
|
3282
|
+
* sit INSIDE opQueue entries waiting for the role gate, so a transition
|
|
3283
|
+
* queued behind them could never run to release them (deadlock). Transitions
|
|
3284
|
+
* are safe off-queue because in-flight ops on a dead transport were already
|
|
3285
|
+
* rejected, parked ops only resume after the transition completes, and the
|
|
3286
|
+
* worker serializes everything worker-side anyway.
|
|
3287
|
+
*/
|
|
3288
|
+
private transitionChain: Promise<unknown> = Promise.resolve();
|
|
3289
|
+
|
|
3290
|
+
private chainTransition<T>(fn: () => Promise<T>): Promise<T> {
|
|
3291
|
+
const result = this.transitionChain.then(fn, fn);
|
|
3292
|
+
this.transitionChain = result.then(
|
|
3293
|
+
() => undefined,
|
|
3294
|
+
() => undefined
|
|
3295
|
+
);
|
|
3296
|
+
return result;
|
|
3297
|
+
}
|
|
3298
|
+
|
|
3299
|
+
private openRoleGate(reason: string): void {
|
|
3300
|
+
if (this.roleGate) <span class="branch-0 cbranch-no" title="branch not covered" >return;</span>
|
|
3301
|
+
let release!: () => void;
|
|
3302
|
+
let rejectFn!: (e: Error) => void;
|
|
3303
|
+
const promise = new Promise<void>((res, rej) => {
|
|
3304
|
+
release = res;
|
|
3305
|
+
rejectFn = rej;
|
|
3306
|
+
});
|
|
3307
|
+
// Swallow the timeout rejection for waiters that already resolved.
|
|
3308
|
+
promise.catch(() => {});
|
|
3309
|
+
this.roleGate = { promise, release };
|
|
3310
|
+
this.roleGateTimer = setTimeout(() => {
|
|
3311
|
+
// Nothing adopted us in time: reject the parked ops (retryable) and drop
|
|
3312
|
+
// the gate so later calls fail fast with 'not connected'.
|
|
3313
|
+
<span class="cstat-no" title="statement not covered" > rejectFn(new BrokerPortClosedError(`no leader adopted this tab: ${reason}`));</span>
|
|
3314
|
+
<span class="cstat-no" title="statement not covered" > this.roleGate = null;</span>
|
|
3315
|
+
<span class="cstat-no" title="statement not covered" > this.roleGateTimer = null;</span>
|
|
3316
|
+
}, 20_000);
|
|
3317
|
+
}
|
|
3318
|
+
|
|
3319
|
+
private closeRoleGate(): void {
|
|
3320
|
+
if (this.roleGateTimer) clearTimeout(this.roleGateTimer);
|
|
3321
|
+
this.roleGateTimer = null;
|
|
3322
|
+
this.roleGate?.release();
|
|
3323
|
+
this.roleGate = null;
|
|
3324
|
+
}
|
|
3325
|
+
|
|
3326
|
+
/**
|
|
3327
|
+
* Become the store owner (leader). Boot and failover share this path; a
|
|
3328
|
+
* failover (a previous transport existed) bumps the epoch FIRST so every
|
|
3329
|
+
* in-flight chain that captured the old epoch fences itself. `resumeHeld`
|
|
3330
|
+
* keeps the live worker after a broker restart and only rolls the
|
|
3331
|
+
* per-leadership lock forward.
|
|
3332
|
+
*/
|
|
3333
|
+
async adoptOwner(
|
|
3334
|
+
bucketId: string,
|
|
3335
|
+
opts: {
|
|
3336
|
+
workerLockName: string;
|
|
3337
|
+
allowMemoryFallback: boolean;
|
|
3338
|
+
resumeHeld: boolean;
|
|
3339
|
+
}
|
|
3340
|
+
): Promise<StorageHealth> {
|
|
3341
|
+
this.roleLabel = 'leader';
|
|
3342
|
+
return this.chainTransition(async () => {
|
|
3343
|
+
if (
|
|
3344
|
+
opts.<span class="branch-0 cbranch-no" title="branch not covered" >resumeHeld &&</span>
|
|
3345
|
+
<span class="cstat-no" title="statement not covered" > this.transport?.kind === <span class="branch-0 cbranch-no" title="branch not covered" >'worker' &&</span></span>
|
|
3346
|
+
<span class="cstat-no" title="statement not covered" > this.transport.<span class="branch-0 cbranch-no" title="branch not covered" >connected &&</span></span>
|
|
3347
|
+
<span class="cstat-no" title="statement not covered" > this.bucketId === bucketId</span>
|
|
3348
|
+
) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3349
|
+
<span class="cstat-no" title="statement not covered" > await this.rawCall('relock', { workerLockName: opts.workerLockName });</span>
|
|
3350
|
+
<span class="cstat-no" title="statement not covered" > this.closeRoleGate();</span>
|
|
3351
|
+
<span class="cstat-no" title="statement not covered" > return this.storageHealthValue;</span>
|
|
3352
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3353
|
+
if (this.transport) await this.drainInFlight();
|
|
3354
|
+
if (this.hadStore) this.storeEpoch++;
|
|
3355
|
+
if (this.transport) {
|
|
3356
|
+
try {
|
|
3357
|
+
if (this.transport.kind === 'worker') await this.rawCall('close');
|
|
3358
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
|
|
3359
|
+
/* ignore */
|
|
3360
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3361
|
+
this.transport.close('adopting ownership', new BrokerPortClosedError('adopting ownership'));
|
|
3362
|
+
this.transport = null;
|
|
3363
|
+
}
|
|
3364
|
+
await this.openInternal(bucketId, {
|
|
3365
|
+
workerLockName: opts.workerLockName,
|
|
3366
|
+
openOptions: {
|
|
3367
|
+
...PROMOTION_OPEN_OPTIONS,
|
|
3368
|
+
disallowMemoryFallback: !opts.allowMemoryFallback,
|
|
3369
|
+
},
|
|
3370
|
+
});
|
|
3371
|
+
getStats().roleChanges = (getStats().roleChanges ?? 0) + 1;
|
|
3372
|
+
this.hadStore = true;
|
|
3373
|
+
this.closeRoleGate();
|
|
3374
|
+
return this.storageHealthValue;
|
|
3375
|
+
});
|
|
3376
|
+
}
|
|
3377
|
+
|
|
3378
|
+
/** Attach to a leader's worker through `dbPort` (follower). */
|
|
3379
|
+
async adoptAttached(
|
|
3380
|
+
dbPort: MessagePort,
|
|
3381
|
+
snapshot: { bucketId: string; storageHealth: StorageHealth },
|
|
3382
|
+
onPortDead: (reason: string) => void
|
|
3383
|
+
): Promise<void> {
|
|
3384
|
+
this.roleLabel = 'follower';
|
|
3385
|
+
return this.chainTransition(async () => {
|
|
3386
|
+
if (this.transport) <span class="branch-0 cbranch-no" title="branch not covered" >await this.drainInFlight();</span>
|
|
3387
|
+
if (this.hadStore) <span class="branch-0 cbranch-no" title="branch not covered" >this.storeEpoch++;</span>
|
|
3388
|
+
this.<span class="branch-0 cbranch-no" title="branch not covered" >transport?.close(</span>
|
|
3389
|
+
'adopting leader port',
|
|
3390
|
+
new BrokerPortClosedError('adopting leader port')
|
|
3391
|
+
);
|
|
3392
|
+
this.transport = new PortSqliteTransport(dbPort, onPortDead, this.logger);
|
|
3393
|
+
this.bucketId = snapshot.bucketId;
|
|
3394
|
+
// The shared store exists and is seeded; mirror the owner's bookkeeping.
|
|
3395
|
+
this.knownTables.clear();
|
|
3396
|
+
for (const t of SYSTEM_TABLES) this.knownTables.add(t);
|
|
3397
|
+
const health: StorageHealth = { ...snapshot.storageHealth, role: 'follower' };
|
|
3398
|
+
this.setStorageHealth(health);
|
|
3399
|
+
const stats = getStats();
|
|
3400
|
+
stats.persisted = snapshot.storageHealth.status === 'persistent';
|
|
3401
|
+
stats.roleChanges = (stats.<span class="branch-0 cbranch-no" title="branch not covered" >roleChanges ?? 0) + 1</span>;
|
|
3402
|
+
delete stats.opfsError;
|
|
3403
|
+
this.hadStore = true;
|
|
3404
|
+
this.closeRoleGate();
|
|
3405
|
+
});
|
|
3406
|
+
}
|
|
3407
|
+
|
|
3408
|
+
/** Demoted while owning the store (zombie thaw, stale promotion): tear the
|
|
3409
|
+
* worker down so its OPFS handles free up, then park until re-adopted. */
|
|
3410
|
+
async releaseOwnership(): Promise<void> {
|
|
3411
|
+
await this.chainTransition(async () => {
|
|
3412
|
+
if (this.transport) {
|
|
3413
|
+
// Let ops already at the worker answer first. Without this they die
|
|
3414
|
+
// with the transport — a bucket switch (moveToBucket → teardownLeader)
|
|
3415
|
+
// runs while the opQueue may still have a query's fetch in flight, and
|
|
3416
|
+
// that fetch's caller is not necessarily prepared to retry.
|
|
3417
|
+
await this.drainInFlight();
|
|
3418
|
+
try {
|
|
3419
|
+
if (this.transport.kind === 'worker') {
|
|
3420
|
+
await (this.transport as WorkerSqliteTransport).shutdown();
|
|
3421
|
+
}
|
|
3422
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
|
|
3423
|
+
/* worker may already be fenced/dead */
|
|
3424
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3425
|
+
// Anything still pending (drain timed out) is a deliberate teardown,
|
|
3426
|
+
// not a crash: fail it the way a follower's lost port does, so the
|
|
3427
|
+
// error text is honest and callers can treat it as retryable.
|
|
3428
|
+
this.transport.close(
|
|
3429
|
+
'ownership released',
|
|
3430
|
+
new BrokerPortClosedError('ownership released')
|
|
3431
|
+
);
|
|
3432
|
+
this.transport = null;
|
|
3433
|
+
}
|
|
3434
|
+
this.storeEpoch++;
|
|
3435
|
+
this.openRoleGate('ownership released');
|
|
3436
|
+
});
|
|
3437
|
+
}
|
|
3438
|
+
|
|
3439
|
+
/** The leader (or its port) died. Called from the port-dead callback and the
|
|
3440
|
+
* coordinator; NOT enqueued, so in-flight ops reject immediately instead of
|
|
3441
|
+
* waiting behind whatever is stuck. */
|
|
3442
|
+
onLeaderLost(reason: string): void {
|
|
3443
|
+
if (this.transport?.kind === 'port') {
|
|
3444
|
+
this.transport.close(reason);
|
|
3445
|
+
this.transport = null;
|
|
3446
|
+
}
|
|
3447
|
+
this.storeEpoch++;
|
|
3448
|
+
this.openRoleGate(reason);
|
|
3449
|
+
}
|
|
3450
|
+
|
|
3451
|
+
/** Leader side: forward a follower's dbPort into the owned worker. */
|
|
3452
|
+
<span class="fstat-no" title="function not covered" > async exposeClientPort(clientId: string, port: MessagePort): Promise<void> {</span>
|
|
3453
|
+
<span class="cstat-no" title="statement not covered" > if (this.transport?.kind !== 'worker') {</span>
|
|
3454
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('SqliteCacheEngine: not the store owner');</span>
|
|
3455
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3456
|
+
<span class="cstat-no" title="statement not covered" > await (this.transport as WorkerSqliteTransport).addClientPort(clientId, port);</span>
|
|
3457
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3458
|
+
|
|
3459
|
+
<span class="fstat-no" title="function not covered" > async removeClientPort(clientId: string): Promise<void> {</span>
|
|
3460
|
+
<span class="cstat-no" title="statement not covered" > if (this.transport?.kind !== 'worker') return;</span>
|
|
3461
|
+
<span class="cstat-no" title="statement not covered" > await (this.transport as WorkerSqliteTransport).removeClientPort(clientId);</span>
|
|
3462
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3463
|
+
|
|
3464
|
+
/** Graceful pagehide as owner: release OPFS handles NOW so the next leader
|
|
3465
|
+
* does not race the browser's worker GC. */
|
|
3466
|
+
<span class="fstat-no" title="function not covered" > async shutdownOwnedWorker(): Promise<void> {</span>
|
|
3467
|
+
<span class="cstat-no" title="statement not covered" > if (this.transport?.kind !== 'worker') return;</span>
|
|
3468
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
3469
|
+
<span class="cstat-no" title="statement not covered" > await (this.transport as WorkerSqliteTransport).shutdown();</span>
|
|
3470
|
+
<span class="cstat-no" title="statement not covered" > } catch {</span>
|
|
3471
|
+
/* ignore */
|
|
3472
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3473
|
+
<span class="cstat-no" title="statement not covered" > this.transport.close('shutdown');</span>
|
|
3474
|
+
<span class="cstat-no" title="statement not covered" > this.transport = null;</span>
|
|
3475
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3476
|
+
|
|
3477
|
+
private async ensureTable(table: string): Promise<void> {
|
|
3478
|
+
if (this.knownTables.has(table)) return;
|
|
3479
|
+
await this.call('run', {
|
|
3480
|
+
sql: `CREATE TABLE IF NOT EXISTS "${table}" (id TEXT PRIMARY KEY, data TEXT NOT NULL)`,
|
|
3481
|
+
});
|
|
3482
|
+
this.knownTables.add(table);
|
|
3483
|
+
}
|
|
3484
|
+
|
|
3485
|
+
private async execRows(sql: string, bind: unknown[]): Promise<Row[]> {
|
|
3486
|
+
const { rows } = await this.call<{ rows: { data: string }[] }>('exec', { sql, bind });
|
|
3487
|
+
const s = getStats();
|
|
3488
|
+
const t0 = performance.now();
|
|
3489
|
+
const out = (<span class="branch-0 cbranch-no" title="branch not covered" >rows ?? []).m</span>ap((r) => {
|
|
3490
|
+
s.bytesParsed += r.data.length;
|
|
3491
|
+
return reviveRow(r.data);
|
|
3492
|
+
});
|
|
3493
|
+
s.parseMs += performance.now() - t0;
|
|
3494
|
+
s.rowsParsed += out.length;
|
|
3495
|
+
return out;
|
|
3496
|
+
}
|
|
3497
|
+
|
|
3498
|
+
// ---- reads ---------------------------------------------------------------
|
|
3499
|
+
|
|
3500
|
+
async select(plan: QueryPlan, params: Record<string, unknown> = {}): Promise<Row[]> {
|
|
3501
|
+
if (this.workerSelect) {
|
|
3502
|
+
// ONE round-trip: the worker executes the whole plan (table creation,
|
|
3503
|
+
// base select, relation tree, JSON parse) and returns structured-clone
|
|
3504
|
+
// rows. The legacy path below pays a postMessage hop per table/relation
|
|
3505
|
+
// level plus main-thread parsing — the dominant first-load cost.
|
|
3506
|
+
//
|
|
3507
|
+
// Normalize before postMessage: class-instance VALUES (RecordId & co) →
|
|
3508
|
+
// their `stableKey` string. structuredClone strips a class instance to a
|
|
3509
|
+
// bare plain object — and surrealdb's RecordId keeps its data behind
|
|
3510
|
+
// getters (no own properties), so it clones to `{}`: the worker would
|
|
3511
|
+
// filter on garbage. Applies to params AND to values baked inside the
|
|
3512
|
+
// plan (where nodes, relation sub-wheres, window ids).
|
|
3513
|
+
// Param KEYS must pass through untouched — `comparisonSql` resolves
|
|
3514
|
+
// `paramRef` via hasOwnProperty, and a dropped key silently falls back to
|
|
3515
|
+
// the baked literal (the crossed-results class fixed in aa4af79b).
|
|
3516
|
+
const normPlan = normalizePlanForClone(plan);
|
|
3517
|
+
const normParams: Record<string, unknown> = {};
|
|
3518
|
+
for (const [k, v] of Object.entries(params)) normParams[k] = toCloneSafe(v);
|
|
3519
|
+
try {
|
|
3520
|
+
const res = await this.call<{ rows: Row[]; relationFetches?: number }>('select', {
|
|
3521
|
+
plan: normPlan,
|
|
3522
|
+
params: normParams,
|
|
3523
|
+
});
|
|
3524
|
+
getStats().relationFetches += res.<span class="branch-0 cbranch-no" title="branch not covered" >relationFetches ?? 0;</span>
|
|
3525
|
+
return res.<span class="branch-0 cbranch-no" title="branch not covered" >rows ?? [];</span>
|
|
3526
|
+
} catch (err) {
|
|
3527
|
+
// Stale worker script without the 'select' op: fall back for good.
|
|
3528
|
+
if (err instanceof Error && err.message.includes('unknown message')) {
|
|
3529
|
+
this.workerSelect = false;
|
|
3530
|
+
this.logger.warn(
|
|
3531
|
+
{ err, Category: 'sp00ky-client::SqliteCacheEngine::select' },
|
|
3532
|
+
'Worker lacks select op (stale script?) — falling back to multi-hop select'
|
|
3533
|
+
);
|
|
3534
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
|
|
3535
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
3536
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3537
|
+
}
|
|
3538
|
+
}
|
|
3539
|
+
return this.selectLegacy(plan, params);
|
|
3540
|
+
}
|
|
3541
|
+
|
|
3542
|
+
/** Pre-worker-select path: one worker round-trip per table/relation level,
|
|
3543
|
+
* rows parsed on the main thread. Kept as the `workerSelect:false` escape
|
|
3544
|
+
* hatch and the stale-worker fallback. */
|
|
3545
|
+
private async selectLegacy(
|
|
3546
|
+
plan: QueryPlan,
|
|
3547
|
+
params: Record<string, unknown> = {}
|
|
3548
|
+
): Promise<Row[]> {
|
|
3549
|
+
// Window materialization: base rows are exactly `plan.ids`, ordered.
|
|
3550
|
+
if (plan.ids) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3551
|
+
<span class="cstat-no" title="statement not covered" > const result = await this.selectByIds(plan.table, plan.ids, {</span>
|
|
3552
|
+
<span class="cstat-no" title="statement not covered" > select: plan.select,</span>
|
|
3553
|
+
<span class="cstat-no" title="statement not covered" > orderBy: plan.orderBy,</span>
|
|
3554
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3555
|
+
<span class="cstat-no" title="statement not covered" > await resolveRelations(result, plan.relations, this);</span>
|
|
3556
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
3557
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3558
|
+
await this.ensureTable(plan.table);
|
|
3559
|
+
const bind: unknown[] = [];
|
|
3560
|
+
// Projection binds land in the SELECT clause, ahead of any WHERE binds.
|
|
3561
|
+
const proj = plan.<span class="branch-0 cbranch-no" title="branch not covered" >select ? projectedDataSql(plan.select, bind) : '</span>data';
|
|
3562
|
+
let sql = `SELECT ${proj} FROM "${plan.table}"`;
|
|
3563
|
+
if (plan.where && plan.where.length > 0) {
|
|
3564
|
+
sql += ` WHERE ${renderWhereSql(plan.where, bind, params)}`;
|
|
3565
|
+
}
|
|
3566
|
+
if (plan.<span class="branch-0 cbranch-no" title="branch not covered" >orderBy && plan.orderBy.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >s</span>ql += renderOrderSql(plan.orderBy);</span>
|
|
3567
|
+
// Deterministic fallback, in parity with `sqlite-select.ts`: without it an
|
|
3568
|
+
// unordered query renders in insertion order here and in membership order
|
|
3569
|
+
// after the server answers, which reshuffles the list on screen.
|
|
3570
|
+
else sql += ` ORDER BY id`;
|
|
3571
|
+
if (plan.limit !== undefined) <span class="branch-0 cbranch-no" title="branch not covered" >sql += ` LIMIT ${Number(plan.limit)}`;</span>
|
|
3572
|
+
if (plan.offset !== undefined) <span class="branch-0 cbranch-no" title="branch not covered" >sql += ` OFFSET ${Number(plan.offset)}`;</span>
|
|
3573
|
+
const rows = await this.execRows(sql, bind);
|
|
3574
|
+
await resolveRelations(rows, plan.relations, this);
|
|
3575
|
+
return rows;
|
|
3576
|
+
}
|
|
3577
|
+
|
|
3578
|
+
async fetchRelation(req: RelationFetch): Promise<Row[]> {
|
|
3579
|
+
getStats().relationFetches++;
|
|
3580
|
+
await this.ensureTable(req.table);
|
|
3581
|
+
const keys = req.keys.map(stableKey);
|
|
3582
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
3583
|
+
const bind: unknown[] = [...keys];
|
|
3584
|
+
const lhs = req.matchField === <span class="branch-0 cbranch-no" title="branch not covered" >'id' ? 'id' : `</span>json_extract(data, '$.${req.matchField}')`;
|
|
3585
|
+
let sql = `SELECT data FROM "${req.table}" WHERE ${lhs} IN (${placeholders})`;
|
|
3586
|
+
if (req.<span class="branch-0 cbranch-no" title="branch not covered" >where && req.where.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span>
|
|
3587
|
+
<span class="cstat-no" title="statement not covered" > sql += ` AND ${renderWhereSql(req.where, bind, {})}`;</span>
|
|
3588
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3589
|
+
if (req.<span class="branch-0 cbranch-no" title="branch not covered" >orderBy && req.orderBy.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >s</span>ql += renderOrderSql(req.orderBy);</span>
|
|
3590
|
+
const rows = await this.execRows(sql, bind);
|
|
3591
|
+
return req.<span class="branch-0 cbranch-no" title="branch not covered" >select ? rows.map((r) => project(r, req.select!)) : r</span>ows;
|
|
3592
|
+
}
|
|
3593
|
+
|
|
3594
|
+
<span class="fstat-no" title="function not covered" > async selectByIds(</span>
|
|
3595
|
+
<span class="cstat-no" title="statement not covered" > table: string,</span>
|
|
3596
|
+
<span class="cstat-no" title="statement not covered" > ids: Id[],</span>
|
|
3597
|
+
<span class="cstat-no" title="statement not covered" > opts?: { select?: string[]; orderBy?: OrderBy }</span>
|
|
3598
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<Row[]> {</span>
|
|
3599
|
+
<span class="cstat-no" title="statement not covered" > if (ids.length === 0) return [];</span>
|
|
3600
|
+
<span class="cstat-no" title="statement not covered" > await this.ensureTable(table);</span>
|
|
3601
|
+
<span class="cstat-no" title="statement not covered" > const keys = ids.map(stableKey);</span>
|
|
3602
|
+
<span class="cstat-no" title="statement not covered" > const placeholders = keys.map(() => '?').join(', ');</span>
|
|
3603
|
+
// Projection binds land in the SELECT clause, so they go first. Must stay
|
|
3604
|
+
// byte-identical to the worker path in sqlite-select.ts.
|
|
3605
|
+
<span class="cstat-no" title="statement not covered" > const bind: unknown[] = [];</span>
|
|
3606
|
+
<span class="cstat-no" title="statement not covered" > const dataCol = opts?.select ? projectedDataSql(opts.select, bind) : 'data';</span>
|
|
3607
|
+
<span class="cstat-no" title="statement not covered" > bind.push(...keys);</span>
|
|
3608
|
+
<span class="cstat-no" title="statement not covered" > let sql = `SELECT ${dataCol} FROM "${table}" WHERE id IN (${placeholders})`;</span>
|
|
3609
|
+
<span class="cstat-no" title="statement not covered" > if (opts?.orderBy && opts.orderBy.length > 0) sql += renderOrderSql(opts.orderBy);</span>
|
|
3610
|
+
<span class="cstat-no" title="statement not covered" > let rows = await this.execRows(sql, bind);</span>
|
|
3611
|
+
<span class="cstat-no" title="statement not covered" > if (!opts?.orderBy || opts.orderBy.length === 0) {</span>
|
|
3612
|
+
<span class="cstat-no" title="statement not covered" > const pos = new Map(keys.map((k, i) => [k, i]));</span>
|
|
3613
|
+
<span class="cstat-no" title="statement not covered" > rows = rows.sort((a, b) => (pos.get(stableKey(a.id)) ?? 0) - (pos.get(stableKey(b.id)) ?? 0));</span>
|
|
3614
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3615
|
+
<span class="cstat-no" title="statement not covered" > return rows;</span>
|
|
3616
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3617
|
+
|
|
3618
|
+
async getById(table: string, id: Id): Promise<Row | null> {
|
|
3619
|
+
await this.ensureTable(table);
|
|
3620
|
+
const rows = await this.execRows(`SELECT data FROM "${table}" WHERE id = ?`, [stableKey(id)]);
|
|
3621
|
+
return rows[0] ?? null;
|
|
3622
|
+
}
|
|
3623
|
+
|
|
3624
|
+
/**
|
|
3625
|
+
* `(id, _00_rv)` of every row per table, straight off the worker: no body
|
|
3626
|
+
* parse, one round trip per table. A table that does not exist yet reads as
|
|
3627
|
+
* empty rather than failing the whole scan.
|
|
3628
|
+
*/
|
|
3629
|
+
async scanVersions(tables: string[]): Promise<Record<string, [string, number][]>> {
|
|
3630
|
+
const out: Record<string, [string, number][]> = {};
|
|
3631
|
+
for (const table of tables) {
|
|
3632
|
+
try {
|
|
3633
|
+
const { rows } = await this.call<{ rows: { id: string; rv: unknown }[] }>('exec', {
|
|
3634
|
+
sql: `SELECT id, json_extract(data, '$._00_rv') AS rv FROM "${table.replace(/"/g, '""')}"`,
|
|
3635
|
+
});
|
|
3636
|
+
out[table] = (<span class="branch-0 cbranch-no" title="branch not covered" >rows ?? []).m</span>ap((r) => [r.id, Number(r.rv) || 0]);
|
|
3637
|
+
} catch {
|
|
3638
|
+
out[table] = [];
|
|
3639
|
+
}
|
|
3640
|
+
}
|
|
3641
|
+
return out;
|
|
3642
|
+
}
|
|
3643
|
+
|
|
3644
|
+
async getSnapshot(key: string): Promise<StoredSnapshot | null> {
|
|
3645
|
+
const { rows } = await this.call<{ rows: { id: string; data: unknown }[] }>('exec', {
|
|
3646
|
+
sql: `SELECT id, data FROM "${SNAPSHOT_TABLE}" WHERE id IN (?, ?)`,
|
|
3647
|
+
bind: [key, `${key}:meta`],
|
|
3648
|
+
});
|
|
3649
|
+
let bytes: Uint8Array | null = null;
|
|
3650
|
+
let meta: SnapshotMeta | null = null;
|
|
3651
|
+
for (const r of <span class="branch-0 cbranch-no" title="branch not covered" >rows ?? []) {</span>
|
|
3652
|
+
if (r.id === key) {
|
|
3653
|
+
if (r.data instanceof Uint8Array) bytes = r.<span class="branch-0 cbranch-no" title="branch not covered" >data;</span>
|
|
3654
|
+
<span class="cstat-no" title="statement not covered" > else if (r.data instanceof ArrayBuffer) bytes = new Uint8Array(r.data);</span>
|
|
3655
|
+
<span class="cstat-no" title="statement not covered" > else if (typeof r.data === 'string') bytes = new TextEncoder().encode(r.data);</span>
|
|
3656
|
+
} else if (typeof r.data === 'string') {
|
|
3657
|
+
try {
|
|
3658
|
+
meta = JSON.parse(r.data) as SnapshotMeta;
|
|
3659
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch {</span>
|
|
3660
|
+
<span class="cstat-no" title="statement not covered" > meta = null;</span>
|
|
3661
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3662
|
+
}
|
|
3663
|
+
}
|
|
3664
|
+
return bytes && meta ? { bytes, meta } : null;
|
|
3665
|
+
}
|
|
3666
|
+
|
|
3667
|
+
async putSnapshot(key: string, bytes: Uint8Array, meta: SnapshotMeta): Promise<void> {
|
|
3668
|
+
// One transaction, so a reader never sees new bytes with old meta.
|
|
3669
|
+
await this.call('batch', [
|
|
3670
|
+
{
|
|
3671
|
+
sql: `INSERT OR REPLACE INTO "${SNAPSHOT_TABLE}" (id, data) VALUES (?, ?)`,
|
|
3672
|
+
bind: [key, bytes],
|
|
3673
|
+
},
|
|
3674
|
+
{
|
|
3675
|
+
sql: `INSERT OR REPLACE INTO "${SNAPSHOT_TABLE}" (id, data) VALUES (?, ?)`,
|
|
3676
|
+
bind: [`${key}:meta`, JSON.stringify(meta)],
|
|
3677
|
+
},
|
|
3678
|
+
]);
|
|
3679
|
+
}
|
|
3680
|
+
|
|
3681
|
+
<span class="fstat-no" title="function not covered" > async deleteSnapshot(key: string): Promise<void> {</span>
|
|
3682
|
+
<span class="cstat-no" title="statement not covered" > await this.call('run', {</span>
|
|
3683
|
+
<span class="cstat-no" title="statement not covered" > sql: `DELETE FROM "${SNAPSHOT_TABLE}" WHERE id IN (?, ?)`,</span>
|
|
3684
|
+
<span class="cstat-no" title="statement not covered" > bind: [key, `${key}:meta`],</span>
|
|
3685
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3686
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3687
|
+
|
|
3688
|
+
// ---- writes --------------------------------------------------------------
|
|
3689
|
+
|
|
3690
|
+
async upsert(table: string, id: Id, data: Row, mode: 'replace' | 'merge'): Promise<void> {
|
|
3691
|
+
await this.ensureTable(table);
|
|
3692
|
+
const key = stableKey(id);
|
|
3693
|
+
if (mode === 'merge') {
|
|
3694
|
+
// Merge in-SQL via json_patch (RFC7396 = MERGE semantics): on insert store
|
|
3695
|
+
// the row, on conflict shallow-merge. Serialize once, reuse for VALUES and
|
|
3696
|
+
// the patch. No read-modify-write round-trip. (RFC7396: null deletes key.)
|
|
3697
|
+
const full = serializeRow({ ...data, id: key });
|
|
3698
|
+
await this.call('run', {
|
|
3699
|
+
sql: `INSERT INTO "${table}"(id, data) VALUES(?, ?) ON CONFLICT(id) DO UPDATE SET data = json_patch(data, ?)`,
|
|
3700
|
+
bind: [key, full, full],
|
|
3701
|
+
});
|
|
3702
|
+
return;
|
|
3703
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > }</span>
|
|
3704
|
+
<span class="cstat-no" title="statement not covered" > await this.call('run', {</span>
|
|
3705
|
+
<span class="cstat-no" title="statement not covered" > sql: `INSERT INTO "${table}"(id, data) VALUES(?, ?) ON CONFLICT(id) DO UPDATE SET data = excluded.data`,</span>
|
|
3706
|
+
<span class="cstat-no" title="statement not covered" > bind: [key, serializeRow({ ...data, id: key })],</span>
|
|
3707
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3708
|
+
}
|
|
3709
|
+
|
|
3710
|
+
<span class="fstat-no" title="function not covered" > async patch(table: string, id: Id, patches: unknown[]): Promise<void> {</span>
|
|
3711
|
+
// RFC6902 (fast-json-patch) applied read-modify-write — SQLite's json_patch
|
|
3712
|
+
// is RFC7396 merge-patch and would misinterpret op arrays.
|
|
3713
|
+
<span class="cstat-no" title="statement not covered" > const existing = (await this.getById(table, id)) ?? { id: stableKey(id) };</span>
|
|
3714
|
+
<span class="cstat-no" title="statement not covered" > const next = applyPatch(existing, patches as Operation[]).newDocument as Row;</span>
|
|
3715
|
+
<span class="cstat-no" title="statement not covered" > await this.upsert(table, id, next, 'replace');</span>
|
|
3716
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3717
|
+
|
|
3718
|
+
async delete(table: string, id: Id): Promise<void> {
|
|
3719
|
+
await this.ensureTable(table);
|
|
3720
|
+
await this.call('run', { sql: `DELETE FROM "${table}" WHERE id = ?`, bind: [stableKey(id)] });
|
|
3721
|
+
}
|
|
3722
|
+
|
|
3723
|
+
// ---- SurrealQL-vocabulary shim (LocalStore compatibility) ---------------
|
|
3724
|
+
|
|
3725
|
+
/**
|
|
3726
|
+
* Execute a raw SurrealQL statement by translating the client's bounded
|
|
3727
|
+
* vocabulary to verbs (see `surql-translate.ts`). Returns results shaped like
|
|
3728
|
+
* SurrealDB's `.query()` (one element per statement; a tx prepends a `null`
|
|
3729
|
+
* begin-result so `surql.seal` extraction lines up). Epoch-fences writes.
|
|
3730
|
+
*/
|
|
3731
|
+
async query<T extends unknown[]>(
|
|
3732
|
+
sql: string,
|
|
3733
|
+
vars: Record<string, unknown> = {},
|
|
3734
|
+
opts?: { epoch?: number }
|
|
3735
|
+
): Promise<T> {
|
|
3736
|
+
if (<span class="branch-0 cbranch-no" title="branch not covered" >opts?.epoch !== <span class="branch-0 cbranch-no" title="branch not covered" >u</span>ndefined && opts.epoch !== this.storeEpoch) <span class="branch-0 cbranch-no" title="branch not covered" >t</span>hrow new StaleEpochError();</span>
|
|
3737
|
+
const start = performance.now();
|
|
3738
|
+
try {
|
|
3739
|
+
const { transaction, ops } = translateSurql(sql, vars);
|
|
3740
|
+
let shaped: unknown[];
|
|
3741
|
+
// FAST PATH: a pure-write transaction (bulk sync-down is one
|
|
3742
|
+
// `tx([upsertMerge…])`) compiles to a SINGLE worker `batch` message run in
|
|
3743
|
+
// one SQLite transaction — instead of 1-2 worker round-trips PER row. This
|
|
3744
|
+
// is the dominant sync-down cost; per-op execution here caused the churn
|
|
3745
|
+
// OOM. Mixed txs (LET/RETURN single-record mutations) keep the per-op path.
|
|
3746
|
+
if (
|
|
3747
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > transaction &&</span>
|
|
3748
|
+
<span class="cstat-no" title="statement not covered" > ops.every(</span>
|
|
3749
|
+
<span class="cstat-no" title="statement not covered" > (o) =></span>
|
|
3750
|
+
<span class="cstat-no" title="statement not covered" > o.kind === 'upsert' ||</span>
|
|
3751
|
+
<span class="cstat-no" title="statement not covered" > o.kind === 'delete' ||</span>
|
|
3752
|
+
<span class="cstat-no" title="statement not covered" > o.kind === 'deleteAll' ||</span>
|
|
3753
|
+
<span class="cstat-no" title="statement not covered" > o.kind === 'noop'</span>
|
|
3754
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
3755
|
+
) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
3756
|
+
<span class="cstat-no" title="statement not covered" > await this.runWriteBatch(ops);</span>
|
|
3757
|
+
// Shape each statement's result the SAME as the per-op path (`execOp`),
|
|
3758
|
+
// so a caller reading a statement's output still works after taking the
|
|
3759
|
+
// batch fast path. A single `create()` compiles to an all-upsert tx
|
|
3760
|
+
// (createSet + createMutation) and reads `resultIndex:0` for the new
|
|
3761
|
+
// row + its id; returning empty arrays here dropped that row (id became
|
|
3762
|
+
// undefined → the reconcile crashed in `encodeRecordId`). The
|
|
3763
|
+
// single-batch write is kept — this only rebuilds the return value.
|
|
3764
|
+
<span class="cstat-no" title="statement not covered" > shaped = [null, ...ops.map(pureWriteOpResult)];</span>
|
|
3765
|
+
} else {
|
|
3766
|
+
const results: unknown[] = [];
|
|
3767
|
+
// Per-query scope holds `LET $var = (...)` bindings for later statements
|
|
3768
|
+
// (e.g. `RETURN { target: $updated }`).
|
|
3769
|
+
const scope: Record<string, unknown> = {};
|
|
3770
|
+
for (const op of ops) results.push(await this.execOp(op, scope, vars));
|
|
3771
|
+
shaped = <span class="branch-0 cbranch-no" title="branch not covered" >transaction ? [null, ...results] : r</span>esults;
|
|
3772
|
+
}
|
|
3773
|
+
this.events.emit(DatabaseEventTypes.LocalQuery, {
|
|
3774
|
+
query: sql,
|
|
3775
|
+
vars,
|
|
3776
|
+
duration: performance.now() - start,
|
|
3777
|
+
success: true,
|
|
3778
|
+
timestamp: Date.now(),
|
|
3779
|
+
});
|
|
3780
|
+
return shaped as unknown as T;
|
|
3781
|
+
} catch (err) {
|
|
3782
|
+
this.events.emit(DatabaseEventTypes.LocalQuery, {
|
|
3783
|
+
query: sql,
|
|
3784
|
+
vars,
|
|
3785
|
+
duration: performance.now() - start,
|
|
3786
|
+
success: false,
|
|
3787
|
+
error: err instanceof Error ? err.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(err),</span>
|
|
3788
|
+
timestamp: Date.now(),
|
|
3789
|
+
});
|
|
3790
|
+
throw err;
|
|
3791
|
+
}
|
|
3792
|
+
}
|
|
3793
|
+
|
|
3794
|
+
<span class="fstat-no" title="function not covered" > async execute<R>(</span>
|
|
3795
|
+
<span class="cstat-no" title="statement not covered" > query: SealedQuery<R>,</span>
|
|
3796
|
+
<span class="cstat-no" title="statement not covered" > vars?: Record<string, unknown>,</span>
|
|
3797
|
+
<span class="cstat-no" title="statement not covered" > opts?: { epoch?: number }</span>
|
|
3798
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<R> {</span>
|
|
3799
|
+
<span class="cstat-no" title="statement not covered" > const raw = await this.query<unknown[]>(query.sql, vars, opts);</span>
|
|
3800
|
+
<span class="cstat-no" title="statement not covered" > return query.extract(raw);</span>
|
|
3801
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3802
|
+
|
|
3803
|
+
<span class="fstat-no" title="function not covered" > queryUngated<T extends unknown[]>(sql: string, vars?: Record<string, unknown>): Promise<T> {</span>
|
|
3804
|
+
<span class="cstat-no" title="statement not covered" > return this.query<T>(sql, vars);</span>
|
|
3805
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3806
|
+
|
|
3807
|
+
private async execOp(
|
|
3808
|
+
op: SqlOp,
|
|
3809
|
+
scope: Record<string, unknown>,
|
|
3810
|
+
vars: Record<string, unknown>
|
|
3811
|
+
): Promise<unknown> {
|
|
3812
|
+
switch (op.kind) {
|
|
3813
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'getById': {</span>
|
|
3814
|
+
<span class="cstat-no" title="statement not covered" > const row = await this.getById(tableOf(op.id), op.id);</span>
|
|
3815
|
+
<span class="cstat-no" title="statement not covered" > if (op.value) return row ? (row[op.value] ?? null) : null;</span>
|
|
3816
|
+
<span class="cstat-no" title="statement not covered" > return row ? (op.select ? project(row, op.select) : row) : null;</span>
|
|
3817
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3818
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'selectByIds': {</span>
|
|
3819
|
+
<span class="cstat-no" title="statement not covered" > if (op.ids.length === 0) return [];</span>
|
|
3820
|
+
<span class="cstat-no" title="statement not covered" > let rows = await this.selectByIds(tableOf(op.ids[0]), op.ids, {</span>
|
|
3821
|
+
<span class="cstat-no" title="statement not covered" > select: op.select,</span>
|
|
3822
|
+
<span class="cstat-no" title="statement not covered" > orderBy: op.orderBy,</span>
|
|
3823
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3824
|
+
// Windowed in JS, not SQL: the id list is already the whole result set,
|
|
3825
|
+
// and its order is restored after the fetch (see selectByIds).
|
|
3826
|
+
<span class="cstat-no" title="statement not covered" > if (op.start !== undefined || op.limit !== undefined) {</span>
|
|
3827
|
+
<span class="cstat-no" title="statement not covered" > const from = op.start ?? 0;</span>
|
|
3828
|
+
<span class="cstat-no" title="statement not covered" > rows = rows.slice(from, op.limit === undefined ? undefined : from + op.limit);</span>
|
|
3829
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3830
|
+
<span class="cstat-no" title="statement not covered" > if (op.value) return rows.map((r) => r[op.value!]);</span>
|
|
3831
|
+
<span class="cstat-no" title="statement not covered" > return rows;</span>
|
|
3832
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3833
|
+
case 'selectTable': {
|
|
3834
|
+
const rows = await this.rawSelectTable(op.table, op.where, op.orderBy, {
|
|
3835
|
+
limit: op.limit,
|
|
3836
|
+
start: op.start,
|
|
3837
|
+
});
|
|
3838
|
+
if (op.value) <span class="branch-0 cbranch-no" title="branch not covered" >return rows.map((r) => r[op.value!]);</span>
|
|
3839
|
+
return op.<span class="branch-0 cbranch-no" title="branch not covered" >select ? rows.map((r) => project(r, op.select!)) : r</span>ows;
|
|
3840
|
+
}
|
|
3841
|
+
case 'count': {
|
|
3842
|
+
await this.ensureTable(op.table);
|
|
3843
|
+
const bind: unknown[] = [];
|
|
3844
|
+
let sql = `SELECT COUNT(*) AS n FROM "${op.table}"`;
|
|
3845
|
+
if (op.where && op.where.length > 0) sql += ` WHERE ${renderWhereSql(op.where, bind, {})}`;
|
|
3846
|
+
const { rows } = await this.call<{ rows: { n: number }[] }>('exec', { sql, bind });
|
|
3847
|
+
// `GROUP ALL` collapses to a single `{ count }` row on SurrealDB; match
|
|
3848
|
+
// it exactly so callers can read `rows[0].count` on either engine.
|
|
3849
|
+
return [{ count: rows?.[0]?.n ?? 0 }];
|
|
3850
|
+
}
|
|
3851
|
+
case 'infoForDb': {
|
|
3852
|
+
const { rows } = await this.call<{ rows: { name: string }[] }>('exec', {
|
|
3853
|
+
sql: "SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name",
|
|
3854
|
+
});
|
|
3855
|
+
// SurrealDB answers with the DEFINE statement per table. Nothing here
|
|
3856
|
+
// parses it (the DevTools explorer only reads the keys), so a truthful
|
|
3857
|
+
// schemaless stand-in beats inventing field definitions.
|
|
3858
|
+
const tables: Record<string, string> = {};
|
|
3859
|
+
for (const r of <span class="branch-0 cbranch-no" title="branch not covered" >rows ?? []) t</span>ables[r.name] = `DEFINE TABLE ${r.name} SCHEMALESS`;
|
|
3860
|
+
return { tables, analyzers: {}, functions: {}, params: {}, users: {} };
|
|
3861
|
+
}
|
|
3862
|
+
case 'upsert':
|
|
3863
|
+
await this.upsert(tableOf(op.id), op.id, op.data, op.mode);
|
|
3864
|
+
// Cheap return — no read-back. The full merged row is only needed by a
|
|
3865
|
+
// LET-wrapped upsert, which reads it back in the 'let' case below. This
|
|
3866
|
+
// avoids an extra worker round-trip + full-row parse on EVERY sync-down
|
|
3867
|
+
// write (the hot path under rapid churn). Shared with the batch fast
|
|
3868
|
+
// path so the two never drift.
|
|
3869
|
+
return pureWriteOpResult(op);
|
|
3870
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'updateSet': {</span>
|
|
3871
|
+
<span class="cstat-no" title="statement not covered" > const existing = (await this.getById(tableOf(op.id), op.id)) ?? { id: stableKey(op.id) };</span>
|
|
3872
|
+
<span class="cstat-no" title="statement not covered" > for (const { path, op: setOp, value } of op.sets) {</span>
|
|
3873
|
+
<span class="cstat-no" title="statement not covered" > if (setOp === '+=' || setOp === '-=') {</span>
|
|
3874
|
+
<span class="cstat-no" title="statement not covered" > const cur = Number(getPath(existing, path) ?? 0);</span>
|
|
3875
|
+
<span class="cstat-no" title="statement not covered" > const delta = Number(value ?? 0);</span>
|
|
3876
|
+
<span class="cstat-no" title="statement not covered" > setPath(existing, path, setOp === '+=' ? cur + delta : cur - delta);</span>
|
|
3877
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
3878
|
+
<span class="cstat-no" title="statement not covered" > setPath(existing, path, value);</span>
|
|
3879
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3880
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3881
|
+
<span class="cstat-no" title="statement not covered" > await this.upsert(tableOf(op.id), op.id, existing, 'replace');</span>
|
|
3882
|
+
<span class="cstat-no" title="statement not covered" > return op.returnNone ? null : existing;</span>
|
|
3883
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3884
|
+
case 'delete':
|
|
3885
|
+
await this.delete(tableOf(op.id), op.id);
|
|
3886
|
+
return pureWriteOpResult(op);
|
|
3887
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'deleteAll':</span>
|
|
3888
|
+
<span class="cstat-no" title="statement not covered" > await this.ensureTable(op.table);</span>
|
|
3889
|
+
<span class="cstat-no" title="statement not covered" > await this.call('run', { sql: `DELETE FROM "${op.table}"` });</span>
|
|
3890
|
+
<span class="cstat-no" title="statement not covered" > return pureWriteOpResult(op);</span>
|
|
3891
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'let': {</span>
|
|
3892
|
+
<span class="cstat-no" title="statement not covered" > let result = await this.execOp(op.inner, scope, vars);</span>
|
|
3893
|
+
// A LET-bound UPSERT must expose the FULL merged row (e.g.
|
|
3894
|
+
// `RETURN { target: $updated }`), so read it back here — only here,
|
|
3895
|
+
// not on every upsert.
|
|
3896
|
+
<span class="cstat-no" title="statement not covered" > if (op.inner.kind === 'upsert') {</span>
|
|
3897
|
+
<span class="cstat-no" title="statement not covered" > result = (await this.getById(tableOf(op.inner.id), op.inner.id)) ?? result;</span>
|
|
3898
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3899
|
+
<span class="cstat-no" title="statement not covered" > scope[op.var] = result;</span>
|
|
3900
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
3901
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3902
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'return': {</span>
|
|
3903
|
+
<span class="cstat-no" title="statement not covered" > const obj: Row = {};</span>
|
|
3904
|
+
<span class="cstat-no" title="statement not covered" > for (const { key, var: v } of op.entries) {</span>
|
|
3905
|
+
<span class="cstat-no" title="statement not covered" > obj[key] = v in scope ? scope[v] : vars[v];</span>
|
|
3906
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3907
|
+
<span class="cstat-no" title="statement not covered" > return obj;</span>
|
|
3908
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3909
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > case 'noop':</span>
|
|
3910
|
+
<span class="cstat-no" title="statement not covered" > return pureWriteOpResult(op);</span>
|
|
3911
|
+
}
|
|
3912
|
+
}
|
|
3913
|
+
|
|
3914
|
+
/**
|
|
3915
|
+
* Compile a pure-write op list to ONE worker `batch` (single SQLite
|
|
3916
|
+
* transaction). Ensures each touched table exists, then one statement per op.
|
|
3917
|
+
* Merges happen in-SQL via json_patch — no read-back round-trips.
|
|
3918
|
+
*/
|
|
3919
|
+
<span class="fstat-no" title="function not covered" > private async runWriteBatch(ops: SqlOp[]): Promise<void> {</span>
|
|
3920
|
+
<span class="cstat-no" title="statement not covered" > const stmts: { sql: string; bind?: unknown[] }[] = [];</span>
|
|
3921
|
+
<span class="cstat-no" title="statement not covered" > const tables = new Set<string>();</span>
|
|
3922
|
+
<span class="cstat-no" title="statement not covered" > const ensure = (t: string) => {</span>
|
|
3923
|
+
<span class="cstat-no" title="statement not covered" > if (!tables.has(t)) {</span>
|
|
3924
|
+
<span class="cstat-no" title="statement not covered" > tables.add(t);</span>
|
|
3925
|
+
<span class="cstat-no" title="statement not covered" > this.knownTables.add(t);</span>
|
|
3926
|
+
<span class="cstat-no" title="statement not covered" > stmts.push({</span>
|
|
3927
|
+
<span class="cstat-no" title="statement not covered" > sql: `CREATE TABLE IF NOT EXISTS "${t}" (id TEXT PRIMARY KEY, data TEXT NOT NULL)`,</span>
|
|
3928
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3929
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3930
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
3931
|
+
<span class="cstat-no" title="statement not covered" > for (const op of ops) {</span>
|
|
3932
|
+
<span class="cstat-no" title="statement not covered" > if (op.kind === 'upsert') {</span>
|
|
3933
|
+
<span class="cstat-no" title="statement not covered" > const t = tableOf(op.id);</span>
|
|
3934
|
+
<span class="cstat-no" title="statement not covered" > const key = stableKey(op.id);</span>
|
|
3935
|
+
<span class="cstat-no" title="statement not covered" > ensure(t);</span>
|
|
3936
|
+
<span class="cstat-no" title="statement not covered" > if (op.mode === 'merge') {</span>
|
|
3937
|
+
// Serialize ONCE and reuse for both VALUES (fresh insert) and the
|
|
3938
|
+
// json_patch (merge). Patching with `id` is a harmless no-op set, so
|
|
3939
|
+
// the full row doubles as the delta — halves per-row stringify cost.
|
|
3940
|
+
<span class="cstat-no" title="statement not covered" > const full = serializeRow({ ...op.data, id: key });</span>
|
|
3941
|
+
<span class="cstat-no" title="statement not covered" > stmts.push({</span>
|
|
3942
|
+
<span class="cstat-no" title="statement not covered" > sql: `INSERT INTO "${t}"(id, data) VALUES(?, ?) ON CONFLICT(id) DO UPDATE SET data = json_patch(data, ?)`,</span>
|
|
3943
|
+
<span class="cstat-no" title="statement not covered" > bind: [key, full, full],</span>
|
|
3944
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3945
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
3946
|
+
<span class="cstat-no" title="statement not covered" > stmts.push({</span>
|
|
3947
|
+
<span class="cstat-no" title="statement not covered" > sql: `INSERT INTO "${t}"(id, data) VALUES(?, ?) ON CONFLICT(id) DO UPDATE SET data = excluded.data`,</span>
|
|
3948
|
+
<span class="cstat-no" title="statement not covered" > bind: [key, serializeRow({ ...op.data, id: key })],</span>
|
|
3949
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
3950
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3951
|
+
<span class="cstat-no" title="statement not covered" > } else if (op.kind === 'delete') {</span>
|
|
3952
|
+
<span class="cstat-no" title="statement not covered" > const t = tableOf(op.id);</span>
|
|
3953
|
+
<span class="cstat-no" title="statement not covered" > ensure(t);</span>
|
|
3954
|
+
<span class="cstat-no" title="statement not covered" > stmts.push({ sql: `DELETE FROM "${t}" WHERE id = ?`, bind: [stableKey(op.id)] });</span>
|
|
3955
|
+
<span class="cstat-no" title="statement not covered" > } else if (op.kind === 'deleteAll') {</span>
|
|
3956
|
+
<span class="cstat-no" title="statement not covered" > ensure(op.table);</span>
|
|
3957
|
+
<span class="cstat-no" title="statement not covered" > stmts.push({ sql: `DELETE FROM "${op.table}"` });</span>
|
|
3958
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3959
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3960
|
+
<span class="cstat-no" title="statement not covered" > if (stmts.length > 0) await this.call('batch', stmts);</span>
|
|
3961
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3962
|
+
|
|
3963
|
+
private async rawSelectTable(
|
|
3964
|
+
table: string,
|
|
3965
|
+
where?: WhereNode[],
|
|
3966
|
+
orderBy?: OrderBy,
|
|
3967
|
+
window?: { limit?: number; start?: number }
|
|
3968
|
+
): Promise<Row[]> {
|
|
3969
|
+
await this.ensureTable(table);
|
|
3970
|
+
const bind: unknown[] = [];
|
|
3971
|
+
let sql = `SELECT data FROM "${table}"`;
|
|
3972
|
+
if (<span class="branch-0 cbranch-no" title="branch not covered" >where && where.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >s</span>ql += ` WHERE ${renderWhereSql(where, bind, {})}`;</span>
|
|
3973
|
+
if (<span class="branch-0 cbranch-no" title="branch not covered" >orderBy && orderBy.length > 0) <span class="branch-0 cbranch-no" title="branch not covered" >s</span>ql += renderOrderSql(orderBy);</span>
|
|
3974
|
+
// SQLite has no bare OFFSET, so a START without a LIMIT needs `LIMIT -1`
|
|
3975
|
+
// (its documented "no limit" sentinel) to stay valid SQL.
|
|
3976
|
+
if (window?.limit !== undefined) sql += ` LIMIT ${Number(window.limit)}`;
|
|
3977
|
+
else if (window?.start !== undefined) sql += ' LIMIT -1';
|
|
3978
|
+
if (window?.start !== undefined) sql += ` OFFSET ${Number(window.start)}`;
|
|
3979
|
+
return this.execRows(sql, bind);
|
|
3980
|
+
}
|
|
3981
|
+
|
|
3982
|
+
<span class="fstat-no" title="function not covered" > async transaction<T>(fn: (tx: EngineTx) => Promise<T>): Promise<T> {</span>
|
|
3983
|
+
// Verbs run in order on the single worker message channel. `patch` needs a
|
|
3984
|
+
// read-modify-write round-trip, so a single BEGIN/COMMIT batch cannot wrap
|
|
3985
|
+
// the whole closure; sequential execution is sufficient for the current
|
|
3986
|
+
// single-record write sites.
|
|
3987
|
+
<span class="cstat-no" title="statement not covered" > const tx: EngineTx = {</span>
|
|
3988
|
+
<span class="cstat-no" title="statement not covered" > upsert: (t, id, data, mode) => this.upsert(t, id, data, mode),</span>
|
|
3989
|
+
<span class="cstat-no" title="statement not covered" > patch: (t, id, p) => this.patch(t, id, p),</span>
|
|
3990
|
+
<span class="cstat-no" title="statement not covered" > delete: (t, id) => this.delete(t, id),</span>
|
|
3991
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
3992
|
+
<span class="cstat-no" title="statement not covered" > return fn(tx);</span>
|
|
3993
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
3994
|
+
}
|
|
3995
|
+
|
|
3996
|
+
// ==================== instrumentation ====================
|
|
3997
|
+
|
|
3998
|
+
interface SqliteStats {
|
|
3999
|
+
roundTrips: number;
|
|
4000
|
+
batchStatements: number;
|
|
4001
|
+
maxBatch: number;
|
|
4002
|
+
inFlight: number;
|
|
4003
|
+
maxInFlight: number;
|
|
4004
|
+
byType: Record<string, number>;
|
|
4005
|
+
/** Worker round trips that hit `localOpTimeoutMs` (see rawCall). */
|
|
4006
|
+
timeouts?: number;
|
|
4007
|
+
/** Time ops spent waiting behind the opQueue before dispatch. */
|
|
4008
|
+
queueWaitMs: number;
|
|
4009
|
+
/** Time inside the worker's message handler (actual SQLite work). */
|
|
4010
|
+
workerMs: number;
|
|
4011
|
+
/** Round-trip time minus workerMs: postMessage + scheduling overhead. */
|
|
4012
|
+
rpcOverheadMs: number;
|
|
4013
|
+
/** Main-thread JSON parse/revive of returned rows. */
|
|
4014
|
+
parseMs: number;
|
|
4015
|
+
rowsParsed: number;
|
|
4016
|
+
bytesParsed: number;
|
|
4017
|
+
/** Relation-resolver fan-out fetches (one worker round-trip each). */
|
|
4018
|
+
relationFetches: number;
|
|
4019
|
+
/** Whether the open store is OPFS-backed. `false` here with an `opfsError`
|
|
4020
|
+
* means the whole dataset is sitting in RAM. Optional so it stays absent
|
|
4021
|
+
* until the first open (and is skipped by the backfill loop below). */
|
|
4022
|
+
persisted?: boolean;
|
|
4023
|
+
/** Why OPFS persistence failed, when it did. */
|
|
4024
|
+
opfsError?: string;
|
|
4025
|
+
/** Shared-tabs follower: ops that crossed the leader's MessagePort. */
|
|
4026
|
+
proxiedOps?: number;
|
|
4027
|
+
/** Times this tab's engine changed hands (promotions + attachments). */
|
|
4028
|
+
roleChanges?: number;
|
|
4029
|
+
}
|
|
4030
|
+
|
|
4031
|
+
const EMPTY_STATS: SqliteStats = {
|
|
4032
|
+
roundTrips: 0,
|
|
4033
|
+
batchStatements: 0,
|
|
4034
|
+
maxBatch: 0,
|
|
4035
|
+
inFlight: 0,
|
|
4036
|
+
maxInFlight: 0,
|
|
4037
|
+
byType: {},
|
|
4038
|
+
queueWaitMs: 0,
|
|
4039
|
+
workerMs: 0,
|
|
4040
|
+
rpcOverheadMs: 0,
|
|
4041
|
+
parseMs: 0,
|
|
4042
|
+
rowsParsed: 0,
|
|
4043
|
+
bytesParsed: 0,
|
|
4044
|
+
relationFetches: 0,
|
|
4045
|
+
};
|
|
4046
|
+
|
|
4047
|
+
/** Live stats, inspectable in the browser console via `__sqliteStats`. Counts
|
|
4048
|
+
* worker round-trips (the sync-down cost driver), batch sizes, queue depth
|
|
4049
|
+
* (`maxInFlight`), and the latency split of each round-trip (queue wait vs
|
|
4050
|
+
* worker time vs RPC overhead vs main-thread row parsing) so first-load cost
|
|
4051
|
+
* can be measured rather than guessed. */
|
|
4052
|
+
function getStats(): SqliteStats {
|
|
4053
|
+
const g = globalThis as unknown as { __sqliteStats?: SqliteStats };
|
|
4054
|
+
if (!g.__sqliteStats) {
|
|
4055
|
+
g.__sqliteStats = { ...EMPTY_STATS, byType: {} };
|
|
4056
|
+
} else {
|
|
4057
|
+
// Backfill fields added since the object was created (HMR / older bundle).
|
|
4058
|
+
for (const [k, v] of Object.entries(EMPTY_STATS)) {
|
|
4059
|
+
if ((g.__sqliteStats as any)[k] === undefined) (<span class="branch-0 cbranch-no" title="branch not covered" >g.__sqliteStats as any)[k] = v;</span>
|
|
4060
|
+
}
|
|
4061
|
+
}
|
|
4062
|
+
return g.__sqliteStats;
|
|
4063
|
+
}
|
|
4064
|
+
|
|
4065
|
+
// SQL rendering + row (de)serialization live in `sqlite-plan-sql.ts`, shared
|
|
4066
|
+
// with the worker (worker-side plan execution renders the same SQL).
|
|
4067
|
+
|
|
4068
|
+
// ==================== structured-clone normalization ====================
|
|
4069
|
+
|
|
4070
|
+
/**
|
|
4071
|
+
* Make a bind/param value safe to cross the worker boundary. structuredClone
|
|
4072
|
+
* keeps plain data intact but strips a CLASS instance to a bare object — and
|
|
4073
|
+
* surrealdb's `RecordId` stores its fields behind getters (zero own
|
|
4074
|
+
* properties), so it clones to `{}`. Convert such instances to their
|
|
4075
|
+
* `stableKey` string (the exact value `scalar()` would bind on the main
|
|
4076
|
+
* thread), leave everything clone-representable untouched.
|
|
4077
|
+
*/
|
|
4078
|
+
function toCloneSafe(v: unknown): unknown {
|
|
4079
|
+
if (v === null || typeof v !== 'object') return v;
|
|
4080
|
+
if (Array.isArray(v) || v instanceof Uint8Array || v instanceof Date) <span class="branch-0 cbranch-no" title="branch not covered" >return v;</span>
|
|
4081
|
+
const proto = Object.getPrototypeOf(v);
|
|
4082
|
+
if (proto === Object.prototype || proto === null) <span class="branch-0 cbranch-no" title="branch not covered" >return v;</span>
|
|
4083
|
+
return stableKey(v);
|
|
4084
|
+
}
|
|
4085
|
+
|
|
4086
|
+
function normalizeWhereForClone(nodes: WhereNode[] | undefined): WhereNode[] | undefined {
|
|
4087
|
+
if (!nodes) return nodes;
|
|
4088
|
+
return nodes.map((n) =>
|
|
4089
|
+
'or' in <span class="branch-0 cbranch-no" title="branch not covered" >n</span>
|
|
4090
|
+
<span class="cstat-no" title="statement not covered" > ? { or: n.or.map((c) => ({ ...c, value: toCloneSafe(c.value) })) }</span>
|
|
4091
|
+
: { ...n, value: toCloneSafe(n.value) }
|
|
4092
|
+
);
|
|
4093
|
+
}
|
|
4094
|
+
|
|
4095
|
+
function normalizeRelationForClone(r: RelationPlan): RelationPlan {
|
|
4096
|
+
return {
|
|
4097
|
+
...r,
|
|
4098
|
+
where: normalizeWhereForClone(r.where),
|
|
4099
|
+
relations: r.<span class="branch-0 cbranch-no" title="branch not covered" >relations?.map(n</span>ormalizeRelationForClone),
|
|
4100
|
+
};
|
|
4101
|
+
}
|
|
4102
|
+
|
|
4103
|
+
/** Normalize every baked value a plan carries (where trees, window ids) for
|
|
4104
|
+
* the postMessage to the worker's `select` op. */
|
|
4105
|
+
function normalizePlanForClone(plan: QueryPlan): QueryPlan {
|
|
4106
|
+
return {
|
|
4107
|
+
...plan,
|
|
4108
|
+
ids: plan.ids?.map(stableKey),
|
|
4109
|
+
where: normalizeWhereForClone(plan.where),
|
|
4110
|
+
relations: plan.relations?.map(normalizeRelationForClone),
|
|
4111
|
+
};
|
|
4112
|
+
}
|
|
4113
|
+
</pre></td></tr></table></pre>
|
|
4114
|
+
|
|
4115
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
4116
|
+
</div><!-- /wrapper -->
|
|
4117
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
4118
|
+
Code coverage generated by
|
|
4119
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
4120
|
+
at 2026-09-09T09:49:51.780Z
|
|
4121
|
+
</div>
|
|
4122
|
+
<script src="../../../prettify.js"></script>
|
|
4123
|
+
<script>
|
|
4124
|
+
window.onload = function () {
|
|
4125
|
+
prettyPrint();
|
|
4126
|
+
};
|
|
4127
|
+
</script>
|
|
4128
|
+
<script src="../../../sorter.js"></script>
|
|
4129
|
+
<script src="../../../block-navigation.js"></script>
|
|
4130
|
+
</body>
|
|
4131
|
+
</html>
|
|
4132
|
+
|