@hitchy/plugin-auth 0.2.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +42 -21
- package/LICENSE +21 -0
- package/api/controller/user.js +2 -29
- package/api/model/authorization/rule.js +0 -27
- package/api/model/role.js +0 -28
- package/api/model/user-to-role.js +0 -28
- package/api/model/user.js +2 -30
- package/api/policy/authentication.js +127 -70
- package/api/policy/authorization.js +0 -28
- package/api/policy/user.js +0 -28
- package/api/service/auth/manager.js +45 -32
- package/api/service/authentication/passport.js +7 -34
- package/api/service/authentication/strategies.js +230 -58
- package/api/service/authorization/node.js +0 -28
- package/api/service/authorization/policy-generator.js +0 -28
- package/api/service/authorization/tree.js +8 -36
- package/config/auth.js +5 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +79 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +231 -0
- package/coverage/plugin-auth/api/controller/index.html +111 -0
- package/coverage/plugin-auth/api/controller/user.js.html +368 -0
- package/coverage/plugin-auth/api/model/authorization/index.html +111 -0
- package/coverage/plugin-auth/api/model/authorization/rule.js.html +227 -0
- package/coverage/plugin-auth/api/model/index.html +141 -0
- package/coverage/plugin-auth/api/model/role.js.html +200 -0
- package/coverage/plugin-auth/api/model/user-to-role.js.html +167 -0
- package/coverage/plugin-auth/api/model/user.js.html +752 -0
- package/coverage/plugin-auth/api/policy/authentication.js.html +782 -0
- package/coverage/plugin-auth/api/policy/authorization.js.html +182 -0
- package/coverage/plugin-auth/api/policy/index.html +141 -0
- package/coverage/plugin-auth/api/policy/user.js.html +479 -0
- package/coverage/plugin-auth/api/service/auth/index.html +111 -0
- package/coverage/plugin-auth/api/service/auth/manager.js.html +959 -0
- package/coverage/plugin-auth/api/service/authentication/index.html +126 -0
- package/coverage/plugin-auth/api/service/authentication/passport.js.html +293 -0
- package/coverage/plugin-auth/api/service/authentication/strategies.js.html +929 -0
- package/coverage/plugin-auth/api/service/authorization/index.html +141 -0
- package/coverage/plugin-auth/api/service/authorization/node.js.html +944 -0
- package/coverage/plugin-auth/api/service/authorization/policy-generator.js.html +386 -0
- package/coverage/plugin-auth/api/service/authorization/tree.js.html +983 -0
- package/coverage/plugin-auth/config/auth.js.html +140 -0
- package/coverage/plugin-auth/config/index.html +111 -0
- package/coverage/plugin-auth/index.html +111 -0
- package/coverage/plugin-auth/index.js.html +344 -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 +170 -0
- package/coverage/tmp/coverage-8472-1648414315419-0.json +1 -0
- package/docs/.vuepress/config.js +5 -2
- package/docs/api/config.md +14 -2
- package/docs/api/model/authorization-rule.md +1 -1
- package/docs/api/model/user.md +2 -2
- package/docs/api/service/authentication-passport.md +1 -1
- package/docs/guides/getting-started.md +2 -2
- package/docs/guides/idp-login.png +0 -0
- package/docs/guides/idp-saml-cert.png +0 -0
- package/docs/guides/openid-connect.md +164 -0
- package/docs/guides/readme.md +2 -0
- package/docs/guides/saml.md +161 -0
- package/docs/introduction.md +5 -5
- package/index.js +31 -51
- package/package.json +18 -13
- package/readme.md +11 -43
|
@@ -0,0 +1,944 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for plugin-auth/api/service/authorization/node.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../../index.html">All files</a> / <a href="index.html">plugin-auth/api/service/authorization</a> node.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">89.23% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>257/288</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">94.54% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>52/55</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">76.92% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>10/13</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">89.23% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>257/288</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
|
+
</div>
|
|
58
|
+
<div class='status-line high'></div>
|
|
59
|
+
<pre><table class="coverage">
|
|
60
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
61
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
62
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
63
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
64
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
65
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
66
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
67
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
68
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
69
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
70
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
71
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
72
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
73
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
74
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
75
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
76
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
77
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
78
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
79
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
80
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
81
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
82
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
83
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
84
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
85
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
86
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
87
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
88
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
89
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
90
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
91
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
92
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
93
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
94
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
95
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
96
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
97
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
98
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
99
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
100
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
101
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
102
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
103
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
104
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
105
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
106
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
107
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
108
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
109
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
110
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
111
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
112
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
113
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
114
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
115
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
116
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
117
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
118
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
119
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
120
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
121
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
122
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
123
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
124
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
125
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
126
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
127
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
128
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
129
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
130
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
131
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
132
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
133
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
134
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
135
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
136
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
137
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
138
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
139
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
140
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
141
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
142
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
143
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
144
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
145
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
146
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
147
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
148
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
149
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
150
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
151
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
152
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
153
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
154
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
155
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
156
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
157
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
158
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
159
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
160
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
161
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
162
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
163
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
164
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
165
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
166
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
167
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
168
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
169
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
170
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
171
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
172
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
173
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
174
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
175
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
176
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
177
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
178
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
179
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
180
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
181
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
182
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
183
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
184
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
185
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
186
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
187
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
188
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
189
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
190
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
191
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
192
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
193
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
194
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
195
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
196
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
197
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
198
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
199
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
200
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
201
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
202
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
203
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
204
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
205
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
206
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
207
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
208
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
209
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
210
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
211
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
212
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
213
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
214
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
215
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
216
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
217
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
218
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
219
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
220
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
221
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
222
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
223
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
224
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
225
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
226
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
227
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
228
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
229
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
230
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
231
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
232
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
233
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
234
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
235
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
236
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
237
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
238
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
239
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
240
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
241
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
242
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
243
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
244
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
245
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
246
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
247
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
248
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
249
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
250
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
251
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
252
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
253
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
254
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
255
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
256
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
257
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
258
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
259
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
260
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
261
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
262
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
263
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
264
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
265
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
266
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
267
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
268
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
269
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
270
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
271
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
272
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
273
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
274
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
275
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
276
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
277
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
278
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
279
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
280
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
281
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
282
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
283
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
284
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
285
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
286
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
287
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
288
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
289
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
290
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
291
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
292
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
293
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
294
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
295
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
296
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
297
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
298
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
299
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
300
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
301
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
302
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
303
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
304
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
305
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
306
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
307
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
308
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
309
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
310
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
311
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
312
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
313
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
314
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
315
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
316
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
317
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
318
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
319
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
320
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
321
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
322
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
323
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
324
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
325
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
326
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
327
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
328
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
329
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
330
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
331
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
332
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
333
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
334
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
335
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
336
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
337
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
338
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
339
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
340
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
341
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
342
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
343
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
344
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
345
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
346
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
347
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
348
|
+
<a name='L289'></a><a href='#L289'>289</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
349
|
+
<span class="cline-any cline-yes">1x</span>
|
|
350
|
+
<span class="cline-any cline-yes">1x</span>
|
|
351
|
+
<span class="cline-any cline-yes">18x</span>
|
|
352
|
+
<span class="cline-any cline-yes">18x</span>
|
|
353
|
+
<span class="cline-any cline-yes">18x</span>
|
|
354
|
+
<span class="cline-any cline-yes">18x</span>
|
|
355
|
+
<span class="cline-any cline-yes">18x</span>
|
|
356
|
+
<span class="cline-any cline-yes">18x</span>
|
|
357
|
+
<span class="cline-any cline-yes">18x</span>
|
|
358
|
+
<span class="cline-any cline-yes">18x</span>
|
|
359
|
+
<span class="cline-any cline-yes">18x</span>
|
|
360
|
+
<span class="cline-any cline-yes">18x</span>
|
|
361
|
+
<span class="cline-any cline-yes">18x</span>
|
|
362
|
+
<span class="cline-any cline-yes">18x</span>
|
|
363
|
+
<span class="cline-any cline-yes">18x</span>
|
|
364
|
+
<span class="cline-any cline-yes">18x</span>
|
|
365
|
+
<span class="cline-any cline-yes">18x</span>
|
|
366
|
+
<span class="cline-any cline-yes">18x</span>
|
|
367
|
+
<span class="cline-any cline-yes">135x</span>
|
|
368
|
+
<span class="cline-any cline-yes">135x</span>
|
|
369
|
+
<span class="cline-any cline-yes">135x</span>
|
|
370
|
+
<span class="cline-any cline-yes">135x</span>
|
|
371
|
+
<span class="cline-any cline-yes">135x</span>
|
|
372
|
+
<span class="cline-any cline-yes">135x</span>
|
|
373
|
+
<span class="cline-any cline-yes">135x</span>
|
|
374
|
+
<span class="cline-any cline-yes">135x</span>
|
|
375
|
+
<span class="cline-any cline-yes">135x</span>
|
|
376
|
+
<span class="cline-any cline-yes">135x</span>
|
|
377
|
+
<span class="cline-any cline-yes">135x</span>
|
|
378
|
+
<span class="cline-any cline-yes">135x</span>
|
|
379
|
+
<span class="cline-any cline-yes">135x</span>
|
|
380
|
+
<span class="cline-any cline-yes">18x</span>
|
|
381
|
+
<span class="cline-any cline-yes">18x</span>
|
|
382
|
+
<span class="cline-any cline-yes">18x</span>
|
|
383
|
+
<span class="cline-any cline-yes">18x</span>
|
|
384
|
+
<span class="cline-any cline-yes">18x</span>
|
|
385
|
+
<span class="cline-any cline-yes">18x</span>
|
|
386
|
+
<span class="cline-any cline-yes">18x</span>
|
|
387
|
+
<span class="cline-any cline-yes">177x</span>
|
|
388
|
+
<span class="cline-any cline-yes">177x</span>
|
|
389
|
+
<span class="cline-any cline-yes">177x</span>
|
|
390
|
+
<span class="cline-any cline-yes">177x</span>
|
|
391
|
+
<span class="cline-any cline-yes">177x</span>
|
|
392
|
+
<span class="cline-any cline-yes">177x</span>
|
|
393
|
+
<span class="cline-any cline-yes">18x</span>
|
|
394
|
+
<span class="cline-any cline-yes">18x</span>
|
|
395
|
+
<span class="cline-any cline-yes">18x</span>
|
|
396
|
+
<span class="cline-any cline-yes">18x</span>
|
|
397
|
+
<span class="cline-any cline-yes">18x</span>
|
|
398
|
+
<span class="cline-any cline-yes">18x</span>
|
|
399
|
+
<span class="cline-any cline-yes">18x</span>
|
|
400
|
+
<span class="cline-any cline-yes">18x</span>
|
|
401
|
+
<span class="cline-any cline-yes">18x</span>
|
|
402
|
+
<span class="cline-any cline-yes">18x</span>
|
|
403
|
+
<span class="cline-any cline-yes">52x</span>
|
|
404
|
+
<span class="cline-any cline-yes">51x</span>
|
|
405
|
+
<span class="cline-any cline-yes">51x</span>
|
|
406
|
+
<span class="cline-any cline-yes">51x</span>
|
|
407
|
+
<span class="cline-any cline-yes">51x</span>
|
|
408
|
+
<span class="cline-any cline-yes">52x</span>
|
|
409
|
+
<span class="cline-any cline-yes">52x</span>
|
|
410
|
+
<span class="cline-any cline-yes">52x</span>
|
|
411
|
+
<span class="cline-any cline-yes">18x</span>
|
|
412
|
+
<span class="cline-any cline-yes">18x</span>
|
|
413
|
+
<span class="cline-any cline-yes">18x</span>
|
|
414
|
+
<span class="cline-any cline-yes">18x</span>
|
|
415
|
+
<span class="cline-any cline-yes">18x</span>
|
|
416
|
+
<span class="cline-any cline-yes">18x</span>
|
|
417
|
+
<span class="cline-any cline-yes">18x</span>
|
|
418
|
+
<span class="cline-any cline-yes">18x</span>
|
|
419
|
+
<span class="cline-any cline-yes">18x</span>
|
|
420
|
+
<span class="cline-any cline-yes">18x</span>
|
|
421
|
+
<span class="cline-any cline-yes">53x</span>
|
|
422
|
+
<span class="cline-any cline-yes">53x</span>
|
|
423
|
+
<span class="cline-any cline-yes">53x</span>
|
|
424
|
+
<span class="cline-any cline-yes">53x</span>
|
|
425
|
+
<span class="cline-any cline-yes">53x</span>
|
|
426
|
+
<span class="cline-any cline-yes">53x</span>
|
|
427
|
+
<span class="cline-any cline-yes">53x</span>
|
|
428
|
+
<span class="cline-any cline-yes">53x</span>
|
|
429
|
+
<span class="cline-any cline-yes">18x</span>
|
|
430
|
+
<span class="cline-any cline-yes">18x</span>
|
|
431
|
+
<span class="cline-any cline-yes">18x</span>
|
|
432
|
+
<span class="cline-any cline-yes">18x</span>
|
|
433
|
+
<span class="cline-any cline-yes">18x</span>
|
|
434
|
+
<span class="cline-any cline-yes">18x</span>
|
|
435
|
+
<span class="cline-any cline-yes">18x</span>
|
|
436
|
+
<span class="cline-any cline-yes">18x</span>
|
|
437
|
+
<span class="cline-any cline-yes">18x</span>
|
|
438
|
+
<span class="cline-any cline-yes">18x</span>
|
|
439
|
+
<span class="cline-any cline-no"> </span>
|
|
440
|
+
<span class="cline-any cline-no"> </span>
|
|
441
|
+
<span class="cline-any cline-no"> </span>
|
|
442
|
+
<span class="cline-any cline-no"> </span>
|
|
443
|
+
<span class="cline-any cline-no"> </span>
|
|
444
|
+
<span class="cline-any cline-no"> </span>
|
|
445
|
+
<span class="cline-any cline-no"> </span>
|
|
446
|
+
<span class="cline-any cline-no"> </span>
|
|
447
|
+
<span class="cline-any cline-yes">18x</span>
|
|
448
|
+
<span class="cline-any cline-yes">18x</span>
|
|
449
|
+
<span class="cline-any cline-yes">18x</span>
|
|
450
|
+
<span class="cline-any cline-yes">18x</span>
|
|
451
|
+
<span class="cline-any cline-yes">18x</span>
|
|
452
|
+
<span class="cline-any cline-yes">18x</span>
|
|
453
|
+
<span class="cline-any cline-yes">18x</span>
|
|
454
|
+
<span class="cline-any cline-yes">18x</span>
|
|
455
|
+
<span class="cline-any cline-yes">18x</span>
|
|
456
|
+
<span class="cline-any cline-yes">18x</span>
|
|
457
|
+
<span class="cline-any cline-yes">1x</span>
|
|
458
|
+
<span class="cline-any cline-yes">1x</span>
|
|
459
|
+
<span class="cline-any cline-yes">1x</span>
|
|
460
|
+
<span class="cline-any cline-yes">1x</span>
|
|
461
|
+
<span class="cline-any cline-yes">1x</span>
|
|
462
|
+
<span class="cline-any cline-yes">1x</span>
|
|
463
|
+
<span class="cline-any cline-yes">1x</span>
|
|
464
|
+
<span class="cline-any cline-yes">1x</span>
|
|
465
|
+
<span class="cline-any cline-yes">18x</span>
|
|
466
|
+
<span class="cline-any cline-yes">18x</span>
|
|
467
|
+
<span class="cline-any cline-yes">18x</span>
|
|
468
|
+
<span class="cline-any cline-yes">18x</span>
|
|
469
|
+
<span class="cline-any cline-yes">18x</span>
|
|
470
|
+
<span class="cline-any cline-yes">18x</span>
|
|
471
|
+
<span class="cline-any cline-yes">18x</span>
|
|
472
|
+
<span class="cline-any cline-yes">18x</span>
|
|
473
|
+
<span class="cline-any cline-yes">18x</span>
|
|
474
|
+
<span class="cline-any cline-yes">18x</span>
|
|
475
|
+
<span class="cline-any cline-yes">832x</span>
|
|
476
|
+
<span class="cline-any cline-yes">832x</span>
|
|
477
|
+
<span class="cline-any cline-yes">832x</span>
|
|
478
|
+
<span class="cline-any cline-yes">832x</span>
|
|
479
|
+
<span class="cline-any cline-yes">113x</span>
|
|
480
|
+
<span class="cline-any cline-yes">113x</span>
|
|
481
|
+
<span class="cline-any cline-yes">832x</span>
|
|
482
|
+
<span class="cline-any cline-yes">832x</span>
|
|
483
|
+
<span class="cline-any cline-yes">832x</span>
|
|
484
|
+
<span class="cline-any cline-no"> </span>
|
|
485
|
+
<span class="cline-any cline-no"> </span>
|
|
486
|
+
<span class="cline-any cline-yes">832x</span>
|
|
487
|
+
<span class="cline-any cline-yes">18x</span>
|
|
488
|
+
<span class="cline-any cline-yes">18x</span>
|
|
489
|
+
<span class="cline-any cline-yes">18x</span>
|
|
490
|
+
<span class="cline-any cline-yes">18x</span>
|
|
491
|
+
<span class="cline-any cline-yes">18x</span>
|
|
492
|
+
<span class="cline-any cline-yes">18x</span>
|
|
493
|
+
<span class="cline-any cline-yes">18x</span>
|
|
494
|
+
<span class="cline-any cline-yes">18x</span>
|
|
495
|
+
<span class="cline-any cline-yes">18x</span>
|
|
496
|
+
<span class="cline-any cline-yes">94x</span>
|
|
497
|
+
<span class="cline-any cline-yes">94x</span>
|
|
498
|
+
<span class="cline-any cline-yes">94x</span>
|
|
499
|
+
<span class="cline-any cline-yes">94x</span>
|
|
500
|
+
<span class="cline-any cline-yes">94x</span>
|
|
501
|
+
<span class="cline-any cline-yes">94x</span>
|
|
502
|
+
<span class="cline-any cline-yes">188x</span>
|
|
503
|
+
<span class="cline-any cline-yes">114x</span>
|
|
504
|
+
<span class="cline-any cline-yes">114x</span>
|
|
505
|
+
<span class="cline-any cline-yes">114x</span>
|
|
506
|
+
<span class="cline-any cline-yes">106x</span>
|
|
507
|
+
<span class="cline-any cline-yes">212x</span>
|
|
508
|
+
<span class="cline-any cline-yes">212x</span>
|
|
509
|
+
<span class="cline-any cline-yes">212x</span>
|
|
510
|
+
<span class="cline-any cline-yes">30x</span>
|
|
511
|
+
<span class="cline-any cline-yes">30x</span>
|
|
512
|
+
<span class="cline-any cline-yes">212x</span>
|
|
513
|
+
<span class="cline-any cline-yes">106x</span>
|
|
514
|
+
<span class="cline-any cline-yes">114x</span>
|
|
515
|
+
<span class="cline-any cline-yes">188x</span>
|
|
516
|
+
<span class="cline-any cline-yes">94x</span>
|
|
517
|
+
<span class="cline-any cline-yes">94x</span>
|
|
518
|
+
<span class="cline-any cline-yes">15x</span>
|
|
519
|
+
<span class="cline-any cline-yes">6x</span>
|
|
520
|
+
<span class="cline-any cline-yes">6x</span>
|
|
521
|
+
<span class="cline-any cline-yes">9x</span>
|
|
522
|
+
<span class="cline-any cline-yes">9x</span>
|
|
523
|
+
<span class="cline-any cline-yes">9x</span>
|
|
524
|
+
<span class="cline-any cline-yes">79x</span>
|
|
525
|
+
<span class="cline-any cline-yes">94x</span>
|
|
526
|
+
<span class="cline-any cline-yes">9x</span>
|
|
527
|
+
<span class="cline-any cline-yes">9x</span>
|
|
528
|
+
<span class="cline-any cline-yes">70x</span>
|
|
529
|
+
<span class="cline-any cline-yes">70x</span>
|
|
530
|
+
<span class="cline-any cline-yes">94x</span>
|
|
531
|
+
<span class="cline-any cline-yes">18x</span>
|
|
532
|
+
<span class="cline-any cline-yes">18x</span>
|
|
533
|
+
<span class="cline-any cline-yes">18x</span>
|
|
534
|
+
<span class="cline-any cline-yes">18x</span>
|
|
535
|
+
<span class="cline-any cline-yes">18x</span>
|
|
536
|
+
<span class="cline-any cline-yes">18x</span>
|
|
537
|
+
<span class="cline-any cline-yes">18x</span>
|
|
538
|
+
<span class="cline-any cline-no"> </span>
|
|
539
|
+
<span class="cline-any cline-no"> </span>
|
|
540
|
+
<span class="cline-any cline-no"> </span>
|
|
541
|
+
<span class="cline-any cline-no"> </span>
|
|
542
|
+
<span class="cline-any cline-no"> </span>
|
|
543
|
+
<span class="cline-any cline-no"> </span>
|
|
544
|
+
<span class="cline-any cline-no"> </span>
|
|
545
|
+
<span class="cline-any cline-no"> </span>
|
|
546
|
+
<span class="cline-any cline-no"> </span>
|
|
547
|
+
<span class="cline-any cline-no"> </span>
|
|
548
|
+
<span class="cline-any cline-no"> </span>
|
|
549
|
+
<span class="cline-any cline-no"> </span>
|
|
550
|
+
<span class="cline-any cline-no"> </span>
|
|
551
|
+
<span class="cline-any cline-no"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-no"> </span>
|
|
556
|
+
<span class="cline-any cline-yes">18x</span>
|
|
557
|
+
<span class="cline-any cline-yes">18x</span>
|
|
558
|
+
<span class="cline-any cline-yes">18x</span>
|
|
559
|
+
<span class="cline-any cline-yes">18x</span>
|
|
560
|
+
<span class="cline-any cline-yes">18x</span>
|
|
561
|
+
<span class="cline-any cline-yes">18x</span>
|
|
562
|
+
<span class="cline-any cline-yes">18x</span>
|
|
563
|
+
<span class="cline-any cline-yes">18x</span>
|
|
564
|
+
<span class="cline-any cline-yes">24x</span>
|
|
565
|
+
<span class="cline-any cline-yes">24x</span>
|
|
566
|
+
<span class="cline-any cline-yes">24x</span>
|
|
567
|
+
<span class="cline-any cline-yes">24x</span>
|
|
568
|
+
<span class="cline-any cline-yes">18x</span>
|
|
569
|
+
<span class="cline-any cline-yes">18x</span>
|
|
570
|
+
<span class="cline-any cline-yes">18x</span>
|
|
571
|
+
<span class="cline-any cline-yes">18x</span>
|
|
572
|
+
<span class="cline-any cline-yes">18x</span>
|
|
573
|
+
<span class="cline-any cline-yes">18x</span>
|
|
574
|
+
<span class="cline-any cline-yes">18x</span>
|
|
575
|
+
<span class="cline-any cline-yes">18x</span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-yes">18x</span>
|
|
580
|
+
<span class="cline-any cline-yes">18x</span>
|
|
581
|
+
<span class="cline-any cline-yes">18x</span>
|
|
582
|
+
<span class="cline-any cline-yes">18x</span>
|
|
583
|
+
<span class="cline-any cline-yes">18x</span>
|
|
584
|
+
<span class="cline-any cline-yes">18x</span>
|
|
585
|
+
<span class="cline-any cline-yes">18x</span>
|
|
586
|
+
<span class="cline-any cline-yes">18x</span>
|
|
587
|
+
<span class="cline-any cline-yes">8x</span>
|
|
588
|
+
<span class="cline-any cline-yes">8x</span>
|
|
589
|
+
<span class="cline-any cline-yes">8x</span>
|
|
590
|
+
<span class="cline-any cline-yes">8x</span>
|
|
591
|
+
<span class="cline-any cline-yes">8x</span>
|
|
592
|
+
<span class="cline-any cline-yes">8x</span>
|
|
593
|
+
<span class="cline-any cline-yes">6x</span>
|
|
594
|
+
<span class="cline-any cline-yes">6x</span>
|
|
595
|
+
<span class="cline-any cline-yes">6x</span>
|
|
596
|
+
<span class="cline-any cline-yes">6x</span>
|
|
597
|
+
<span class="cline-any cline-yes">6x</span>
|
|
598
|
+
<span class="cline-any cline-yes">6x</span>
|
|
599
|
+
<span class="cline-any cline-yes">6x</span>
|
|
600
|
+
<span class="cline-any cline-yes">2x</span>
|
|
601
|
+
<span class="cline-any cline-yes">2x</span>
|
|
602
|
+
<span class="cline-any cline-yes">2x</span>
|
|
603
|
+
<span class="cline-any cline-yes">2x</span>
|
|
604
|
+
<span class="cline-any cline-yes">2x</span>
|
|
605
|
+
<span class="cline-any cline-yes">2x</span>
|
|
606
|
+
<span class="cline-any cline-yes">6x</span>
|
|
607
|
+
<span class="cline-any cline-yes">6x</span>
|
|
608
|
+
<span class="cline-any cline-yes">8x</span>
|
|
609
|
+
<span class="cline-any cline-yes">8x</span>
|
|
610
|
+
<span class="cline-any cline-yes">16x</span>
|
|
611
|
+
<span class="cline-any cline-yes">32x</span>
|
|
612
|
+
<span class="cline-any cline-yes">32x</span>
|
|
613
|
+
<span class="cline-any cline-yes">32x</span>
|
|
614
|
+
<span class="cline-any cline-yes">32x</span>
|
|
615
|
+
<span class="cline-any cline-yes">32x</span>
|
|
616
|
+
<span class="cline-any cline-yes">1x</span>
|
|
617
|
+
<span class="cline-any cline-yes">1x</span>
|
|
618
|
+
<span class="cline-any cline-yes">1x</span>
|
|
619
|
+
<span class="cline-any cline-yes">1x</span>
|
|
620
|
+
<span class="cline-any cline-yes">1x</span>
|
|
621
|
+
<span class="cline-any cline-yes">1x</span>
|
|
622
|
+
<span class="cline-any cline-yes">1x</span>
|
|
623
|
+
<span class="cline-any cline-yes">1x</span>
|
|
624
|
+
<span class="cline-any cline-yes">1x</span>
|
|
625
|
+
<span class="cline-any cline-yes">1x</span>
|
|
626
|
+
<span class="cline-any cline-yes">1x</span>
|
|
627
|
+
<span class="cline-any cline-yes">32x</span>
|
|
628
|
+
<span class="cline-any cline-yes">16x</span>
|
|
629
|
+
<span class="cline-any cline-yes">8x</span>
|
|
630
|
+
<span class="cline-any cline-yes">8x</span>
|
|
631
|
+
<span class="cline-any cline-yes">8x</span>
|
|
632
|
+
<span class="cline-any cline-yes">18x</span>
|
|
633
|
+
<span class="cline-any cline-yes">18x</span>
|
|
634
|
+
<span class="cline-any cline-yes">18x</span>
|
|
635
|
+
<span class="cline-any cline-yes">1x</span>
|
|
636
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">"use strict";
|
|
637
|
+
|
|
638
|
+
module.exports = function() {
|
|
639
|
+
/**
|
|
640
|
+
* Implements behavior of a single node in a hierarchy of authorization
|
|
641
|
+
* rules.
|
|
642
|
+
*
|
|
643
|
+
* @property {?AuthorizationNode} parent refers to superordinated node
|
|
644
|
+
* @property {?string} name name of segment addressing this node in context of its parent
|
|
645
|
+
* @property {{accept: object<string, number>, reject: object<string, number>}} roles maps names of roles into number of rules requesting to accept/reject
|
|
646
|
+
* @property {{accept: object<string, number>, reject: object<string, number>}} users lists UUIDs of users to accept/reject in context of node
|
|
647
|
+
* @property {object<string,AuthorizationNode>} children maps relative names into subordinated nodes
|
|
648
|
+
*/
|
|
649
|
+
class AuthorizationNode {
|
|
650
|
+
/**
|
|
651
|
+
* @param {string} [segmentName] name of segment addressing this node in context of its parent node
|
|
652
|
+
* @param {AuthorizationNode} [parent] refers to parent node of this one
|
|
653
|
+
*/
|
|
654
|
+
constructor( segmentName, parent ) {
|
|
655
|
+
Object.defineProperties( this, {
|
|
656
|
+
parent: {
|
|
657
|
+
value: parent || undefined,
|
|
658
|
+
enumerable: false,
|
|
659
|
+
},
|
|
660
|
+
name: {
|
|
661
|
+
value: segmentName || undefined,
|
|
662
|
+
enumerable: false,
|
|
663
|
+
},
|
|
664
|
+
} );
|
|
665
|
+
|
|
666
|
+
this.clear();
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* Drops all information previously stored in node due to adding rules.
|
|
671
|
+
*
|
|
672
|
+
* @returns {AuthorizationNode} fluent interface
|
|
673
|
+
*/
|
|
674
|
+
clear() {
|
|
675
|
+
this.roles = { accept: {}, reject: {} };
|
|
676
|
+
this.users = { accept: {}, reject: {} };
|
|
677
|
+
this.children = {};
|
|
678
|
+
|
|
679
|
+
return this;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* Tracks named role to be accepted or rejected in context of current
|
|
684
|
+
* node.
|
|
685
|
+
*
|
|
686
|
+
* @param {string} roleName name of role to add
|
|
687
|
+
* @param {boolean} accept true if role is accepted, false if it's rejected
|
|
688
|
+
* @returns {AuthorizationNode} fluent interface
|
|
689
|
+
*/
|
|
690
|
+
addRole( roleName, accept = true ) {
|
|
691
|
+
if ( roleName && typeof roleName === "string" && roleName.trim().length > 0 ) {
|
|
692
|
+
const list = this.roles[accept ? "accept" : "reject"];
|
|
693
|
+
|
|
694
|
+
list[roleName] = ( list[roleName] || 0 ) + 1;
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
return this;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
/**
|
|
701
|
+
* Tracks user described by its name to be accepted or rejected in
|
|
702
|
+
* context of current node.
|
|
703
|
+
*
|
|
704
|
+
* @param {string} userName name of user to add
|
|
705
|
+
* @param {boolean} accept true if user is granted access on resource, false if it's revoked
|
|
706
|
+
* @returns {AuthorizationNode} fluent interface
|
|
707
|
+
*/
|
|
708
|
+
addUser( userName, accept = true ) {
|
|
709
|
+
if ( userName && typeof userName === "string" && userName.trim().length > 0 ) {
|
|
710
|
+
const list = this.users[accept ? "accept" : "reject"];
|
|
711
|
+
|
|
712
|
+
list[userName] = ( list[userName] || 0 ) + 1;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
return this;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
/**
|
|
719
|
+
* Drops named role to be accepted or rejected in context of current
|
|
720
|
+
* node.
|
|
721
|
+
*
|
|
722
|
+
* @param {string} roleName name of role to drop
|
|
723
|
+
* @param {boolean} accept true if role is accepted, false if it's rejected
|
|
724
|
+
* @returns {AuthorizationNode} fluent interface
|
|
725
|
+
*/
|
|
726
|
+
<span class="fstat-no" title="function not covered" > removeRole( roleName, accept = true ) {</span>
|
|
727
|
+
<span class="cstat-no" title="statement not covered" > if ( roleName && typeof roleName === "string" && roleName.trim().length > 0 ) {</span>
|
|
728
|
+
<span class="cstat-no" title="statement not covered" > const list = this.roles[accept ? "accept" : "reject"];</span>
|
|
729
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
730
|
+
<span class="cstat-no" title="statement not covered" > list[roleName] = Math.max( 0, ( list[roleName] || 1 ) - 1 );</span>
|
|
731
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
732
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
733
|
+
<span class="cstat-no" title="statement not covered" > return this;</span>
|
|
734
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* Drops user described by its name to be accepted or rejected in
|
|
738
|
+
* context of current node.
|
|
739
|
+
*
|
|
740
|
+
* @param {string} userName name of user to add
|
|
741
|
+
* @param {boolean} accept true if role is accepted, false if it's rejected
|
|
742
|
+
* @returns {AuthorizationNode} fluent interface
|
|
743
|
+
*/
|
|
744
|
+
removeUser( userName, accept = true ) {
|
|
745
|
+
if ( userName && typeof userName === "string" && userName.trim().length > 0 ) {
|
|
746
|
+
const list = this.users[accept ? "accept" <span class="branch-0 cbranch-no" title="branch not covered" >: "reject"]</span>;
|
|
747
|
+
|
|
748
|
+
list[userName] = Math.max( 0, ( list[userName] <span class="branch-0 cbranch-no" title="branch not covered" >|| 1 </span>) - 1 );
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
return this;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/**
|
|
755
|
+
* Fetches subordinated node by its name optionally creating it in case
|
|
756
|
+
* it is missing.
|
|
757
|
+
*
|
|
758
|
+
* @param {string} name name of child to look up
|
|
759
|
+
* @param {boolean} addIfMissing true if child should be created if missing
|
|
760
|
+
* @returns {AuthorizationNode} found or created child node, undefined if missing
|
|
761
|
+
*/
|
|
762
|
+
getChild( name, addIfMissing = false ) {
|
|
763
|
+
if ( name && typeof name === "string" ) {
|
|
764
|
+
let child = this.children[name];
|
|
765
|
+
|
|
766
|
+
if ( child == null && addIfMissing ) {
|
|
767
|
+
child = this.children[name] = new this.constructor( name, this );
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
return child || undefined;
|
|
771
|
+
}
|
|
772
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
773
|
+
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* Tests if provided user and/or role is affected by current node.
|
|
778
|
+
*
|
|
779
|
+
* @param {Buffer|Buffer[]} userName name(s) of user(s) to check
|
|
780
|
+
* @param {string|string[]} roleName name(s) of role(s) to check
|
|
781
|
+
* @returns {number} >0 on accepting user(s)/role(s) explicitly, <0 on rejecting explicitly, ==0 on missing explicit impact on user(s)/role(s)
|
|
782
|
+
*/
|
|
783
|
+
isAuthorized( userName, roleName ) {
|
|
784
|
+
const users = Array.isArray( userName ) ? userName : userName ? [userName] : [];
|
|
785
|
+
const roles = Array.isArray( roleName ) ? roleName : roleName ? [roleName] : [];
|
|
786
|
+
const actions = [ "accept", "reject" ];
|
|
787
|
+
const state = { accept: false, reject: false };
|
|
788
|
+
|
|
789
|
+
for ( const [ names, rules ] of [ [ users, this.users ], [ roles, this.roles ] ] ) {
|
|
790
|
+
for ( let i = 0, length = names.length; i < length; i++ ) {
|
|
791
|
+
const name = names[i];
|
|
792
|
+
|
|
793
|
+
if ( name && typeof name === "string" && name.trim().length > 0 ) {
|
|
794
|
+
for ( let j = 0; j < 2; j++ ) {
|
|
795
|
+
const action = actions[j];
|
|
796
|
+
|
|
797
|
+
if ( rules[action][name] > 0 ) {
|
|
798
|
+
state[action] = true;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
if ( state.accept ) {
|
|
806
|
+
if ( state.reject ) {
|
|
807
|
+
throw new Error( `granting and revoking access on "${this.path()}" to/from user(s) "${userName || "<none>"}" and/or role(s) "${roleName || "<none>"}"` );
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
return 1;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
if ( state.reject ) {
|
|
814
|
+
return -1;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
return 0;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* Indicates if current node has any viable information.
|
|
822
|
+
*
|
|
823
|
+
* @returns {boolean} true if node hasn't any viable information affecting authorization checks
|
|
824
|
+
*/
|
|
825
|
+
<span class="fstat-no" title="function not covered" > isSpare() {</span>
|
|
826
|
+
<span class="cstat-no" title="statement not covered" > for ( const list of [ this.users.accept, this.users.reject, this.roles.accept, this.roles.reject ] ) {</span>
|
|
827
|
+
<span class="cstat-no" title="statement not covered" > for ( let i = 0, keys = Object.keys( list ), length = keys.length; i < length; i++ ) {</span>
|
|
828
|
+
<span class="cstat-no" title="statement not covered" > if ( list[keys[i]] > 0 ) {</span>
|
|
829
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
830
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
831
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
832
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
833
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
834
|
+
<span class="cstat-no" title="statement not covered" > for ( let i = 0, keys = Object.keys( this.children ), length = keys.length; i < length; i++ ) {</span>
|
|
835
|
+
<span class="cstat-no" title="statement not covered" > const child = this.children[keys[i]];</span>
|
|
836
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
837
|
+
<span class="cstat-no" title="statement not covered" > if ( child != null && !child.isSpare() ) {</span>
|
|
838
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
839
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
840
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
841
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
842
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
843
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
844
|
+
|
|
845
|
+
/**
|
|
846
|
+
* Renders path of current node mostly for debugging and logging
|
|
847
|
+
* purposes.
|
|
848
|
+
*
|
|
849
|
+
* @returns {string} path name of current node
|
|
850
|
+
*/
|
|
851
|
+
path() {
|
|
852
|
+
const prefix = this.parent && this.parent.path();
|
|
853
|
+
|
|
854
|
+
return prefix ? prefix + "." + this.name : this.name;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
/**
|
|
858
|
+
* Generates string describing current tree of authorizations in a
|
|
859
|
+
* human-readable form.
|
|
860
|
+
*
|
|
861
|
+
* @return {string} rendered description of current tree of authorizations
|
|
862
|
+
*/
|
|
863
|
+
<span class="fstat-no" title="function not covered" > dump() {</span>
|
|
864
|
+
<span class="cstat-no" title="statement not covered" > // TODO implement code for dumping current node to log</span>
|
|
865
|
+
<span class="cstat-no" title="statement not covered" > return "tbd.";</span>
|
|
866
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
867
|
+
|
|
868
|
+
/**
|
|
869
|
+
* Transfer every valuable information to a clone of current node and
|
|
870
|
+
* return it.
|
|
871
|
+
*
|
|
872
|
+
* @returns {AuthorizationNode} clone of current node limited to currently valuable data, undefined if node isn't required anymore
|
|
873
|
+
*/
|
|
874
|
+
gc() {
|
|
875
|
+
const children = this.children;
|
|
876
|
+
const childrenNames = Object.keys( children );
|
|
877
|
+
const numChildren = childrenNames.length;
|
|
878
|
+
let clone;
|
|
879
|
+
|
|
880
|
+
for ( let i = 0; i < numChildren; i++ ) {
|
|
881
|
+
const childName = childrenNames[i];
|
|
882
|
+
const child = children[childName];
|
|
883
|
+
|
|
884
|
+
if ( child ) {
|
|
885
|
+
const cleared = child.gc();
|
|
886
|
+
|
|
887
|
+
if ( cleared ) {
|
|
888
|
+
if ( !clone ) {
|
|
889
|
+
clone = new this.constructor( this.name, this.parent );
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
clone.children[childName] = cleared;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
for ( const type of [ "roles", "users" ] ) {
|
|
898
|
+
for ( const mode of [ "accept", "reject" ] ) {
|
|
899
|
+
const list = this[type][mode];
|
|
900
|
+
const keys = Object.keys( list );
|
|
901
|
+
const numKeys = keys.length;
|
|
902
|
+
|
|
903
|
+
for ( let i = 0; i < numKeys; i++ ) {
|
|
904
|
+
const key = keys[i];
|
|
905
|
+
const count = list[key];
|
|
906
|
+
|
|
907
|
+
if ( count > 0 ) {
|
|
908
|
+
if ( !clone ) {
|
|
909
|
+
clone = new this.constructor( this.name, this.parent );
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
clone[type][mode][key] = count;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
return clone;
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
return AuthorizationNode;
|
|
923
|
+
};
|
|
924
|
+
</pre></td></tr></table></pre>
|
|
925
|
+
|
|
926
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
927
|
+
</div><!-- /wrapper -->
|
|
928
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
929
|
+
Code coverage generated by
|
|
930
|
+
<a href="https://istanbul.js.org/" target="_blank">istanbul</a>
|
|
931
|
+
at Sun Mar 27 2022 22:51:56 GMT+0200 (Mitteleuropäische Sommerzeit)
|
|
932
|
+
</div>
|
|
933
|
+
</div>
|
|
934
|
+
<script src="../../../../prettify.js"></script>
|
|
935
|
+
<script>
|
|
936
|
+
window.onload = function () {
|
|
937
|
+
prettyPrint();
|
|
938
|
+
};
|
|
939
|
+
</script>
|
|
940
|
+
<script src="../../../../sorter.js"></script>
|
|
941
|
+
<script src="../../../../block-navigation.js"></script>
|
|
942
|
+
</body>
|
|
943
|
+
</html>
|
|
944
|
+
|