@contractkit/plugin-bruno 0.9.1
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-build$colon$ci.log +35 -0
- package/.turbo/turbo-build.log +15 -0
- package/.turbo/turbo-test$colon$ci.log +128 -0
- package/.turbo/turbo-test.log +14 -0
- package/CHANGELOG.md +110 -0
- package/README.md +80 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +313 -0
- package/coverage/coverage-final.json +3 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +131 -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 +210 -0
- package/coverage/src/codegen-bruno.ts.html +1903 -0
- package/coverage/src/index.html +116 -0
- package/coverage/tests/helpers.ts.html +604 -0
- package/coverage/tests/index.html +116 -0
- package/dist/codegen-bruno.d.ts +50 -0
- package/dist/codegen-bruno.d.ts.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +631 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +6 -0
- package/package.json +43 -0
- package/src/codegen-bruno.ts +606 -0
- package/src/index.ts +130 -0
- package/tests/codegen-bruno.test.ts +1008 -0
- package/tests/helpers.ts +173 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,1903 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/codegen-bruno.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</a> codegen-bruno.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">86.1% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>254/295</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">75.1% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>181/241</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">90.9% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>40/44</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">87.54% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>225/257</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>
|
|
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-yes">1x</span>
|
|
693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </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-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-yes">79x</span>
|
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
735
|
+
<span class="cline-any cline-yes">79x</span>
|
|
736
|
+
<span class="cline-any cline-yes">79x</span>
|
|
737
|
+
<span class="cline-any cline-yes">79x</span>
|
|
738
|
+
<span class="cline-any cline-yes">79x</span>
|
|
739
|
+
<span class="cline-any cline-yes">79x</span>
|
|
740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
741
|
+
<span class="cline-any cline-yes">79x</span>
|
|
742
|
+
<span class="cline-any cline-yes">79x</span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-yes">79x</span>
|
|
746
|
+
<span class="cline-any cline-yes">79x</span>
|
|
747
|
+
<span class="cline-any cline-yes">79x</span>
|
|
748
|
+
<span class="cline-any cline-yes">79x</span>
|
|
749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
750
|
+
<span class="cline-any cline-yes">79x</span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-yes">79x</span>
|
|
753
|
+
<span class="cline-any cline-yes">79x</span>
|
|
754
|
+
<span class="cline-any cline-yes">79x</span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-yes">79x</span>
|
|
757
|
+
<span class="cline-any cline-yes">4x</span>
|
|
758
|
+
<span class="cline-any cline-yes">4x</span>
|
|
759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-yes">79x</span>
|
|
762
|
+
<span class="cline-any cline-yes">79x</span>
|
|
763
|
+
<span class="cline-any cline-yes">80x</span>
|
|
764
|
+
<span class="cline-any cline-yes">84x</span>
|
|
765
|
+
<span class="cline-any cline-yes">83x</span>
|
|
766
|
+
<span class="cline-any cline-yes">84x</span>
|
|
767
|
+
<span class="cline-any cline-yes">84x</span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-yes">84x</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-yes">324x</span>
|
|
777
|
+
<span class="cline-any cline-yes">79x</span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-yes">79x</span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-yes">5x</span>
|
|
788
|
+
<span class="cline-any cline-yes">5x</span>
|
|
789
|
+
<span class="cline-any cline-yes">7x</span>
|
|
790
|
+
<span class="cline-any cline-yes">1x</span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-neutral"> </span>
|
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
795
|
+
<span class="cline-any cline-yes">4x</span>
|
|
796
|
+
<span class="cline-any cline-neutral"> </span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-yes">79x</span>
|
|
802
|
+
<span class="cline-any cline-yes">79x</span>
|
|
803
|
+
<span class="cline-any cline-yes">6x</span>
|
|
804
|
+
<span class="cline-any cline-yes">6x</span>
|
|
805
|
+
<span class="cline-any cline-yes">6x</span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-yes">79x</span>
|
|
808
|
+
<span class="cline-any cline-yes">79x</span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
812
|
+
<span class="cline-any cline-yes">79x</span>
|
|
813
|
+
<span class="cline-any cline-yes">79x</span>
|
|
814
|
+
<span class="cline-any cline-yes">6x</span>
|
|
815
|
+
<span class="cline-any cline-yes">7x</span>
|
|
816
|
+
<span class="cline-any cline-yes">7x</span>
|
|
817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-yes">79x</span>
|
|
820
|
+
<span class="cline-any cline-yes">79x</span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
824
|
+
<span class="cline-any cline-yes">83x</span>
|
|
825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-yes">83x</span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-yes">83x</span>
|
|
840
|
+
<span class="cline-any cline-yes">83x</span>
|
|
841
|
+
<span class="cline-any cline-yes">83x</span>
|
|
842
|
+
<span class="cline-any cline-yes">83x</span>
|
|
843
|
+
<span class="cline-any cline-yes">83x</span>
|
|
844
|
+
<span class="cline-any cline-yes">83x</span>
|
|
845
|
+
<span class="cline-any cline-yes">83x</span>
|
|
846
|
+
<span class="cline-any cline-yes">83x</span>
|
|
847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
850
|
+
<span class="cline-any cline-yes">83x</span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-yes">83x</span>
|
|
857
|
+
<span class="cline-any cline-yes">15x</span>
|
|
858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
859
|
+
<span class="cline-any cline-yes">83x</span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-yes">83x</span>
|
|
862
|
+
<span class="cline-any cline-yes">20x</span>
|
|
863
|
+
<span class="cline-any cline-yes">20x</span>
|
|
864
|
+
<span class="cline-any cline-yes">29x</span>
|
|
865
|
+
<span class="cline-any cline-yes">29x</span>
|
|
866
|
+
<span class="cline-any cline-yes">29x</span>
|
|
867
|
+
<span class="cline-any cline-yes">29x</span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-yes">83x</span>
|
|
873
|
+
<span class="cline-any cline-yes">4x</span>
|
|
874
|
+
<span class="cline-any cline-yes">4x</span>
|
|
875
|
+
<span class="cline-any cline-yes">4x</span>
|
|
876
|
+
<span class="cline-any cline-yes">4x</span>
|
|
877
|
+
<span class="cline-any cline-yes">6x</span>
|
|
878
|
+
<span class="cline-any cline-yes">6x</span>
|
|
879
|
+
<span class="cline-any cline-yes">6x</span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
885
|
+
<span class="cline-any cline-yes">83x</span>
|
|
886
|
+
<span class="cline-any cline-yes">6x</span>
|
|
887
|
+
<span class="cline-any cline-yes">6x</span>
|
|
888
|
+
<span class="cline-any cline-yes">1x</span>
|
|
889
|
+
<span class="cline-any cline-yes">1x</span>
|
|
890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
891
|
+
<span class="cline-any cline-yes">5x</span>
|
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
893
|
+
<span class="cline-any cline-neutral"> </span>
|
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
|
+
<span class="cline-any cline-yes">83x</span>
|
|
897
|
+
<span class="cline-any cline-yes">19x</span>
|
|
898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
903
|
+
<span class="cline-any cline-yes">57x</span>
|
|
904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
905
|
+
<span class="cline-any cline-yes">19x</span>
|
|
906
|
+
<span class="cline-any cline-yes">19x</span>
|
|
907
|
+
<span class="cline-any cline-yes">1x</span>
|
|
908
|
+
<span class="cline-any cline-yes">1x</span>
|
|
909
|
+
<span class="cline-any cline-yes">18x</span>
|
|
910
|
+
<span class="cline-any cline-no"> </span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
913
|
+
<span class="cline-any cline-yes">18x</span>
|
|
914
|
+
<span class="cline-any cline-yes">18x</span>
|
|
915
|
+
<span class="cline-any cline-yes">18x</span>
|
|
916
|
+
<span class="cline-any cline-yes">18x</span>
|
|
917
|
+
<span class="cline-any cline-yes">61x</span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
923
|
+
<span class="cline-any cline-yes">83x</span>
|
|
924
|
+
<span class="cline-any cline-yes">83x</span>
|
|
925
|
+
<span class="cline-any cline-yes">83x</span>
|
|
926
|
+
<span class="cline-any cline-yes">83x</span>
|
|
927
|
+
<span class="cline-any cline-yes">3x</span>
|
|
928
|
+
<span class="cline-any cline-yes">3x</span>
|
|
929
|
+
<span class="cline-any cline-yes">3x</span>
|
|
930
|
+
<span class="cline-any cline-yes">3x</span>
|
|
931
|
+
<span class="cline-any cline-yes">3x</span>
|
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-yes">3x</span>
|
|
935
|
+
<span class="cline-any cline-yes">3x</span>
|
|
936
|
+
<span class="cline-any cline-yes">1x</span>
|
|
937
|
+
<span class="cline-any cline-yes">1x</span>
|
|
938
|
+
<span class="cline-any cline-yes">1x</span>
|
|
939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
941
|
+
<span class="cline-any cline-neutral"> </span>
|
|
942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
943
|
+
<span class="cline-any cline-yes">83x</span>
|
|
944
|
+
<span class="cline-any cline-yes">83x</span>
|
|
945
|
+
<span class="cline-any cline-yes">3x</span>
|
|
946
|
+
<span class="cline-any cline-yes">3x</span>
|
|
947
|
+
<span class="cline-any cline-yes">3x</span>
|
|
948
|
+
<span class="cline-any cline-yes">8x</span>
|
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-yes">83x</span>
|
|
953
|
+
<span class="cline-any cline-yes">83x</span>
|
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
958
|
+
<span class="cline-any cline-yes">83x</span>
|
|
959
|
+
<span class="cline-any cline-yes">83x</span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
964
|
+
<span class="cline-any cline-yes">83x</span>
|
|
965
|
+
<span class="cline-any cline-yes">83x</span>
|
|
966
|
+
<span class="cline-any cline-yes">83x</span>
|
|
967
|
+
<span class="cline-any cline-yes">83x</span>
|
|
968
|
+
<span class="cline-any cline-yes">83x</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-yes">2x</span>
|
|
973
|
+
<span class="cline-any cline-yes">2x</span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-yes">1x</span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-yes">83x</span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-yes">6x</span>
|
|
985
|
+
<span class="cline-any cline-yes">6x</span>
|
|
986
|
+
<span class="cline-any cline-yes">4x</span>
|
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
988
|
+
<span class="cline-any cline-yes">2x</span>
|
|
989
|
+
<span class="cline-any cline-yes">1x</span>
|
|
990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
991
|
+
<span class="cline-any cline-yes">1x</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-neutral"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1002
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1003
|
+
<span class="cline-any cline-no"> </span>
|
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-yes">79x</span>
|
|
1010
|
+
<span class="cline-any cline-yes">79x</span>
|
|
1011
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1012
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-yes">79x</span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1042
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1047
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1048
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1052
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1064
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1065
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1079
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1080
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1081
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1082
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1083
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1084
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1085
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1087
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1089
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1097
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1098
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1101
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1107
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1108
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1109
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1115
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1125
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1127
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1129
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1139
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1147
|
+
<span class="cline-any cline-yes">38x</span>
|
|
1148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1149
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1157
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1161
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1163
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1169
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1171
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1182
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1194
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1195
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1198
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1217
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1218
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1219
|
+
<span class="cline-any cline-yes">26x</span>
|
|
1220
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1221
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1222
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1224
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1234
|
+
<span class="cline-any cline-yes">83x</span>
|
|
1235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1237
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1239
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1242
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1243
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1255
|
+
<span class="cline-any cline-yes">86x</span>
|
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
+
<span class="cline-any cline-yes">83x</span>
|
|
1261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1265
|
+
<span class="cline-any cline-yes">78x</span>
|
|
1266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-yes">328x</span>
|
|
1274
|
+
<span class="cline-any cline-yes">97x</span>
|
|
1275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1276
|
+
<span class="cline-any cline-yes">231x</span>
|
|
1277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1278
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type {
|
|
1279
|
+
OpRootNode,
|
|
1280
|
+
OpRouteNode,
|
|
1281
|
+
OpOperationNode,
|
|
1282
|
+
OpResponseNode,
|
|
1283
|
+
ParamSource,
|
|
1284
|
+
ContractTypeNode,
|
|
1285
|
+
ContractRootNode,
|
|
1286
|
+
ModelNode,
|
|
1287
|
+
FieldNode,
|
|
1288
|
+
} from '@contractkit/core';
|
|
1289
|
+
import { resolveSecurity, resolveModifiers, SECURITY_NONE } from '@contractkit/core';
|
|
1290
|
+
import { basename } from 'path';
|
|
1291
|
+
|
|
1292
|
+
export interface OpenCollectionFile {
|
|
1293
|
+
relativePath: string;
|
|
1294
|
+
content: string;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
/** Manifest filename — tracks which files this plugin previously generated so subsequent runs can clean up only those, leaving any user-added files alone. */
|
|
1298
|
+
export const MANIFEST_FILENAME = '.contractkit-bruno-manifest.json';
|
|
1299
|
+
|
|
1300
|
+
/** Subset of a security scheme sufficient for Bruno auth generation (non-HMAC). */
|
|
1301
|
+
export interface BrunoSecurityScheme {
|
|
1302
|
+
type: string; // "http" | "apiKey" | "oauth2" | "openIdConnect"
|
|
1303
|
+
scheme?: string; // "bearer" | "basic" (when type === "http")
|
|
1304
|
+
name?: string; // header/query param name (when type === "apiKey")
|
|
1305
|
+
in?: string; // "header" | "query" (when type === "apiKey")
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
export interface BrunoAuthOptions {
|
|
1309
|
+
/** Name of the default scheme (from config.security.default) */
|
|
1310
|
+
defaultScheme?: string;
|
|
1311
|
+
/** Scheme definitions keyed by name (non-HMAC only) */
|
|
1312
|
+
schemes?: Record<string, BrunoSecurityScheme>;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
export interface OpenCollectionOptions {
|
|
1316
|
+
collectionName: string;
|
|
1317
|
+
contractRoots?: ContractRootNode[];
|
|
1318
|
+
auth?: BrunoAuthOptions;
|
|
1319
|
+
/**
|
|
1320
|
+
* When true, emit Bruno faker template strings (e.g. `{{$randomUUID}}`,
|
|
1321
|
+
* `{{$randomEmail}}`) for compatible scalar types so each send produces
|
|
1322
|
+
* fresh data. When false (default), use deterministic placeholders.
|
|
1323
|
+
*/
|
|
1324
|
+
randomExamples?: boolean;
|
|
1325
|
+
/**
|
|
1326
|
+
* Whether to generate request files for operations marked `internal`. Defaults to
|
|
1327
|
+
* `true` — Bruno collections are typically used by the team that owns the API and
|
|
1328
|
+
* benefit from full coverage. Set to `false` to omit internal ops.
|
|
1329
|
+
*/
|
|
1330
|
+
includeInternal?: boolean;
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
/**
|
|
1334
|
+
* Generates an OpenCollection (https://spec.opencollection.com/) API collection
|
|
1335
|
+
* from a set of operation roots. Produces opencollection.yml, an environment
|
|
1336
|
+
* file, and one .yml request file per operation.
|
|
1337
|
+
*/
|
|
1338
|
+
export function generateOpenCollection(roots: OpRootNode[], options: OpenCollectionOptions): OpenCollectionFile[] {
|
|
1339
|
+
const files: OpenCollectionFile[] = [];
|
|
1340
|
+
|
|
1341
|
+
const modelMap = buildModelMap(options.contractRoots ?? []);
|
|
1342
|
+
const authOpts = options.auth;
|
|
1343
|
+
const defaultScheme = authOpts?.defaultScheme ? authOpts.schemes?.[authOpts.defaultScheme] : undefined;
|
|
1344
|
+
const randomExamples = options.randomExamples ?? false;
|
|
1345
|
+
const includeInternal = options.includeInternal ?? true;
|
|
1346
|
+
|
|
1347
|
+
files.push({ relativePath: 'opencollection.yml', content: generateCollectionRoot(options.collectionName, defaultScheme) });
|
|
1348
|
+
files.push({ relativePath: 'environments/local.yml', content: generateEnvFile(defaultScheme) });
|
|
1349
|
+
// Manifest is appended at the end so it lists every generated path including itself.
|
|
1350
|
+
|
|
1351
|
+
for (let rootIdx = 0; rootIdx < roots.length; rootIdx++) {
|
|
1352
|
+
const root = roots[rootIdx]!;
|
|
1353
|
+
const folder = root.meta['area'] ? slugifyName(root.meta['area']) : deriveFolderName(root.file);
|
|
1354
|
+
const displayName = (root.meta['area'] ?? folder).charAt(0).toUpperCase() + (root.meta['area'] ?? folder).slice(1);
|
|
1355
|
+
|
|
1356
|
+
files.push({ relativePath: `${folder}/folder.yml`, content: generateFolderFile(displayName, rootIdx + 1) });
|
|
1357
|
+
|
|
1358
|
+
const subarea = root.meta['subarea'];
|
|
1359
|
+
const subareaSlug = subarea ? slugifyName(subarea) : undefined;
|
|
1360
|
+
const requestDir = subareaSlug ? `${folder}/${subareaSlug}` : folder;
|
|
1361
|
+
|
|
1362
|
+
if (subareaSlug) {
|
|
1363
|
+
const subareaDisplayName = subarea!.charAt(0).toUpperCase() + subarea!.slice(1);
|
|
1364
|
+
files.push({ relativePath: `${requestDir}/folder.yml`, content: generateFolderFile(subareaDisplayName, 1) });
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
let seq = 1;
|
|
1368
|
+
for (const route of root.routes) {
|
|
1369
|
+
for (const op of route.operations) {
|
|
1370
|
+
if (!includeInternal && resolveModifiers(route, op).includes('internal')) continue;
|
|
1371
|
+
const requestName = op.name ?? route.path;
|
|
1372
|
+
const fileName = op.name ? `${slugifyName(op.name)}.yml` : `${op.method}-${sanitizePath(route.path)}.yml`;
|
|
1373
|
+
files.push({
|
|
1374
|
+
relativePath: `${requestDir}/${fileName}`,
|
|
1375
|
+
content: generateRequestFile(route, op, requestName, seq, modelMap, root, defaultScheme, randomExamples),
|
|
1376
|
+
});
|
|
1377
|
+
seq++;
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
const trackedPaths = [...files.map(f => f.relativePath), MANIFEST_FILENAME].sort();
|
|
1383
|
+
files.push({
|
|
1384
|
+
relativePath: MANIFEST_FILENAME,
|
|
1385
|
+
content: JSON.stringify({ files: trackedPaths }, null, 2) + '\n',
|
|
1386
|
+
});
|
|
1387
|
+
|
|
1388
|
+
return files;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
/** Parse a previously-written manifest. Returns the list of relative paths to clean up. Returns [] if missing or unreadable so a stale/garbled manifest never blocks regeneration. */
|
|
1392
|
+
export function parseManifest(content: string): string[] {
|
|
1393
|
+
try {
|
|
1394
|
+
const parsed = JSON.parse(content);
|
|
1395
|
+
if (Array.isArray(parsed?.files) && parsed.files.every((f: unknown) => typeof f === 'string')) {
|
|
1396
|
+
return parsed.files as string[];
|
|
1397
|
+
}
|
|
1398
|
+
} catch {
|
|
1399
|
+
// fall through
|
|
1400
|
+
}
|
|
1401
|
+
return [];
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
// ─── File generators ───────────────────────────────────────────────────────
|
|
1405
|
+
|
|
1406
|
+
function generateCollectionRoot(name: string, scheme?: BrunoSecurityScheme): string {
|
|
1407
|
+
const lines = [`opencollection: "1.0.0"`, `info:`, ` name: ${yamlString(name)}`];
|
|
1408
|
+
if (scheme) {
|
|
1409
|
+
lines.push(``);
|
|
1410
|
+
lines.push(`request:`);
|
|
1411
|
+
lines.push(...renderAuthBlock(scheme, ' '));
|
|
1412
|
+
}
|
|
1413
|
+
lines.push(``);
|
|
1414
|
+
return lines.join('\n');
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
function generateEnvFile(scheme?: BrunoSecurityScheme): string {
|
|
1418
|
+
const lines = [`name: Local`, `variables:`, ` - name: baseUrl`, ` value: "http://localhost:3000"`];
|
|
1419
|
+
if (scheme) {
|
|
1420
|
+
for (const varName of authEnvVarNames(scheme)) {
|
|
1421
|
+
lines.push(` - name: ${varName}`);
|
|
1422
|
+
lines.push(` value: ""`);
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
lines.push(``);
|
|
1426
|
+
return lines.join('\n');
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
function generateFolderFile(name: string, seq: number): string {
|
|
1430
|
+
return [`info:`, ` name: ${yamlString(name)}`, ` type: folder`, ` seq: ${seq}`, ``].join('\n');
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
function generateRequestFile(
|
|
1434
|
+
route: OpRouteNode,
|
|
1435
|
+
op: OpOperationNode,
|
|
1436
|
+
name: string,
|
|
1437
|
+
seq: number,
|
|
1438
|
+
modelMap: Map<string, ModelNode>,
|
|
1439
|
+
root?: OpRootNode,
|
|
1440
|
+
defaultScheme?: BrunoSecurityScheme,
|
|
1441
|
+
randomExamples = false,
|
|
1442
|
+
): string {
|
|
1443
|
+
const lines: string[] = [];
|
|
1444
|
+
|
|
1445
|
+
lines.push(`info:`);
|
|
1446
|
+
lines.push(` name: ${yamlString(name)}`);
|
|
1447
|
+
lines.push(` type: http`);
|
|
1448
|
+
lines.push(` seq: ${seq}`);
|
|
1449
|
+
lines.push(``);
|
|
1450
|
+
lines.push(`http:`);
|
|
1451
|
+
lines.push(` method: ${op.method.toUpperCase()}`);
|
|
1452
|
+
lines.push(` url: ${yamlString(`{{baseUrl}}${openCollectionPath(route.path)}`)}`);
|
|
1453
|
+
|
|
1454
|
+
// Params — flat array with type: "path" | "query". Optional query params are
|
|
1455
|
+
// emitted with disabled: true so users opt in before sending.
|
|
1456
|
+
const pathParams: Array<ParamEntry & { kind: 'path' | 'query' }> = extractPathParamNames(route.path).map(n => ({
|
|
1457
|
+
name: n,
|
|
1458
|
+
type: findParamType(route.params, n, modelMap),
|
|
1459
|
+
optional: false,
|
|
1460
|
+
kind: 'path' as const,
|
|
1461
|
+
}));
|
|
1462
|
+
const queryParams: Array<ParamEntry & { kind: 'path' | 'query' }> = op.query
|
|
1463
|
+
? expandParamSource(op.query, modelMap).map(e => ({ ...e, kind: 'query' as const }))
|
|
1464
|
+
: [];
|
|
1465
|
+
const allParams = [...pathParams, ...queryParams];
|
|
1466
|
+
|
|
1467
|
+
if (allParams.length > 0) {
|
|
1468
|
+
lines.push(` params:`);
|
|
1469
|
+
for (const p of allParams) {
|
|
1470
|
+
lines.push(` - name: ${p.name}`);
|
|
1471
|
+
lines.push(` value: ${paramExampleValue(p.type, p.default, randomExamples)}`);
|
|
1472
|
+
lines.push(` type: ${p.kind}`);
|
|
1473
|
+
if (p.optional && p.kind === 'query') lines.push(` disabled: true`);
|
|
1474
|
+
}
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
// Headers
|
|
1478
|
+
if (op.headers) {
|
|
1479
|
+
const headerEntries = expandParamSource(op.headers, modelMap);
|
|
1480
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (headerEntries.length > 0) {
|
|
1481
|
+
lines.push(` headers:`);
|
|
1482
|
+
for (const h of headerEntries) {
|
|
1483
|
+
lines.push(` - name: ${h.name}`);
|
|
1484
|
+
lines.push(` value: ${paramExampleValue(h.type, h.default, randomExamples)}`);
|
|
1485
|
+
if (h.optional) lines.push(` disabled: true`);
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
// Auth — inside http block; inherit collection default unless this op is explicitly public
|
|
1491
|
+
if (defaultScheme) {
|
|
1492
|
+
const security = root ? resolveSecurity(route, op, root) : (<span class="branch-1 cbranch-no" title="branch not covered" >op.security ?? route.security)</span>;
|
|
1493
|
+
if (security === SECURITY_NONE) {
|
|
1494
|
+
lines.push(` auth:`);
|
|
1495
|
+
lines.push(` type: none`);
|
|
1496
|
+
} else {
|
|
1497
|
+
lines.push(` auth: inherit`);
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
// Body — Bruno supports a single body per request, so prefer JSON, then form-urlencoded, then multipart.
|
|
1502
|
+
if (op.request && op.request.bodies.length > 0) {
|
|
1503
|
+
const preferredOrder: Array<(typeof op.request.bodies)[number]['contentType']> = [
|
|
1504
|
+
'application/json',
|
|
1505
|
+
'application/x-www-form-urlencoded',
|
|
1506
|
+
'multipart/form-data',
|
|
1507
|
+
];
|
|
1508
|
+
const primary =
|
|
1509
|
+
preferredOrder.map(ct => op.request!.bodies.find(b => b.contentType === ct)).find(b => b !== undefined) ?? <span class="branch-1 cbranch-no" title="branch not covered" >op.request.bodies[0]!</span>;
|
|
1510
|
+
|
|
1511
|
+
lines.push(` body:`);
|
|
1512
|
+
if (primary.contentType === 'multipart/form-data') {
|
|
1513
|
+
lines.push(` type: multipart-form`);
|
|
1514
|
+
lines.push(` data: []`);
|
|
1515
|
+
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (primary.contentType === 'application/x-www-form-urlencoded') {
|
|
1516
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` type: form-urlencoded`);</span>
|
|
1517
|
+
<span class="cstat-no" title="statement not covered" > lines.push(` data: []`);</span>
|
|
1518
|
+
} else {
|
|
1519
|
+
const json = JSON.stringify(typeToExampleValue(primary.bodyType, modelMap, randomExamples), null, 2);
|
|
1520
|
+
lines.push(` type: json`);
|
|
1521
|
+
lines.push(` data: |`);
|
|
1522
|
+
for (const jsonLine of json.split('\n')) {
|
|
1523
|
+
lines.push(` ${jsonLine}`);
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
// runtime.assertions — auto-generate a status-code check and presence checks for required response headers.
|
|
1529
|
+
const expectedStatus = pickAssertionStatus(op.responses);
|
|
1530
|
+
const assertedResponse = op.responses.find(r => r.statusCode === expectedStatus);
|
|
1531
|
+
const requiredHeaders = (assertedResponse?.headers ?? []).filter(h => !h.optional);
|
|
1532
|
+
if (expectedStatus !== undefined) {
|
|
1533
|
+
lines.push(``);
|
|
1534
|
+
lines.push(`runtime:`);
|
|
1535
|
+
lines.push(` assertions:`);
|
|
1536
|
+
lines.push(` - expression: res.status`);
|
|
1537
|
+
lines.push(` operator: eq`);
|
|
1538
|
+
// Always quote — the OpenCollection schema types `value` as a string,
|
|
1539
|
+
// so we must keep "200" from being parsed as YAML number 200.
|
|
1540
|
+
lines.push(` value: "${expectedStatus}"`);
|
|
1541
|
+
for (const h of requiredHeaders) {
|
|
1542
|
+
lines.push(` - expression: res.headers["${h.name.toLowerCase()}"]`);
|
|
1543
|
+
lines.push(` operator: isDefined`);
|
|
1544
|
+
lines.push(` value: ""`);
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
// docs — combine route- and operation-level descriptions plus the declared response-header summary.
|
|
1549
|
+
const docs = buildRequestDocs(route, op, assertedResponse);
|
|
1550
|
+
if (docs) {
|
|
1551
|
+
lines.push(``);
|
|
1552
|
+
lines.push(`docs: |-`);
|
|
1553
|
+
for (const docLine of docs.split('\n')) {
|
|
1554
|
+
lines.push(` ${docLine}`);
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
lines.push(``);
|
|
1559
|
+
return lines.join('\n');
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
/** Pick the response whose status code we'll assert against. Prefers the first declared 2xx; otherwise falls back to the first declared response. Returns undefined if no responses are declared. */
|
|
1563
|
+
function pickAssertionStatus(responses: OpResponseNode[]): number | undefined {
|
|
1564
|
+
const success = responses.find(r => r.statusCode >= 200 && r.statusCode < 300);
|
|
1565
|
+
return success?.statusCode ?? responses[0]?.statusCode;
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
/** Build a markdown docs block from route- and operation-level descriptions, plus declared response-header summary. */
|
|
1569
|
+
function buildRequestDocs(route: OpRouteNode, op: OpOperationNode, assertedResponse?: OpResponseNode): string | undefined {
|
|
1570
|
+
const parts: string[] = [];
|
|
1571
|
+
if (route.description) parts.push(route.description.trim());
|
|
1572
|
+
if (op.description) parts.push(op.description.trim());
|
|
1573
|
+
const headers = assertedResponse?.headers ?? [];
|
|
1574
|
+
if (headers.length > 0) {
|
|
1575
|
+
const lines = ['**Response headers**', ''];
|
|
1576
|
+
for (const h of headers) {
|
|
1577
|
+
const tag = h.optional ? 'optional' : 'required';
|
|
1578
|
+
const desc = h.description ? ` — ${h.description}` : '';
|
|
1579
|
+
lines.push(`- \`${h.name}\` (${tag})${desc}`);
|
|
1580
|
+
}
|
|
1581
|
+
parts.push(lines.join('\n'));
|
|
1582
|
+
}
|
|
1583
|
+
return parts.length > 0 ? parts.join('\n\n') : undefined;
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
// ─── Auth helpers ──────────────────────────────────────────────────────────
|
|
1587
|
+
|
|
1588
|
+
/** Generate the YAML lines for an auth block (flat, per spec), indented by `indent`. */
|
|
1589
|
+
function renderAuthBlock(scheme: BrunoSecurityScheme, indent: string): string[] {
|
|
1590
|
+
const i = indent;
|
|
1591
|
+
if (scheme.type === 'http' && scheme.scheme === 'bearer') {
|
|
1592
|
+
return [`${i}auth:`, `${i} type: bearer`, `${i} token: "{{token}}"`];
|
|
1593
|
+
}
|
|
1594
|
+
if (scheme.type === 'http' && scheme.scheme === 'basic') {
|
|
1595
|
+
return [`${i}auth:`, `${i} type: basic`, `${i} username: "{{username}}"`, `${i} password: "{{password}}"`];
|
|
1596
|
+
}
|
|
1597
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (scheme.type === 'apiKey' && scheme.in === 'header') {
|
|
1598
|
+
const headerName = scheme.name ?? <span class="branch-1 cbranch-no" title="branch not covered" >'X-Api-Key';</span>
|
|
1599
|
+
return [`${i}auth:`, `${i} type: apikey`, `${i} key: ${headerName}`, `${i} value: "{{apiKey}}"`, `${i} placement: header`];
|
|
1600
|
+
}
|
|
1601
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
/** Return the environment variable names needed for a given auth scheme. */
|
|
1605
|
+
function authEnvVarNames(scheme: BrunoSecurityScheme): string[] {
|
|
1606
|
+
if (scheme.type === 'http' && scheme.scheme === 'bearer') return ['token'];
|
|
1607
|
+
if (scheme.type === 'http' && scheme.scheme === 'basic') return ['username', 'password'];
|
|
1608
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (scheme.type === 'apiKey') return ['apiKey'];
|
|
1609
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
1610
|
+
}
|
|
1611
|
+
|
|
1612
|
+
// ─── Model registry ────────────────────────────────────────────────────────
|
|
1613
|
+
|
|
1614
|
+
function buildModelMap(contractRoots: ContractRootNode[]): Map<string, ModelNode> {
|
|
1615
|
+
const map = new Map<string, ModelNode>();
|
|
1616
|
+
for (const root of contractRoots) {
|
|
1617
|
+
for (const model of root.models) {
|
|
1618
|
+
map.set(model.name, model);
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
return map;
|
|
1622
|
+
}
|
|
1623
|
+
|
|
1624
|
+
/** Resolve all fields for a model, including inherited base fields (bases first, in declaration order). */
|
|
1625
|
+
function resolveModelFields(model: ModelNode, modelMap: Map<string, ModelNode>): FieldNode[] {
|
|
1626
|
+
const collected: FieldNode[] = [];
|
|
1627
|
+
if (model.bases) {
|
|
1628
|
+
for (const base of model.bases) {
|
|
1629
|
+
const baseModel = modelMap.get(base);
|
|
1630
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (baseModel) collected.push(...resolveModelFields(baseModel, modelMap));
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
return [...collected, ...model.fields];
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
// ─── Param helpers ─────────────────────────────────────────────────────────
|
|
1637
|
+
|
|
1638
|
+
interface ParamEntry {
|
|
1639
|
+
name: string;
|
|
1640
|
+
type: ContractTypeNode | undefined;
|
|
1641
|
+
default?: string | number | boolean;
|
|
1642
|
+
optional: boolean;
|
|
1643
|
+
}
|
|
1644
|
+
|
|
1645
|
+
/** Expand a ParamSource into a flat list of named entries with their types. */
|
|
1646
|
+
function expandParamSource(source: ParamSource, modelMap: Map<string, ModelNode>): ParamEntry[] {
|
|
1647
|
+
if (source.kind === 'params') {
|
|
1648
|
+
return source.nodes.map(n => ({ name: n.name, type: n.type, default: n.default, optional: n.optional }));
|
|
1649
|
+
}
|
|
1650
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (source.kind === 'ref') {
|
|
1651
|
+
const model = modelMap.get(source.name);
|
|
1652
|
+
if (model) {
|
|
1653
|
+
return resolveModelFields(model, modelMap)
|
|
1654
|
+
.filter(f => f.visibility !== 'readonly')
|
|
1655
|
+
.map(f => ({ name: f.name, type: f.type, default: f.default, optional: f.optional }));
|
|
1656
|
+
}
|
|
1657
|
+
// Fallback: single placeholder entry
|
|
1658
|
+
const name = source.name.charAt(0).toLowerCase() + source.name.slice(1);
|
|
1659
|
+
return [{ name, type: undefined, optional: false }];
|
|
1660
|
+
}
|
|
1661
|
+
// kind === 'type': if it's an inline object, expand its fields
|
|
1662
|
+
<span class="cstat-no" title="statement not covered" > if (source.node.kind === 'inlineObject') {</span>
|
|
1663
|
+
<span class="cstat-no" title="statement not covered" > return source.node.fields.map(<span class="fstat-no" title="function not covered" >f => (<span class="cstat-no" title="statement not covered" >{</span> name: f.name, type: f.type, default: f.default, optional: f.optional }));</span></span>
|
|
1664
|
+
}
|
|
1665
|
+
<span class="cstat-no" title="statement not covered" > return [];</span>
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
/** Look up a named path param's type from route.params. */
|
|
1669
|
+
function findParamType(source: ParamSource | undefined, name: string, modelMap: Map<string, ModelNode>): ContractTypeNode | undefined {
|
|
1670
|
+
if (!source) return undefined;
|
|
1671
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (source.kind === 'params') return source.nodes.find(n => n.name === name)?.type;
|
|
1672
|
+
<span class="cstat-no" title="statement not covered" > if (source.kind === 'ref') {</span>
|
|
1673
|
+
const model = <span class="cstat-no" title="statement not covered" >modelMap.get(source.name);</span>
|
|
1674
|
+
<span class="cstat-no" title="statement not covered" > if (model) <span class="cstat-no" title="statement not covered" >return resolveModelFields(model, modelMap).find(<span class="fstat-no" title="function not covered" >f => <span class="cstat-no" title="statement not covered" >f</span>.name === name)?.t</span>ype;</span></span>
|
|
1675
|
+
}
|
|
1676
|
+
<span class="cstat-no" title="statement not covered" > if (source.kind === 'type' && source.node.kind === 'inlineObject') {</span>
|
|
1677
|
+
<span class="cstat-no" title="statement not covered" > return source.node.fields.find(<span class="fstat-no" title="function not covered" >f => <span class="cstat-no" title="statement not covered" >f</span>.name === name)?.t</span>ype;</span>
|
|
1678
|
+
}
|
|
1679
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
/** Return a YAML-quoted example value string for a param, preferring a default value when provided. */
|
|
1683
|
+
function paramExampleValue(type: ContractTypeNode | undefined, defaultValue?: string | number | boolean, randomExamples = false): string {
|
|
1684
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (defaultValue !== undefined) <span class="cstat-no" title="statement not covered" >return `"${defaultValue}"`;</span>
|
|
1685
|
+
if (!type) return '""';
|
|
1686
|
+
if (type.kind === 'enum') return type.values.length > 0 ? `"${type.values[0]}"` : <span class="branch-1 cbranch-no" title="branch not covered" >'""';</span>
|
|
1687
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (type.kind === 'literal') <span class="cstat-no" title="statement not covered" >return `"${type.value}"`;</span>
|
|
1688
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (type.kind !== 'scalar') <span class="cstat-no" title="statement not covered" >return '""';</span>
|
|
1689
|
+
if (randomExamples) {
|
|
1690
|
+
const random = randomScalarTemplate(type.name);
|
|
1691
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (random !== undefined) return `"${random}"`;
|
|
1692
|
+
}
|
|
1693
|
+
switch (type.name) {
|
|
1694
|
+
case 'uuid':
|
|
1695
|
+
return '"00000000-0000-0000-0000-000000000000"';
|
|
1696
|
+
case 'email':
|
|
1697
|
+
return '"user@example.com"';
|
|
1698
|
+
<span class="branch-2 cbranch-no" title="branch not covered" > case 'url':</span>
|
|
1699
|
+
<span class="cstat-no" title="statement not covered" > return '"https://example.com"';</span>
|
|
1700
|
+
<span class="branch-3 cbranch-no" title="branch not covered" > case 'number':</span>
|
|
1701
|
+
case 'int':
|
|
1702
|
+
case 'bigint':
|
|
1703
|
+
return '"0"';
|
|
1704
|
+
<span class="branch-6 cbranch-no" title="branch not covered" > case 'boolean':</span>
|
|
1705
|
+
<span class="cstat-no" title="statement not covered" > return '"true"';</span>
|
|
1706
|
+
case 'date':
|
|
1707
|
+
return '"2024-01-01"';
|
|
1708
|
+
<span class="branch-8 cbranch-no" title="branch not covered" > case 'time':</span>
|
|
1709
|
+
<span class="cstat-no" title="statement not covered" > return '"00:00:00"';</span>
|
|
1710
|
+
<span class="branch-9 cbranch-no" title="branch not covered" > case 'datetime':</span>
|
|
1711
|
+
<span class="cstat-no" title="statement not covered" > return '"2024-01-01T00:00:00Z"';</span>
|
|
1712
|
+
case 'duration':
|
|
1713
|
+
return '"PT1H"';
|
|
1714
|
+
default:
|
|
1715
|
+
return '""';
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1719
|
+
/** Bruno faker template for a scalar type, or undefined when no clean equivalent exists (date, time, duration, raw string). */
|
|
1720
|
+
function randomScalarTemplate(name: string): string | undefined {
|
|
1721
|
+
switch (name) {
|
|
1722
|
+
case 'uuid':
|
|
1723
|
+
return '{{$randomUUID}}';
|
|
1724
|
+
case 'email':
|
|
1725
|
+
return '{{$randomEmail}}';
|
|
1726
|
+
<span class="branch-2 cbranch-no" title="branch not covered" > case 'url':</span>
|
|
1727
|
+
<span class="cstat-no" title="statement not covered" > return '{{$randomUrl}}';</span>
|
|
1728
|
+
<span class="branch-3 cbranch-no" title="branch not covered" > case 'number':</span>
|
|
1729
|
+
case 'int':
|
|
1730
|
+
case 'bigint':
|
|
1731
|
+
return '{{$randomInt}}';
|
|
1732
|
+
case 'boolean':
|
|
1733
|
+
return '{{$randomBoolean}}';
|
|
1734
|
+
case 'datetime':
|
|
1735
|
+
return '{{$isoTimestamp}}';
|
|
1736
|
+
<span class="branch-8 cbranch-no" title="branch not covered" > default:</span>
|
|
1737
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1738
|
+
}
|
|
1739
|
+
}
|
|
1740
|
+
|
|
1741
|
+
// ─── Body helpers ──────────────────────────────────────────────────────────
|
|
1742
|
+
|
|
1743
|
+
/**
|
|
1744
|
+
* Recursively build an example JSON value from a ContractTypeNode.
|
|
1745
|
+
*
|
|
1746
|
+
* When `randomExamples` is true we substitute Bruno faker templates only for
|
|
1747
|
+
* scalars whose JSON representation is a string (uuid/email/url/datetime).
|
|
1748
|
+
* Numbers and booleans stay deterministic — embedding `{{$randomInt}}` as a
|
|
1749
|
+
* bare JSON number would require sentinel-stripping the surrounding quotes,
|
|
1750
|
+
* and the body skeleton is meant as a starting point users edit anyway.
|
|
1751
|
+
*/
|
|
1752
|
+
function typeToExampleValue(type: ContractTypeNode, modelMap: Map<string, ModelNode>, randomExamples = false): unknown {
|
|
1753
|
+
switch (type.kind) {
|
|
1754
|
+
case 'scalar':
|
|
1755
|
+
switch (type.name) {
|
|
1756
|
+
case 'string':
|
|
1757
|
+
return '';
|
|
1758
|
+
case 'email':
|
|
1759
|
+
return randomExamples ? '{{$randomEmail}}' : 'user@example.com';
|
|
1760
|
+
<span class="branch-2 cbranch-no" title="branch not covered" > case 'url':</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" > return randomExamples ? '{{$randomUrl}}' : 'https://example.com';</span>
|
|
1762
|
+
case 'uuid':
|
|
1763
|
+
return randomExamples ? '{{$randomUUID}}' : <span class="branch-1 cbranch-no" title="branch not covered" >'00000000-0000-0000-0000-000000000000';</span>
|
|
1764
|
+
<span class="branch-4 cbranch-no" title="branch not covered" > case 'number':</span>
|
|
1765
|
+
case 'int':
|
|
1766
|
+
case 'bigint':
|
|
1767
|
+
return 0;
|
|
1768
|
+
case 'boolean':
|
|
1769
|
+
return true;
|
|
1770
|
+
<span class="branch-8 cbranch-no" title="branch not covered" > case 'date':</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" > return '2024-01-01';</span>
|
|
1772
|
+
<span class="branch-9 cbranch-no" title="branch not covered" > case 'time':</span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" > return '00:00:00';</span>
|
|
1774
|
+
case 'datetime':
|
|
1775
|
+
return randomExamples ? '{{$isoTimestamp}}' : <span class="branch-1 cbranch-no" title="branch not covered" >'2024-01-01T00:00:00Z';</span>
|
|
1776
|
+
case 'duration':
|
|
1777
|
+
return 'PT1H';
|
|
1778
|
+
<span class="branch-12 cbranch-no" title="branch not covered" > case 'null':</span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1780
|
+
<span class="branch-13 cbranch-no" title="branch not covered" > default:</span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1782
|
+
}
|
|
1783
|
+
case 'enum':
|
|
1784
|
+
return type.values[0] ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
|
|
1785
|
+
<span class="branch-2 cbranch-no" title="branch not covered" > case 'literal':</span>
|
|
1786
|
+
<span class="cstat-no" title="statement not covered" > return type.value;</span>
|
|
1787
|
+
case 'array':
|
|
1788
|
+
return [typeToExampleValue(type.item, modelMap, randomExamples)];
|
|
1789
|
+
<span class="branch-4 cbranch-no" title="branch not covered" > case 'tuple':</span>
|
|
1790
|
+
<span class="cstat-no" title="statement not covered" > return type.items.map(<span class="fstat-no" title="function not covered" >t => <span class="cstat-no" title="statement not covered" >t</span>ypeToExampleValue(t, modelMap, randomExamples));</span></span>
|
|
1791
|
+
<span class="branch-5 cbranch-no" title="branch not covered" > case 'record':</span>
|
|
1792
|
+
<span class="cstat-no" title="statement not covered" > return {};</span>
|
|
1793
|
+
<span class="branch-6 cbranch-no" title="branch not covered" > case 'union':</span>
|
|
1794
|
+
<span class="cstat-no" title="statement not covered" > return type.members.length > 0 ? typeToExampleValue(type.members[0]!, modelMap, randomExamples) : null;</span>
|
|
1795
|
+
<span class="branch-7 cbranch-no" title="branch not covered" > case 'discriminatedUnion':</span>
|
|
1796
|
+
<span class="cstat-no" title="statement not covered" > return type.members.length > 0 ? typeToExampleValue(type.members[0]!, modelMap, randomExamples) : null;</span>
|
|
1797
|
+
<span class="branch-8 cbranch-no" title="branch not covered" > case 'intersection':</span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > return {};</span>
|
|
1799
|
+
case 'ref': {
|
|
1800
|
+
const model = modelMap.get(type.name);
|
|
1801
|
+
if (!model) return {};
|
|
1802
|
+
// Type alias — recurse into the aliased type
|
|
1803
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (model.type) <span class="cstat-no" title="statement not covered" >return typeToExampleValue(model.type, modelMap, randomExamples);</span>
|
|
1804
|
+
return modelToExampleObject(model, modelMap, randomExamples);
|
|
1805
|
+
}
|
|
1806
|
+
<span class="branch-10 cbranch-no" title="branch not covered" > case 'lazy':</span>
|
|
1807
|
+
<span class="cstat-no" title="statement not covered" > return typeToExampleValue(type.inner, modelMap, randomExamples);</span>
|
|
1808
|
+
case 'inlineObject':
|
|
1809
|
+
return fieldsToExampleObject(type.fields, modelMap, randomExamples);
|
|
1810
|
+
<span class="branch-12 cbranch-no" title="branch not covered" > default:</span>
|
|
1811
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1812
|
+
}
|
|
1813
|
+
}
|
|
1814
|
+
|
|
1815
|
+
/** Build an example object from a ModelNode's fields (including inherited base fields). */
|
|
1816
|
+
function modelToExampleObject(model: ModelNode, modelMap: Map<string, ModelNode>, randomExamples = false): Record<string, unknown> {
|
|
1817
|
+
return fieldsToExampleObject(resolveModelFields(model, modelMap), modelMap, randomExamples);
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
/** Build an example object from a list of FieldNodes. Excludes readonly; uses defaults when available, null for optional fields without one. */
|
|
1821
|
+
function fieldsToExampleObject(fields: FieldNode[], modelMap: Map<string, ModelNode>, randomExamples = false): Record<string, unknown> {
|
|
1822
|
+
const obj: Record<string, unknown> = {};
|
|
1823
|
+
for (const field of fields) {
|
|
1824
|
+
if (field.visibility === 'readonly') continue;
|
|
1825
|
+
if (field.default !== undefined) {
|
|
1826
|
+
obj[field.name] = field.default;
|
|
1827
|
+
} else if (field.optional) {
|
|
1828
|
+
obj[field.name] = null;
|
|
1829
|
+
} else {
|
|
1830
|
+
obj[field.name] = typeToExampleValue(field.type, modelMap, randomExamples);
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
return obj;
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1836
|
+
// ─── Path helpers ──────────────────────────────────────────────────────────
|
|
1837
|
+
|
|
1838
|
+
/** Convert /users/{id}/posts → /users/:id/posts (Bruno path parameter syntax) */
|
|
1839
|
+
function openCollectionPath(path: string): string {
|
|
1840
|
+
return path.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, ':$1');
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
/** Convert "Create an Offer" → create-an-offer (for .yml file names) */
|
|
1844
|
+
export function slugifyName(name: string): string {
|
|
1845
|
+
const result = name
|
|
1846
|
+
.toLowerCase()
|
|
1847
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
1848
|
+
.replace(/^-|-$/g, '');
|
|
1849
|
+
return result || <span class="branch-1 cbranch-no" title="branch not covered" >'request';</span>
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
/** Convert /users/{id}/posts → users-id-posts (for .yml file names) */
|
|
1853
|
+
export function sanitizePath(path: string): string {
|
|
1854
|
+
const result = path
|
|
1855
|
+
.replace(/^\//, '')
|
|
1856
|
+
.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, '$1')
|
|
1857
|
+
.replace(/\//g, '-')
|
|
1858
|
+
.replace(/[^a-zA-Z0-9-]/g, '')
|
|
1859
|
+
.replace(/-+/g, '-')
|
|
1860
|
+
.replace(/^-|-$/g, '');
|
|
1861
|
+
return result || 'root';
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
/** Extract param names from a URL template, e.g. /users/{id} → ['id'] */
|
|
1865
|
+
function extractPathParamNames(path: string): string[] {
|
|
1866
|
+
return [...path.matchAll(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g)].map(m => m[1]!);
|
|
1867
|
+
}
|
|
1868
|
+
|
|
1869
|
+
/** Derive folder name from op file path, e.g. src/users.op → users */
|
|
1870
|
+
function deriveFolderName(file: string): string {
|
|
1871
|
+
return basename(file).replace(/\.(op|ck)$/, '');
|
|
1872
|
+
}
|
|
1873
|
+
|
|
1874
|
+
/**
|
|
1875
|
+
* Wrap a string in YAML double quotes if it contains characters that require quoting
|
|
1876
|
+
* (flow indicators, colons, braces, etc.).
|
|
1877
|
+
*/
|
|
1878
|
+
function yamlString(value: string): string {
|
|
1879
|
+
if (/[:{}[\],&*#?|<>=!%@`"']/.test(value) || /^\s|\s$/.test(value)) {
|
|
1880
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
1881
|
+
}
|
|
1882
|
+
return value;
|
|
1883
|
+
}
|
|
1884
|
+
</pre></td></tr></table></pre>
|
|
1885
|
+
|
|
1886
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1887
|
+
</div><!-- /wrapper -->
|
|
1888
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1889
|
+
Code coverage generated by
|
|
1890
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1891
|
+
at 2026-04-29T12:51:10.099Z
|
|
1892
|
+
</div>
|
|
1893
|
+
<script src="../prettify.js"></script>
|
|
1894
|
+
<script>
|
|
1895
|
+
window.onload = function () {
|
|
1896
|
+
prettyPrint();
|
|
1897
|
+
};
|
|
1898
|
+
</script>
|
|
1899
|
+
<script src="../sorter.js"></script>
|
|
1900
|
+
<script src="../block-navigation.js"></script>
|
|
1901
|
+
</body>
|
|
1902
|
+
</html>
|
|
1903
|
+
|