@monorepolint/utils 0.6.0-alpha.1 → 0.6.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-clean.log +1 -1
- package/.turbo/turbo-compile-typescript.log +1 -1
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +32 -23
- package/.turbo/turbo-transpile-typescript.log +5 -5
- package/CHANGELOG.md +26 -0
- package/build/js/index.js +10 -19
- package/build/js/index.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/CachingHost.d.ts +0 -2
- package/build/types/CachingHost.d.ts.map +1 -1
- package/build/types/Host.d.ts +0 -1
- package/build/types/Host.d.ts.map +1 -1
- package/build/types/SimpleHost.d.ts +0 -2
- package/build/types/SimpleHost.d.ts.map +1 -1
- package/coverage/AggregateTiming.ts.html +295 -0
- package/coverage/CachingHost.ts.html +1570 -0
- package/coverage/Host.ts.html +187 -0
- package/coverage/PackageJson.ts.html +151 -0
- package/coverage/SimpleHost.ts.html +253 -0
- package/coverage/Table.ts.html +1039 -0
- package/coverage/Timing.ts.html +247 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +1128 -0
- package/coverage/coverage-final.json +15 -0
- package/coverage/favicon.png +0 -0
- package/coverage/findWorkspaceDir.ts.html +223 -0
- package/coverage/getPackageNameToDir.ts.html +187 -0
- package/coverage/getWorkspacePackageDirs.ts.html +295 -0
- package/coverage/index.html +311 -0
- package/coverage/index.ts.html +145 -0
- package/coverage/matchesAnyGlob.ts.html +523 -0
- package/coverage/mutateJson.ts.html +124 -0
- package/coverage/nanosecondsToSanity.ts.html +115 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/package.json +13 -17
- package/src/CachingHost.ts +4 -0
- package/src/__tests__/CachingHost.spec.ts +1 -1
- package/src/getWorkspacePackageDirs.ts +1 -1
- package/vitest.config.mjs +14 -0
- package/vitest.config.mjs.timestamp-1736878329730-aa478e2241542.mjs +18 -0
- package/jest.config.cjs +0 -4
|
@@ -0,0 +1,1570 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for CachingHost.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> CachingHost.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">84.43% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>282/334</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">74% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>74/100</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">92% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>23/25</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">84.43% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>282/334</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 high'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
572
|
+
<span class="cline-any cline-yes">295x</span>
|
|
573
|
+
<span class="cline-any cline-yes">295x</span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-yes">295x</span>
|
|
577
|
+
<span class="cline-any cline-neutral"> </span>
|
|
578
|
+
<span class="cline-any cline-yes">152x</span>
|
|
579
|
+
<span class="cline-any cline-yes">152x</span>
|
|
580
|
+
<span class="cline-any cline-yes">152x</span>
|
|
581
|
+
<span class="cline-any cline-yes">152x</span>
|
|
582
|
+
<span class="cline-any cline-yes">152x</span>
|
|
583
|
+
<span class="cline-any cline-no"> </span>
|
|
584
|
+
<span class="cline-any cline-no"> </span>
|
|
585
|
+
<span class="cline-any cline-yes">152x</span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-yes">147x</span>
|
|
588
|
+
<span class="cline-any cline-yes">147x</span>
|
|
589
|
+
<span class="cline-any cline-yes">1x</span>
|
|
590
|
+
<span class="cline-any cline-yes">1x</span>
|
|
591
|
+
<span class="cline-any cline-yes">147x</span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-yes">2x</span>
|
|
594
|
+
<span class="cline-any cline-yes">2x</span>
|
|
595
|
+
<span class="cline-any cline-no"> </span>
|
|
596
|
+
<span class="cline-any cline-no"> </span>
|
|
597
|
+
<span class="cline-any cline-yes">2x</span>
|
|
598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
599
|
+
<span class="cline-any cline-no"> </span>
|
|
600
|
+
<span class="cline-any cline-no"> </span>
|
|
601
|
+
<span class="cline-any cline-no"> </span>
|
|
602
|
+
<span class="cline-any cline-no"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-yes">1x</span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-yes">11x</span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-yes">11x</span>
|
|
660
|
+
<span class="cline-any cline-yes">11x</span>
|
|
661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-yes">11x</span>
|
|
675
|
+
<span class="cline-any cline-yes">11x</span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
690
|
+
<span class="cline-any cline-yes">11x</span>
|
|
691
|
+
<span class="cline-any cline-yes">9x</span>
|
|
692
|
+
<span class="cline-any cline-yes">9x</span>
|
|
693
|
+
<span class="cline-any cline-yes">9x</span>
|
|
694
|
+
<span class="cline-any cline-yes">9x</span>
|
|
695
|
+
<span class="cline-any cline-yes">9x</span>
|
|
696
|
+
<span class="cline-any cline-yes">9x</span>
|
|
697
|
+
<span class="cline-any cline-yes">9x</span>
|
|
698
|
+
<span class="cline-any cline-yes">9x</span>
|
|
699
|
+
<span class="cline-any cline-yes">9x</span>
|
|
700
|
+
<span class="cline-any cline-yes">9x</span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-yes">11x</span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-yes">1x</span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-no"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-yes">1x</span>
|
|
711
|
+
<span class="cline-any cline-yes">1x</span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
720
|
+
<span class="cline-any cline-yes">11x</span>
|
|
721
|
+
<span class="cline-any cline-yes">53x</span>
|
|
722
|
+
<span class="cline-any cline-yes">53x</span>
|
|
723
|
+
<span class="cline-any cline-yes">53x</span>
|
|
724
|
+
<span class="cline-any cline-yes">53x</span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-yes">53x</span>
|
|
727
|
+
<span class="cline-any cline-no"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-yes">53x</span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-yes">53x</span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-yes">53x</span>
|
|
734
|
+
<span class="cline-any cline-yes">34x</span>
|
|
735
|
+
<span class="cline-any cline-yes">34x</span>
|
|
736
|
+
<span class="cline-any cline-yes">34x</span>
|
|
737
|
+
<span class="cline-any cline-yes">34x</span>
|
|
738
|
+
<span class="cline-any cline-yes">34x</span>
|
|
739
|
+
<span class="cline-any cline-yes">34x</span>
|
|
740
|
+
<span class="cline-any cline-yes">34x</span>
|
|
741
|
+
<span class="cline-any cline-yes">34x</span>
|
|
742
|
+
<span class="cline-any cline-yes">53x</span>
|
|
743
|
+
<span class="cline-any cline-yes">3x</span>
|
|
744
|
+
<span class="cline-any cline-yes">3x</span>
|
|
745
|
+
<span class="cline-any cline-yes">3x</span>
|
|
746
|
+
<span class="cline-any cline-yes">3x</span>
|
|
747
|
+
<span class="cline-any cline-yes">3x</span>
|
|
748
|
+
<span class="cline-any cline-yes">3x</span>
|
|
749
|
+
<span class="cline-any cline-yes">3x</span>
|
|
750
|
+
<span class="cline-any cline-yes">10x</span>
|
|
751
|
+
<span class="cline-any cline-yes">7x</span>
|
|
752
|
+
<span class="cline-any cline-yes">7x</span>
|
|
753
|
+
<span class="cline-any cline-yes">7x</span>
|
|
754
|
+
<span class="cline-any cline-yes">7x</span>
|
|
755
|
+
<span class="cline-any cline-yes">7x</span>
|
|
756
|
+
<span class="cline-any cline-yes">7x</span>
|
|
757
|
+
<span class="cline-any cline-yes">7x</span>
|
|
758
|
+
<span class="cline-any cline-yes">7x</span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-yes">53x</span>
|
|
763
|
+
<span class="cline-any cline-yes">11x</span>
|
|
764
|
+
<span class="cline-any cline-yes">11x</span>
|
|
765
|
+
<span class="cline-any cline-yes">53x</span>
|
|
766
|
+
<span class="cline-any cline-yes">33x</span>
|
|
767
|
+
<span class="cline-any cline-yes">33x</span>
|
|
768
|
+
<span class="cline-any cline-no"> </span>
|
|
769
|
+
<span class="cline-any cline-no"> </span>
|
|
770
|
+
<span class="cline-any cline-yes">33x</span>
|
|
771
|
+
<span class="cline-any cline-yes">53x</span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
776
|
+
<span class="cline-any cline-neutral"> </span>
|
|
777
|
+
<span class="cline-any cline-yes">11x</span>
|
|
778
|
+
<span class="cline-any cline-yes">45x</span>
|
|
779
|
+
<span class="cline-any cline-yes">45x</span>
|
|
780
|
+
<span class="cline-any cline-yes">45x</span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-yes">45x</span>
|
|
783
|
+
<span class="cline-any cline-yes">45x</span>
|
|
784
|
+
<span class="cline-any cline-yes">140x</span>
|
|
785
|
+
<span class="cline-any cline-yes">140x</span>
|
|
786
|
+
<span class="cline-any cline-yes">140x</span>
|
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
788
|
+
<span class="cline-any cline-yes">45x</span>
|
|
789
|
+
<span class="cline-any cline-yes">45x</span>
|
|
790
|
+
<span class="cline-any cline-yes">45x</span>
|
|
791
|
+
<span class="cline-any cline-yes">45x</span>
|
|
792
|
+
<span class="cline-any cline-yes">138x</span>
|
|
793
|
+
<span class="cline-any cline-yes">138x</span>
|
|
794
|
+
<span class="cline-any cline-yes">138x</span>
|
|
795
|
+
<span class="cline-any cline-no"> </span>
|
|
796
|
+
<span class="cline-any cline-no"> </span>
|
|
797
|
+
<span class="cline-any cline-no"> </span>
|
|
798
|
+
<span class="cline-any cline-no"> </span>
|
|
799
|
+
<span class="cline-any cline-no"> </span>
|
|
800
|
+
<span class="cline-any cline-no"> </span>
|
|
801
|
+
<span class="cline-any cline-yes">138x</span>
|
|
802
|
+
<span class="cline-any cline-yes">138x</span>
|
|
803
|
+
<span class="cline-any cline-yes">138x</span>
|
|
804
|
+
<span class="cline-any cline-yes">138x</span>
|
|
805
|
+
<span class="cline-any cline-yes">138x</span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-yes">45x</span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-yes">9x</span>
|
|
811
|
+
<span class="cline-any cline-yes">45x</span>
|
|
812
|
+
<span class="cline-any cline-yes">45x</span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-yes">11x</span>
|
|
815
|
+
<span class="cline-any cline-yes">40x</span>
|
|
816
|
+
<span class="cline-any cline-yes">40x</span>
|
|
817
|
+
<span class="cline-any cline-yes">40x</span>
|
|
818
|
+
<span class="cline-any cline-yes">36x</span>
|
|
819
|
+
<span class="cline-any cline-yes">36x</span>
|
|
820
|
+
<span class="cline-any cline-yes">4x</span>
|
|
821
|
+
<span class="cline-any cline-yes">40x</span>
|
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
|
+
<span class="cline-any cline-yes">11x</span>
|
|
824
|
+
<span class="cline-any cline-yes">33x</span>
|
|
825
|
+
<span class="cline-any cline-yes">33x</span>
|
|
826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
827
|
+
<span class="cline-any cline-yes">33x</span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-yes">11x</span>
|
|
830
|
+
<span class="cline-any cline-yes">33x</span>
|
|
831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
832
|
+
<span class="cline-any cline-yes">11x</span>
|
|
833
|
+
<span class="cline-any cline-yes">5x</span>
|
|
834
|
+
<span class="cline-any cline-yes">5x</span>
|
|
835
|
+
<span class="cline-any cline-yes">5x</span>
|
|
836
|
+
<span class="cline-any cline-no"> </span>
|
|
837
|
+
<span class="cline-any cline-no"> </span>
|
|
838
|
+
<span class="cline-any cline-no"> </span>
|
|
839
|
+
<span class="cline-any cline-yes">5x</span>
|
|
840
|
+
<span class="cline-any cline-yes">4x</span>
|
|
841
|
+
<span class="cline-any cline-yes">4x</span>
|
|
842
|
+
<span class="cline-any cline-yes">4x</span>
|
|
843
|
+
<span class="cline-any cline-yes">4x</span>
|
|
844
|
+
<span class="cline-any cline-yes">4x</span>
|
|
845
|
+
<span class="cline-any cline-yes">4x</span>
|
|
846
|
+
<span class="cline-any cline-yes">4x</span>
|
|
847
|
+
<span class="cline-any cline-yes">4x</span>
|
|
848
|
+
<span class="cline-any cline-yes">4x</span>
|
|
849
|
+
<span class="cline-any cline-yes">4x</span>
|
|
850
|
+
<span class="cline-any cline-yes">4x</span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-yes">5x</span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-yes">1x</span>
|
|
857
|
+
<span class="cline-any cline-yes">1x</span>
|
|
858
|
+
<span class="cline-any cline-yes">1x</span>
|
|
859
|
+
<span class="cline-any cline-yes">5x</span>
|
|
860
|
+
<span class="cline-any cline-yes">3x</span>
|
|
861
|
+
<span class="cline-any cline-yes">3x</span>
|
|
862
|
+
<span class="cline-any cline-yes">3x</span>
|
|
863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
864
|
+
<span class="cline-any cline-yes">5x</span>
|
|
865
|
+
<span class="cline-any cline-yes">3x</span>
|
|
866
|
+
<span class="cline-any cline-yes">3x</span>
|
|
867
|
+
<span class="cline-any cline-yes">5x</span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-yes">11x</span>
|
|
870
|
+
<span class="cline-any cline-yes">3x</span>
|
|
871
|
+
<span class="cline-any cline-yes">3x</span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-no"> </span>
|
|
874
|
+
<span class="cline-any cline-yes">3x</span>
|
|
875
|
+
<span class="cline-any cline-yes">3x</span>
|
|
876
|
+
<span class="cline-any cline-yes">1x</span>
|
|
877
|
+
<span class="cline-any cline-yes">1x</span>
|
|
878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
879
|
+
<span class="cline-any cline-yes">3x</span>
|
|
880
|
+
<span class="cline-any cline-yes">1x</span>
|
|
881
|
+
<span class="cline-any cline-yes">1x</span>
|
|
882
|
+
<span class="cline-any cline-yes">1x</span>
|
|
883
|
+
<span class="cline-any cline-yes">1x</span>
|
|
884
|
+
<span class="cline-any cline-yes">1x</span>
|
|
885
|
+
<span class="cline-any cline-yes">1x</span>
|
|
886
|
+
<span class="cline-any cline-yes">1x</span>
|
|
887
|
+
<span class="cline-any cline-yes">1x</span>
|
|
888
|
+
<span class="cline-any cline-yes">3x</span>
|
|
889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
890
|
+
<span class="cline-any cline-yes">11x</span>
|
|
891
|
+
<span class="cline-any cline-yes">2x</span>
|
|
892
|
+
<span class="cline-any cline-yes">2x</span>
|
|
893
|
+
<span class="cline-any cline-yes">2x</span>
|
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
|
+
<span class="cline-any cline-neutral"> </span>
|
|
897
|
+
<span class="cline-any cline-neutral"> </span>
|
|
898
|
+
<span class="cline-any cline-yes">11x</span>
|
|
899
|
+
<span class="cline-any cline-yes">13x</span>
|
|
900
|
+
<span class="cline-any cline-yes">13x</span>
|
|
901
|
+
<span class="cline-any cline-yes">13x</span>
|
|
902
|
+
<span class="cline-any cline-yes">13x</span>
|
|
903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
904
|
+
<span class="cline-any cline-yes">13x</span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-yes">13x</span>
|
|
908
|
+
<span class="cline-any cline-yes">13x</span>
|
|
909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
910
|
+
<span class="cline-any cline-yes">13x</span>
|
|
911
|
+
<span class="cline-any cline-yes">2x</span>
|
|
912
|
+
<span class="cline-any cline-yes">2x</span>
|
|
913
|
+
<span class="cline-any cline-yes">2x</span>
|
|
914
|
+
<span class="cline-any cline-yes">2x</span>
|
|
915
|
+
<span class="cline-any cline-yes">2x</span>
|
|
916
|
+
<span class="cline-any cline-yes">2x</span>
|
|
917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
918
|
+
<span class="cline-any cline-yes">13x</span>
|
|
919
|
+
<span class="cline-any cline-yes">2x</span>
|
|
920
|
+
<span class="cline-any cline-yes">13x</span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-yes">11x</span>
|
|
923
|
+
<span class="cline-any cline-yes">11x</span>
|
|
924
|
+
<span class="cline-any cline-yes">11x</span>
|
|
925
|
+
<span class="cline-any cline-yes">13x</span>
|
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
930
|
+
<span class="cline-any cline-yes">11x</span>
|
|
931
|
+
<span class="cline-any cline-yes">7x</span>
|
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
933
|
+
<span class="cline-any cline-yes">7x</span>
|
|
934
|
+
<span class="cline-any cline-yes">7x</span>
|
|
935
|
+
<span class="cline-any cline-yes">7x</span>
|
|
936
|
+
<span class="cline-any cline-yes">5x</span>
|
|
937
|
+
<span class="cline-any cline-no"> </span>
|
|
938
|
+
<span class="cline-any cline-no"> </span>
|
|
939
|
+
<span class="cline-any cline-yes">5x</span>
|
|
940
|
+
<span class="cline-any cline-yes">5x</span>
|
|
941
|
+
<span class="cline-any cline-yes">5x</span>
|
|
942
|
+
<span class="cline-any cline-yes">5x</span>
|
|
943
|
+
<span class="cline-any cline-yes">5x</span>
|
|
944
|
+
<span class="cline-any cline-yes">5x</span>
|
|
945
|
+
<span class="cline-any cline-yes">5x</span>
|
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
947
|
+
<span class="cline-any cline-yes">2x</span>
|
|
948
|
+
<span class="cline-any cline-yes">2x</span>
|
|
949
|
+
<span class="cline-any cline-yes">2x</span>
|
|
950
|
+
<span class="cline-any cline-yes">2x</span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-yes">2x</span>
|
|
953
|
+
<span class="cline-any cline-yes">2x</span>
|
|
954
|
+
<span class="cline-any cline-yes">2x</span>
|
|
955
|
+
<span class="cline-any cline-yes">2x</span>
|
|
956
|
+
<span class="cline-any cline-yes">2x</span>
|
|
957
|
+
<span class="cline-any cline-yes">2x</span>
|
|
958
|
+
<span class="cline-any cline-yes">2x</span>
|
|
959
|
+
<span class="cline-any cline-yes">7x</span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-yes">11x</span>
|
|
962
|
+
<span class="cline-any cline-yes">2x</span>
|
|
963
|
+
<span class="cline-any cline-yes">2x</span>
|
|
964
|
+
<span class="cline-any cline-yes">2x</span>
|
|
965
|
+
<span class="cline-any cline-yes">1x</span>
|
|
966
|
+
<span class="cline-any cline-yes">1x</span>
|
|
967
|
+
<span class="cline-any cline-yes">1x</span>
|
|
968
|
+
<span class="cline-any cline-yes">1x</span>
|
|
969
|
+
<span class="cline-any cline-yes">1x</span>
|
|
970
|
+
<span class="cline-any cline-yes">1x</span>
|
|
971
|
+
<span class="cline-any cline-yes">2x</span>
|
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-yes">11x</span>
|
|
974
|
+
<span class="cline-any cline-no"> </span>
|
|
975
|
+
<span class="cline-any cline-no"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-yes">11x</span>
|
|
978
|
+
<span class="cline-any cline-yes">1x</span>
|
|
979
|
+
<span class="cline-any cline-yes">1x</span>
|
|
980
|
+
<span class="cline-any cline-yes">1x</span>
|
|
981
|
+
<span class="cline-any cline-yes">1x</span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-yes">11x</span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-yes">5x</span>
|
|
986
|
+
<span class="cline-any cline-yes">1x</span>
|
|
987
|
+
<span class="cline-any cline-yes">1x</span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
990
|
+
<span class="cline-any cline-yes">1x</span>
|
|
991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
992
|
+
<span class="cline-any cline-yes">1x</span>
|
|
993
|
+
<span class="cline-any cline-yes">1x</span>
|
|
994
|
+
<span class="cline-any cline-yes">5x</span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-yes">4x</span>
|
|
997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
998
|
+
<span class="cline-any cline-yes">4x</span>
|
|
999
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1000
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1002
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1004
|
+
<span class="cline-any cline-no"> </span>
|
|
1005
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1021
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1027
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1028
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1033
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1036
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1037
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1041
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1042
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1043
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1044
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1048
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1050
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1051
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1052
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1054
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1055
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1056
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/*!
|
|
1057
|
+
* Copyright 2022 Palantir Technologies, Inc.
|
|
1058
|
+
*
|
|
1059
|
+
* Licensed under the MIT license. See LICENSE file in the project root for details.
|
|
1060
|
+
*
|
|
1061
|
+
*/
|
|
1062
|
+
|
|
1063
|
+
import * as realFs from "node:fs";
|
|
1064
|
+
import { Host } from "./Host.js";
|
|
1065
|
+
import * as path from "node:path";
|
|
1066
|
+
|
|
1067
|
+
function assertNoTombstone(node: Node): asserts node is Node & { tombstone?: false } {
|
|
1068
|
+
if (node.tombstone) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1069
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Unexpected tombstone ${JSON.stringify(node)}`);</span>
|
|
1070
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
function assertNotType<N extends Node, T extends Node["type"]>(
|
|
1074
|
+
node: N,
|
|
1075
|
+
type: T
|
|
1076
|
+
): asserts node is N & { type: Exclude<N["type"], T> } {
|
|
1077
|
+
if (node.type === type) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1078
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Unexpected node type ${JSON.stringify(node)}`);</span>
|
|
1079
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
function assertType<N extends Node, T extends Node["type"]>(node: N, type: T): asserts node is N & { type: T } {
|
|
1083
|
+
if (node.type !== type) {
|
|
1084
|
+
throw new Error(`Unexpected node type ${JSON.stringify(node)}`);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
function assertExists<T extends Node>(node: T | undefined): asserts node is T {
|
|
1089
|
+
if (!node) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1090
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Expected node to exist`);</span>
|
|
1091
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function assertHasParent(node: Node) {</span></span>
|
|
1095
|
+
<span class="cstat-no" title="statement not covered" > if (!node.parent) {</span>
|
|
1096
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("Expected node to have a parent directory");</span>
|
|
1097
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1098
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1099
|
+
|
|
1100
|
+
interface BaseNode<T extends string> {
|
|
1101
|
+
type: T;
|
|
1102
|
+
fullPath: string;
|
|
1103
|
+
tombstone?: boolean;
|
|
1104
|
+
parent?: DirNode | DirStubNode;
|
|
1105
|
+
needsFlush: boolean;
|
|
1106
|
+
}
|
|
1107
|
+
interface DirNode extends BaseNode<"dir"> {
|
|
1108
|
+
stub?: false;
|
|
1109
|
+
tombstone?: false;
|
|
1110
|
+
dir: Map<string, Node>;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
interface DirStubNode extends BaseNode<"dir"> {
|
|
1114
|
+
stub: true;
|
|
1115
|
+
tombstone?: false;
|
|
1116
|
+
dir: Map<string, Node>;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
interface DirTombstoneNode extends BaseNode<"dir"> {
|
|
1120
|
+
stub?: false;
|
|
1121
|
+
tombstone: true;
|
|
1122
|
+
dir: Map<string, Node>;
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
interface FileNode extends BaseNode<"file"> {
|
|
1126
|
+
stub?: false;
|
|
1127
|
+
tombstone?: false;
|
|
1128
|
+
file: Buffer;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
interface FileTombstoneNode extends BaseNode<"file"> {
|
|
1132
|
+
stub?: false;
|
|
1133
|
+
tombstone: true;
|
|
1134
|
+
file?: never;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
interface FileStubNode extends BaseNode<"file"> {
|
|
1138
|
+
stub: true;
|
|
1139
|
+
tombstone?: false;
|
|
1140
|
+
file?: never;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
interface SymlinkNode extends BaseNode<"symlink"> {
|
|
1144
|
+
tombstone?: false;
|
|
1145
|
+
symlink: string;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
type Node = DirNode | FileNode | SymlinkNode | DirTombstoneNode | FileTombstoneNode | DirStubNode | FileStubNode;
|
|
1149
|
+
|
|
1150
|
+
export class CachingHost implements Host {
|
|
1151
|
+
// We need many trees because of windows, key is the `root`
|
|
1152
|
+
#trees = new Map<string, DirNode | DirStubNode>();
|
|
1153
|
+
|
|
1154
|
+
constructor(
|
|
1155
|
+
private fs: Pick<
|
|
1156
|
+
typeof realFs,
|
|
1157
|
+
| "existsSync"
|
|
1158
|
+
| "lstatSync"
|
|
1159
|
+
| "mkdirSync"
|
|
1160
|
+
| "promises"
|
|
1161
|
+
| "readdirSync"
|
|
1162
|
+
| "readFileSync"
|
|
1163
|
+
| "readlinkSync"
|
|
1164
|
+
| "realpathSync"
|
|
1165
|
+
| "rmdirSync"
|
|
1166
|
+
| "statSync"
|
|
1167
|
+
| "unlinkSync"
|
|
1168
|
+
| "writeFileSync"
|
|
1169
|
+
> = realFs
|
|
1170
|
+
) {}
|
|
1171
|
+
|
|
1172
|
+
#replaceNode(
|
|
1173
|
+
node: FileNode | FileStubNode | SymlinkNode,
|
|
1174
|
+
newNode: Omit<FileTombstoneNode, "fullPath" | "parent">
|
|
1175
|
+
): FileTombstoneNode;
|
|
1176
|
+
#replaceNode(
|
|
1177
|
+
node: FileNode | FileStubNode | FileTombstoneNode,
|
|
1178
|
+
newNode: Omit<FileNode, "fullPath" | "parent">
|
|
1179
|
+
): FileNode;
|
|
1180
|
+
#replaceNode(
|
|
1181
|
+
node: DirTombstoneNode | DirStubNode,
|
|
1182
|
+
newNode: Omit<DirNode, "fullPath" | "parent" | "dir">
|
|
1183
|
+
): DirStubNode;
|
|
1184
|
+
#replaceNode(node: DirNode, newNode: Omit<DirTombstoneNode, "fullPath" | "parent" | "dir">): DirTombstoneNode;
|
|
1185
|
+
#replaceNode(node: Node, partialNewNode: Omit<Node, "fullPath" | "parent">): Node {
|
|
1186
|
+
if (!node.parent) <span class="branch-0 cbranch-no" title="branch not covered" >throw new Error("Cannot replace root node");</span>
|
|
1187
|
+
const newNode: Node = {
|
|
1188
|
+
...partialNewNode,
|
|
1189
|
+
fullPath: node.fullPath,
|
|
1190
|
+
parent: node.parent,
|
|
1191
|
+
dir: (node as DirNode).dir,
|
|
1192
|
+
} as Node;
|
|
1193
|
+
node.parent.dir.set(path.basename(node.fullPath), newNode);
|
|
1194
|
+
return newNode;
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
#unstubDirectory(node: DirNode | DirStubNode): asserts node is DirNode {
|
|
1198
|
+
// So the rules for our stub dirs. We assume the things in the map are authority but
|
|
1199
|
+
// for things not in the map, the real FS is the authority
|
|
1200
|
+
for (const child of this.fs.readdirSync(node.fullPath)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1201
|
+
// just makign this call will populate the structure but its a little expensive.
|
|
1202
|
+
// TODO: make an unknown stub
|
|
1203
|
+
<span class="cstat-no" title="statement not covered" > this.#getNode(path.join(node.fullPath, child));</span>
|
|
1204
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1205
|
+
node.stub = false;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
/**
|
|
1209
|
+
* Assumes no parent -> path is root
|
|
1210
|
+
*
|
|
1211
|
+
* Throws if the path doesnt exist!
|
|
1212
|
+
*/
|
|
1213
|
+
#stubify(filePath: string, parent: undefined): DirStubNode;
|
|
1214
|
+
#stubify(filePath: string, parent: DirNode | DirStubNode | undefined): DirStubNode | SymlinkNode | FileStubNode;
|
|
1215
|
+
#stubify(
|
|
1216
|
+
filePath: string,
|
|
1217
|
+
parent: DirNode | DirStubNode | undefined
|
|
1218
|
+
): typeof parent extends undefined ? DirNode | DirStubNode : DirNode | DirStubNode | SymlinkNode | FileStubNode {
|
|
1219
|
+
const canonicalPath = path.resolve(filePath);
|
|
1220
|
+
|
|
1221
|
+
if (!parent && canonicalPath !== path.parse(canonicalPath).root) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1222
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`parent can only be null if path is root. Instead got: ${canonicalPath}`);</span>
|
|
1223
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1224
|
+
const stat = this.fs.lstatSync(canonicalPath); // may throw
|
|
1225
|
+
|
|
1226
|
+
let node: SymlinkNode | FileStubNode | DirStubNode;
|
|
1227
|
+
|
|
1228
|
+
if (stat.isDirectory()) {
|
|
1229
|
+
node = {
|
|
1230
|
+
fullPath: canonicalPath,
|
|
1231
|
+
type: "dir",
|
|
1232
|
+
stub: true,
|
|
1233
|
+
dir: new Map(),
|
|
1234
|
+
parent,
|
|
1235
|
+
needsFlush: false,
|
|
1236
|
+
};
|
|
1237
|
+
} else if (stat.isSymbolicLink()) {
|
|
1238
|
+
node = {
|
|
1239
|
+
fullPath: canonicalPath,
|
|
1240
|
+
type: "symlink",
|
|
1241
|
+
symlink: this.fs.readlinkSync(canonicalPath),
|
|
1242
|
+
parent,
|
|
1243
|
+
needsFlush: false,
|
|
1244
|
+
};
|
|
1245
|
+
} else if (stat.isFile()) {
|
|
1246
|
+
node = {
|
|
1247
|
+
fullPath: canonicalPath,
|
|
1248
|
+
type: "file",
|
|
1249
|
+
stub: true,
|
|
1250
|
+
parent,
|
|
1251
|
+
needsFlush: false,
|
|
1252
|
+
};
|
|
1253
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
|
|
1254
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`what is not a file nor symlink nor directory? nothing we care about: ${canonicalPath}`);</span>
|
|
1255
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1256
|
+
|
|
1257
|
+
if (!parent && node.type === "dir") {
|
|
1258
|
+
this.#trees.set(canonicalPath, node);
|
|
1259
|
+
return node;
|
|
1260
|
+
} else if (parent) {
|
|
1261
|
+
parent.dir.set(path.basename(canonicalPath), node);
|
|
1262
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
|
|
1263
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`root can only be a dir, got ${JSON.stringify(node)} for path: ${canonicalPath}`);</span>
|
|
1264
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1265
|
+
return node;
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
/**
|
|
1269
|
+
* Note: may return the node itself!
|
|
1270
|
+
* You should check the `fullPath` of the result.
|
|
1271
|
+
*/
|
|
1272
|
+
#getNearestAncestorNode(filePath: string) {
|
|
1273
|
+
const canonicalPath = path.resolve(filePath);
|
|
1274
|
+
const { root } = path.parse(canonicalPath);
|
|
1275
|
+
const parts = [];
|
|
1276
|
+
|
|
1277
|
+
let maybePath = canonicalPath;
|
|
1278
|
+
while (maybePath !== root) {
|
|
1279
|
+
parts.unshift(path.basename(maybePath));
|
|
1280
|
+
maybePath = path.dirname(maybePath);
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
let curPath = root;
|
|
1284
|
+
let curNode: Node = this.#trees.get(root) ?? this.#stubify(curPath, undefined); // its okay to throw if there is no root
|
|
1285
|
+
try {
|
|
1286
|
+
for (const part of parts) {
|
|
1287
|
+
assertNoTombstone(curNode);
|
|
1288
|
+
assertNotType(curNode, "file");
|
|
1289
|
+
if (curNode.type === "symlink") <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1290
|
+
<span class="cstat-no" title="statement not covered" > const linkedNode = this.#getNodeResolvingSymlinks(path.resolve(path.dirname(curPath), curNode.symlink));</span>
|
|
1291
|
+
<span class="cstat-no" title="statement not covered" > assertExists(linkedNode);</span>
|
|
1292
|
+
<span class="cstat-no" title="statement not covered" > assertNoTombstone(linkedNode);</span>
|
|
1293
|
+
<span class="cstat-no" title="statement not covered" > assertType(linkedNode, "dir");</span>
|
|
1294
|
+
<span class="cstat-no" title="statement not covered" > curNode = linkedNode;</span>
|
|
1295
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1296
|
+
assertType(curNode, "dir");
|
|
1297
|
+
assertNoTombstone(curNode);
|
|
1298
|
+
curNode = curNode.dir.get(part) ?? this.#stubify(path.join(curNode.fullPath, part), curNode);
|
|
1299
|
+
curPath = path.join(curPath, part);
|
|
1300
|
+
}
|
|
1301
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1302
|
+
} catch (e) {
|
|
1303
|
+
// This error is expected when things done exist.
|
|
1304
|
+
// console.log(`Got EXPECTED error when trying to getNearestAncestorNode(${canonicalPath}): `, (e as any).message);
|
|
1305
|
+
}
|
|
1306
|
+
return { pathWithSymlinks: curPath, node: curNode };
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
#getNode(filePath: string) {
|
|
1310
|
+
const canonicalPath = path.resolve(filePath);
|
|
1311
|
+
const { pathWithSymlinks, node } = this.#getNearestAncestorNode(canonicalPath);
|
|
1312
|
+
if (pathWithSymlinks === canonicalPath) {
|
|
1313
|
+
return node;
|
|
1314
|
+
}
|
|
1315
|
+
return undefined;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
#getNodeResolvingSymlinks(filePath: string, follows: number = 100): Exclude<Node, SymlinkNode> | undefined {
|
|
1319
|
+
const node = this.#getNode(filePath); // canonicalizes for us
|
|
1320
|
+
if (!node || node.type !== "symlink") return node;
|
|
1321
|
+
// this is a really poor mans way of doing this. but who has 100's of symlinks hanging around?
|
|
1322
|
+
if (follows === 0) <span class="branch-0 cbranch-no" title="branch not covered" >throw new Error("Exhausted symlink follows");</span>
|
|
1323
|
+
|
|
1324
|
+
return this.#getNodeResolvingSymlinks(node.symlink, follows--);
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
mkdir(filePath: string, opts: { recursive: boolean } = { recursive: false }): void {
|
|
1328
|
+
const canonicalPath = path.resolve(filePath);
|
|
1329
|
+
const { node, pathWithSymlinks } = this.#getNearestAncestorNode(canonicalPath);
|
|
1330
|
+
if (filePath === pathWithSymlinks) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1331
|
+
<span class="cstat-no" title="statement not covered" > assertType(node, "dir");</span>
|
|
1332
|
+
<span class="cstat-no" title="statement not covered" > assertHasParent(node);</span>
|
|
1333
|
+
<span class="cstat-no" title="statement not covered" > if (!node.tombstone) return; // already done</span>
|
|
1334
|
+
} else if (path.dirname(filePath) === pathWithSymlinks) {
|
|
1335
|
+
assertType(node, "dir");
|
|
1336
|
+
assertNoTombstone(node);
|
|
1337
|
+
node.dir.set(path.basename(filePath), {
|
|
1338
|
+
type: "dir",
|
|
1339
|
+
fullPath: filePath,
|
|
1340
|
+
parent: node,
|
|
1341
|
+
dir: new Map(),
|
|
1342
|
+
needsFlush: true,
|
|
1343
|
+
});
|
|
1344
|
+
return;
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
if (!opts.<span class="branch-0 cbranch-no" title="branch not covered" >recursive && path.dirname(canonicalPath) !== pathWithSymlinks) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span>
|
|
1348
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("no such file or directory");</span>
|
|
1349
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1350
|
+
|
|
1351
|
+
const rootPath = pathWithSymlinks;
|
|
1352
|
+
let maybePath = canonicalPath;
|
|
1353
|
+
const toMake: string[] = [];
|
|
1354
|
+
while (maybePath !== rootPath) {
|
|
1355
|
+
toMake.unshift(path.resolve(node.fullPath, path.relative(rootPath, maybePath)));
|
|
1356
|
+
maybePath = path.dirname(maybePath);
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
for (const dirToMake of toMake) {
|
|
1360
|
+
this.mkdir(dirToMake);
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
rmdir(directoryPath: string): void {
|
|
1365
|
+
const node = this.#getNode(directoryPath);
|
|
1366
|
+
if (!node || node.tombstone) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1367
|
+
<span class="cstat-no" title="statement not covered" > return; // this isnt how FS usually work but its what we are doing</span>
|
|
1368
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1369
|
+
assertType(node, "dir");
|
|
1370
|
+
if (node.stub) {
|
|
1371
|
+
this.#unstubDirectory(node);
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
if (node.dir.size === 0) {
|
|
1375
|
+
this.#replaceNode(node, {
|
|
1376
|
+
type: "dir",
|
|
1377
|
+
tombstone: true,
|
|
1378
|
+
needsFlush: true,
|
|
1379
|
+
});
|
|
1380
|
+
} else {
|
|
1381
|
+
throw new Error("directory not empty");
|
|
1382
|
+
}
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
exists(filePath: string): boolean {
|
|
1386
|
+
const node = this.#getNode(filePath); // canonicalizes for us
|
|
1387
|
+
return !!node && !node.tombstone;
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
readFile(filePath: string, opts?: undefined): Buffer;
|
|
1391
|
+
readFile(filePath: string, opts: { encoding: BufferEncoding }): string;
|
|
1392
|
+
readFile(filePath: string, opts: { asJson: true }): object;
|
|
1393
|
+
readFile(
|
|
1394
|
+
filePath: string,
|
|
1395
|
+
opts: undefined | { encoding: BufferEncoding; asJson?: false } | { encoding?: never; asJson: true }
|
|
1396
|
+
) {
|
|
1397
|
+
let node = this.#getNodeResolvingSymlinks(filePath); // canonicalizes for us
|
|
1398
|
+
|
|
1399
|
+
if (!node) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1400
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1401
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1402
|
+
assertNotType(node, "dir");
|
|
1403
|
+
assertNoTombstone(node);
|
|
1404
|
+
|
|
1405
|
+
if (node.stub) {
|
|
1406
|
+
node = this.#replaceNode(node, {
|
|
1407
|
+
type: "file",
|
|
1408
|
+
file: this.fs.readFileSync(filePath),
|
|
1409
|
+
needsFlush: false,
|
|
1410
|
+
});
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
if (!opts) {
|
|
1414
|
+
return Buffer.from(node.file);
|
|
1415
|
+
} else if (opts.asJson) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1416
|
+
<span class="cstat-no" title="statement not covered" > return JSON.parse(node.file.toString("utf-8"));</span>
|
|
1417
|
+
} else {
|
|
1418
|
+
return node.file.toString(opts.encoding);
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
writeFile(filePath: string, buffer: Buffer): void;
|
|
1423
|
+
writeFile(filePath: string, body: string, opts: { encoding: BufferEncoding }): void;
|
|
1424
|
+
writeFile(filePath: string, body: string, opts: { encoding: BufferEncoding }): void;
|
|
1425
|
+
writeFile(filePath: string, body: string | Buffer, opts?: { encoding: BufferEncoding }) {
|
|
1426
|
+
const fileContentsAsBuffer = typeof body === "string" ? Buffer.from(body, opts?.encoding<span class="branch-0 cbranch-no" title="branch not covered" >) : Buffer.from(body);</span>
|
|
1427
|
+
|
|
1428
|
+
const canonicalPath = path.resolve(filePath);
|
|
1429
|
+
const existingNode = this.#getNodeResolvingSymlinks(canonicalPath);
|
|
1430
|
+
if (existingNode) {
|
|
1431
|
+
if (existingNode.type === "dir") <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1432
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("cant write file to a dir");</span>
|
|
1433
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1434
|
+
this.#replaceNode(existingNode, {
|
|
1435
|
+
file: fileContentsAsBuffer,
|
|
1436
|
+
type: "file",
|
|
1437
|
+
needsFlush: true,
|
|
1438
|
+
});
|
|
1439
|
+
return;
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
const maybeDirNode = this.#getNodeResolvingSymlinks(path.dirname(canonicalPath));
|
|
1443
|
+
assertExists(maybeDirNode);
|
|
1444
|
+
assertType(maybeDirNode, "dir");
|
|
1445
|
+
assertNoTombstone(maybeDirNode);
|
|
1446
|
+
|
|
1447
|
+
maybeDirNode.dir.set(path.basename(canonicalPath), {
|
|
1448
|
+
type: "file",
|
|
1449
|
+
fullPath: canonicalPath,
|
|
1450
|
+
parent: maybeDirNode,
|
|
1451
|
+
file: fileContentsAsBuffer,
|
|
1452
|
+
needsFlush: true,
|
|
1453
|
+
});
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
deleteFile(filePath: string) {
|
|
1457
|
+
const canonicalPath = path.resolve(filePath);
|
|
1458
|
+
const node = this.#getNode(canonicalPath);
|
|
1459
|
+
if (!node || (node.type === "file" && node.tombstone === true)) return;
|
|
1460
|
+
assertNotType(node, "dir");
|
|
1461
|
+
this.#replaceNode(node, {
|
|
1462
|
+
type: "file",
|
|
1463
|
+
tombstone: true,
|
|
1464
|
+
needsFlush: true,
|
|
1465
|
+
});
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
<span class="fstat-no" title="function not covered" > readJson(filePath: string) {</span>
|
|
1469
|
+
<span class="cstat-no" title="statement not covered" > return this.readFile(filePath, { asJson: true });</span>
|
|
1470
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1471
|
+
|
|
1472
|
+
writeJson(filePath: string, o: object): void {
|
|
1473
|
+
return this.writeFile(filePath, JSON.stringify(o, undefined, 2) + "\n", {
|
|
1474
|
+
encoding: "utf-8",
|
|
1475
|
+
});
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
async #flushFileNode(node: FileNode | FileStubNode | FileTombstoneNode): Promise<unknown> {
|
|
1479
|
+
// FIXME all tombstones need a flush, so we can get rid of needsFlush for them
|
|
1480
|
+
if (node.tombstone) {
|
|
1481
|
+
try {
|
|
1482
|
+
await this.fs.promises.access(node.fullPath<span class="branch-0 cbranch-no" title="branch not covered" >);</span>
|
|
1483
|
+
<span class="cstat-no" title="statement not covered" > return this.fs.promises.unlink(node.fullPath);</span>
|
|
1484
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1485
|
+
} catch (e) {
|
|
1486
|
+
// should only throw if file doesnt exist which is no op
|
|
1487
|
+
return;
|
|
1488
|
+
}
|
|
1489
|
+
} else if (node.stub === true || node.needsFlush === false) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1490
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1491
|
+
} else {
|
|
1492
|
+
// we dont do things with file stubs
|
|
1493
|
+
return this.fs.promises.writeFile(node.fullPath, node.file);
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
async #flushSymlinkNode(node: SymlinkNode) {
|
|
1498
|
+
if (!node.needsFlush) <span class="branch-0 cbranch-no" title="branch not covered" >return;</span>
|
|
1499
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1500
|
+
<span class="cstat-no" title="statement not covered" > const linkValue = await this.fs.promises.readlink(node.fullPath);</span>
|
|
1501
|
+
<span class="cstat-no" title="statement not covered" > if (linkValue === node.symlink) {</span>
|
|
1502
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1503
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1504
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1505
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } catch (e) {</span>
|
|
1506
|
+
// expected when the link doesnt exist
|
|
1507
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1508
|
+
<span class="cstat-no" title="statement not covered" > return this.fs.promises.symlink(node.symlink, node.fullPath);</span>
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
async #flushDirNode(node: DirNode | DirStubNode | DirTombstoneNode): Promise<unknown> {
|
|
1512
|
+
if (!node.tombstone && node.needsFlush) {
|
|
1513
|
+
try {
|
|
1514
|
+
await this.fs.promises.access(node.fullPath<span class="branch-0 cbranch-no" title="branch not covered" >); // throws if the file doesnt exist</span>
|
|
1515
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1516
|
+
} catch (e) {
|
|
1517
|
+
await this.fs.promises.mkdir(node.fullPath); // throws if it does :(
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
const promises: Promise<unknown>[] = [];
|
|
1522
|
+
for (const child of node.dir.values()) {
|
|
1523
|
+
if (node.<span class="branch-0 cbranch-no" title="branch not covered" >tombstone && !child.tombstone) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span>
|
|
1524
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("Unexpected failure during sanity check. A non-deleted child is on a deleted dir");</span>
|
|
1525
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1526
|
+
if (child.type === "dir") {
|
|
1527
|
+
promises.push(this.#flushDirNode(child));
|
|
1528
|
+
} else if (child.type === "file") {
|
|
1529
|
+
promises.push(this.#flushFileNode(child));
|
|
1530
|
+
} else if (child.type === "symlink") {
|
|
1531
|
+
promises.push(this.#flushSymlinkNode(child));
|
|
1532
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
|
|
1533
|
+
<span class="cstat-no" title="statement not covered" > throw new Error("should never happen");</span>
|
|
1534
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1535
|
+
}
|
|
1536
|
+
await Promise.all(promises);
|
|
1537
|
+
if (node.tombstone) {
|
|
1538
|
+
return this.fs.promises.rmdir(node.fullPath);
|
|
1539
|
+
}
|
|
1540
|
+
return;
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
flush() {
|
|
1544
|
+
const promises: Promise<unknown>[] = [];
|
|
1545
|
+
for (const rootNode of this.#trees.values()) {
|
|
1546
|
+
promises.push(this.#flushDirNode(rootNode));
|
|
1547
|
+
}
|
|
1548
|
+
return Promise.all(promises);
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
</pre></td></tr></table></pre>
|
|
1552
|
+
|
|
1553
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1554
|
+
</div><!-- /wrapper -->
|
|
1555
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1556
|
+
Code coverage generated by
|
|
1557
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1558
|
+
at 2025-01-17T16:18:31.005Z
|
|
1559
|
+
</div>
|
|
1560
|
+
<script src="prettify.js"></script>
|
|
1561
|
+
<script>
|
|
1562
|
+
window.onload = function () {
|
|
1563
|
+
prettyPrint();
|
|
1564
|
+
};
|
|
1565
|
+
</script>
|
|
1566
|
+
<script src="sorter.js"></script>
|
|
1567
|
+
<script src="block-navigation.js"></script>
|
|
1568
|
+
</body>
|
|
1569
|
+
</html>
|
|
1570
|
+
|