1 | /******************************************************************************* | |
2 | * Copyhacked (H) 2012-2020. | |
3 | * This program and the accompanying materials | |
4 | * are made available under no term at all, use it like | |
5 | * you want, but share and discuss about it | |
6 | * every time possible with every body. | |
7 | * | |
8 | * Contributors: | |
9 | * ron190 at ymail dot com - initial implementation | |
10 | ******************************************************************************/ | |
11 | package com.jsql.view.swing.manager; | |
12 | ||
13 | import com.jsql.model.bean.util.Interaction; | |
14 | import com.jsql.model.bean.util.Request; | |
15 | import com.jsql.model.injection.method.AbstractMethodInjection; | |
16 | import com.jsql.model.injection.vendor.model.Vendor; | |
17 | import com.jsql.util.I18nUtil; | |
18 | import com.jsql.util.LogLevelUtil; | |
19 | import com.jsql.view.scan.ScanListTerminal; | |
20 | import com.jsql.view.swing.list.*; | |
21 | import com.jsql.view.swing.manager.util.JButtonStateful; | |
22 | import com.jsql.view.swing.manager.util.StateButton; | |
23 | import com.jsql.view.swing.scrollpane.LightScrollPane; | |
24 | import com.jsql.view.swing.ui.FlatButtonMouseAdapter; | |
25 | import com.jsql.view.swing.util.I18nViewUtil; | |
26 | import com.jsql.view.swing.util.MediatorHelper; | |
27 | import com.jsql.view.swing.util.UiUtil; | |
28 | import org.apache.logging.log4j.LogManager; | |
29 | import org.apache.logging.log4j.Logger; | |
30 | import org.json.JSONArray; | |
31 | import org.json.JSONException; | |
32 | ||
33 | import javax.swing.*; | |
34 | import java.awt.*; | |
35 | import java.io.BufferedReader; | |
36 | import java.io.IOException; | |
37 | import java.io.InputStreamReader; | |
38 | import java.nio.charset.StandardCharsets; | |
39 | import java.util.ArrayList; | |
40 | import java.util.List; | |
41 | import java.util.Objects; | |
42 | import java.util.Optional; | |
43 | ||
44 | /** | |
45 | * Manager to display webpages frequently used as backoffice administration. | |
46 | */ | |
47 | public class ManagerScan extends AbstractManagerList { | |
48 | | |
49 | /** | |
50 | * Log4j logger sent to view. | |
51 | */ | |
52 | private static final Logger LOGGER = LogManager.getRootLogger(); | |
53 | ||
54 | public static final String NAME = "listManagerScan"; | |
55 | ||
56 | /** | |
57 | * Create admin page finder. | |
58 | */ | |
59 | public ManagerScan() { | |
60 | | |
61 |
1
1. <init> : removed call to com/jsql/view/swing/manager/ManagerScan::setLayout → NO_COVERAGE |
this.setLayout(new BorderLayout()); |
62 | ||
63 | List<ItemList> itemsList = this.getItemList(); | |
64 | | |
65 | final DnDList dndListScan = new DnDListScan(itemsList); | |
66 | | |
67 |
1
1. <init> : removed call to com/jsql/view/swing/list/DnDList::setTransferHandler → NO_COVERAGE |
dndListScan.setTransferHandler(null); |
68 |
1
1. <init> : removed call to com/jsql/view/swing/list/DnDList::setTransferHandler → NO_COVERAGE |
dndListScan.setTransferHandler(new ListTransfertHandlerScan()); |
69 | | |
70 | this.listPaths = dndListScan; | |
71 |
1
1. <init> : removed call to com/jsql/view/swing/list/DnDList::setName → NO_COVERAGE |
this.listPaths.setName(ManagerScan.NAME); |
72 | | |
73 |
1
1. <init> : removed call to com/jsql/view/swing/list/DnDList::setBorder → NO_COVERAGE |
this.getListPaths().setBorder(BorderFactory.createEmptyBorder(0, 0, LightScrollPane.THUMB_SIZE, 0)); |
74 |
1
1. <init> : removed call to com/jsql/view/swing/manager/ManagerScan::add → NO_COVERAGE |
this.add(new LightScrollPane(0, 0, 0, 0, dndListScan), BorderLayout.CENTER); |
75 | ||
76 | JPanel lastLine = this.getLastLinePanel(dndListScan); | |
77 |
1
1. <init> : removed call to com/jsql/view/swing/manager/ManagerScan::add → NO_COVERAGE |
this.add(lastLine, BorderLayout.SOUTH); |
78 | | |
79 |
1
1. <init> : removed call to com/jsql/view/swing/list/DnDList::addListSelectionListener → NO_COVERAGE |
dndListScan.addListSelectionListener(e -> { |
80 | | |
81 |
1
1. lambda$new$0 : negated conditional → NO_COVERAGE |
if (dndListScan.getSelectedValue() == null) { |
82 | return; | |
83 | } | |
84 | | |
85 | var beanInjection = ((ItemListScan) dndListScan.getSelectedValue()).getBeanInjection(); | |
86 | | |
87 |
1
1. lambda$new$0 : removed call to javax/swing/JTextField::setText → NO_COVERAGE |
MediatorHelper.panelAddressBar().getTextFieldAddress().setText(beanInjection.getUrl()); |
88 |
1
1. lambda$new$0 : removed call to javax/swing/JTextField::setText → NO_COVERAGE |
MediatorHelper.panelAddressBar().getTextFieldHeader().setText(beanInjection.getHeader()); |
89 |
1
1. lambda$new$0 : removed call to javax/swing/JTextField::setText → NO_COVERAGE |
MediatorHelper.panelAddressBar().getTextFieldRequest().setText(beanInjection.getRequest()); |
90 | | |
91 | String requestType = beanInjection.getRequestType(); | |
92 |
2
1. lambda$new$0 : negated conditional → NO_COVERAGE 2. lambda$new$0 : negated conditional → NO_COVERAGE |
if (requestType != null && !requestType.isEmpty()) { |
93 |
1
1. lambda$new$0 : removed call to com/jsql/view/swing/radio/RadioLinkMethod::setText → NO_COVERAGE |
MediatorHelper.panelAddressBar().getRadioRequest().setText(requestType); |
94 | } else { | |
95 |
1
1. lambda$new$0 : removed call to com/jsql/view/swing/radio/RadioLinkMethod::setText → NO_COVERAGE |
MediatorHelper.panelAddressBar().getRadioRequest().setText("GET"); |
96 | } | |
97 | | |
98 | AbstractMethodInjection method = beanInjection.getMethodInstance(); | |
99 | | |
100 |
1
1. lambda$new$0 : negated conditional → NO_COVERAGE |
if (method == MediatorHelper.model().getMediatorMethod().getHeader()) { |
101 |
1
1. lambda$new$0 : removed call to com/jsql/view/swing/radio/RadioLinkMethod::setSelected → NO_COVERAGE |
MediatorHelper.panelAddressBar().getRadioHeader().setSelected(); |
102 |
1
1. lambda$new$0 : negated conditional → NO_COVERAGE |
} else if (method == MediatorHelper.model().getMediatorMethod().getRequest()) { |
103 |
1
1. lambda$new$0 : removed call to com/jsql/view/swing/radio/RadioLinkMethod::setSelected → NO_COVERAGE |
MediatorHelper.panelAddressBar().getRadioRequest().setSelected(); |
104 | } else { | |
105 |
1
1. lambda$new$0 : removed call to com/jsql/view/swing/radio/RadioLinkMethod::setSelected → NO_COVERAGE |
MediatorHelper.panelAddressBar().getRadioQueryString().setSelected(); |
106 | } | |
107 | }); | |
108 | } | |
109 | ||
110 | private JPanel getLastLinePanel(final DnDList dndListScan) { | |
111 | | |
112 | var lastLine = new JPanel(); | |
113 |
1
1. getLastLinePanel : removed call to javax/swing/JPanel::setOpaque → NO_COVERAGE |
lastLine.setOpaque(false); |
114 |
1
1. getLastLinePanel : removed call to javax/swing/JPanel::setLayout → NO_COVERAGE |
lastLine.setLayout(new BoxLayout(lastLine, BoxLayout.X_AXIS)); |
115 | ||
116 |
1
1. getLastLinePanel : removed call to javax/swing/JPanel::setBorder → NO_COVERAGE |
lastLine.setBorder( |
117 | BorderFactory.createCompoundBorder( | |
118 | BorderFactory.createMatteBorder(0, 0, 0, 0, UiUtil.COLOR_COMPONENT_BORDER), | |
119 | BorderFactory.createEmptyBorder(1, 0, 1, 1) | |
120 | ) | |
121 | ); | |
122 | | |
123 |
1
1. getLastLinePanel : removed call to com/jsql/view/swing/manager/ManagerScan::initializeRunButton → NO_COVERAGE |
this.initializeRunButton(dndListScan); |
124 | ||
125 |
1
1. getLastLinePanel : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
this.loader.setVisible(false); |
126 | ||
127 | lastLine.add(Box.createHorizontalGlue()); | |
128 | lastLine.add(this.loader); | |
129 | lastLine.add(Box.createRigidArea(new Dimension(5, 0))); | |
130 | lastLine.add(this.run); | |
131 | | |
132 |
1
1. getLastLinePanel : replaced return value with null for com/jsql/view/swing/manager/ManagerScan::getLastLinePanel → NO_COVERAGE |
return lastLine; |
133 | } | |
134 | ||
135 | private List<ItemList> getItemList() { | |
136 | | |
137 | var jsonScan = new StringBuilder(); | |
138 | | |
139 | try ( | |
140 | var inputStream = UiUtil.class.getClassLoader().getResourceAsStream(UiUtil.INPUT_STREAM_PAGES_SCAN); | |
141 | var inputStreamReader = new InputStreamReader(Objects.requireNonNull(inputStream), StandardCharsets.UTF_8); | |
142 | var reader = new BufferedReader(inputStreamReader) | |
143 | ) { | |
144 | | |
145 | String line; | |
146 |
1
1. getItemList : negated conditional → NO_COVERAGE |
while ((line = reader.readLine()) != null) { |
147 | jsonScan.append(line); | |
148 | } | |
149 | } catch (IOException e) { | |
150 | LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e); | |
151 | } | |
152 | | |
153 | List<ItemList> itemsList = new ArrayList<>(); | |
154 | | |
155 | try { | |
156 | var jsonArrayScan = new JSONArray(jsonScan.toString()); | |
157 | | |
158 |
2
1. getItemList : changed conditional boundary → NO_COVERAGE 2. getItemList : negated conditional → NO_COVERAGE |
for (var i = 0 ; i < jsonArrayScan.length() ; i++) { |
159 | | |
160 | var jsonObjectScan = jsonArrayScan.getJSONObject(i); | |
161 | | |
162 | var beanInjection = new BeanInjection( | |
163 | jsonObjectScan.getString("url"), | |
164 | jsonObjectScan.optString("request"), | |
165 | jsonObjectScan.optString("header"), | |
166 | jsonObjectScan.optString("method"), | |
167 | jsonObjectScan.optString("vendor"), | |
168 | jsonObjectScan.optString("requestType") | |
169 | ); | |
170 | | |
171 | itemsList.add(new ItemListScan(beanInjection)); | |
172 | } | |
173 | } catch (JSONException e) { | |
174 | LOGGER.log(LogLevelUtil.CONSOLE_JAVA, e, e); | |
175 | } | |
176 | | |
177 |
1
1. getItemList : replaced return value with Collections.emptyList for com/jsql/view/swing/manager/ManagerScan::getItemList → NO_COVERAGE |
return itemsList; |
178 | } | |
179 | ||
180 | private void initializeRunButton(final DnDList dndListScan) { | |
181 | | |
182 | this.defaultText = "SCAN_RUN_BUTTON_LABEL"; | |
183 | this.run = new JButtonStateful(this.defaultText); | |
184 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/util/I18nViewUtil::addComponentForKey → NO_COVERAGE |
I18nViewUtil.addComponentForKey("SCAN_RUN_BUTTON_LABEL", this.run); |
185 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setToolTipText → NO_COVERAGE |
this.run.setToolTipText(I18nUtil.valueByKey("SCAN_RUN_BUTTON_TOOLTIP")); |
186 | ||
187 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setContentAreaFilled → NO_COVERAGE |
this.run.setContentAreaFilled(false); |
188 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setBorder → NO_COVERAGE |
this.run.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8)); |
189 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setBackground → NO_COVERAGE |
this.run.setBackground(UiUtil.COLOR_FOCUS_GAINED); |
190 | | |
191 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::addMouseListener → NO_COVERAGE |
this.run.addMouseListener(new FlatButtonMouseAdapter(this.run)); |
192 | | |
193 |
1
1. initializeRunButton : removed call to com/jsql/view/swing/manager/util/JButtonStateful::addActionListener → NO_COVERAGE |
this.run.addActionListener(actionEvent -> { |
194 | | |
195 |
1
1. lambda$initializeRunButton$2 : negated conditional → NO_COVERAGE |
if (dndListScan.getSelectedValuesList().isEmpty()) { |
196 | | |
197 | LOGGER.log(LogLevelUtil.CONSOLE_ERROR, "Select URL(s) to scan"); | |
198 | return; | |
199 | } | |
200 | | |
201 | new Thread( | |
202 | () -> { | |
203 | | |
204 |
1
1. lambda$initializeRunButton$1 : negated conditional → NO_COVERAGE |
if (ManagerScan.this.run.getState() == StateButton.STARTABLE) { |
205 | | |
206 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setText → NO_COVERAGE |
ManagerScan.this.run.setText(I18nViewUtil.valueByKey("SCAN_RUN_BUTTON_STOP")); |
207 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setState → NO_COVERAGE |
ManagerScan.this.run.setState(StateButton.STOPPABLE); |
208 |
1
1. lambda$initializeRunButton$1 : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
ManagerScan.this.loader.setVisible(true); |
209 | | |
210 | DefaultListModel<ItemList> listModel = (DefaultListModel<ItemList>) dndListScan.getModel(); | |
211 |
2
1. lambda$initializeRunButton$1 : negated conditional → NO_COVERAGE 2. lambda$initializeRunButton$1 : changed conditional boundary → NO_COVERAGE |
for (var i = 0 ; i < listModel.getSize() ; i++) { |
212 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/view/swing/list/ItemList::reset → NO_COVERAGE |
listModel.get(i).reset(); |
213 | } | |
214 | | |
215 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/view/swing/manager/ManagerScan::scan → NO_COVERAGE |
this.scan(dndListScan.getSelectedValuesList()); |
216 | | |
217 | } else { | |
218 | | |
219 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/model/accessible/ResourceAccess::setScanStopped → NO_COVERAGE |
MediatorHelper.model().getResourceAccess().setScanStopped(true); |
220 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/model/InjectionModel::setIsStoppedByUser → NO_COVERAGE |
MediatorHelper.model().setIsStoppedByUser(true); |
221 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setEnabled → NO_COVERAGE |
ManagerScan.this.run.setEnabled(false); |
222 |
1
1. lambda$initializeRunButton$1 : removed call to com/jsql/view/swing/manager/util/JButtonStateful::setState → NO_COVERAGE |
ManagerScan.this.run.setState(StateButton.STOPPING); |
223 | } | |
224 | }, | |
225 | "ThreadScan" | |
226 |
1
1. lambda$initializeRunButton$2 : removed call to java/lang/Thread::start → NO_COVERAGE |
).start(); |
227 | }); | |
228 | } | |
229 | | |
230 | /** | |
231 | * Start fast scan of URLs in sequence and display result. | |
232 | * Unplug any existing view and plug a console-like view in order to | |
233 | * respond appropriately to GUI message with simple text result instead of | |
234 | * build complex graphical components during the multi website injections. | |
235 | * At the end of the scan it plugs again the normal view. | |
236 | * @param urlsItemList contains a list of String URL | |
237 | */ | |
238 | public void scan(List<ItemList> urlsItemList) { | |
239 | | |
240 | // Erase everything in the view from a previous injection | |
241 | var requests = new Request(); | |
242 |
1
1. scan : removed call to com/jsql/model/bean/util/Request::setMessage → NO_COVERAGE |
requests.setMessage(Interaction.RESET_INTERFACE); |
243 |
1
1. scan : removed call to com/jsql/model/InjectionModel::sendToViews → NO_COVERAGE |
MediatorHelper.model().sendToViews(requests); |
244 | | |
245 | // wait for ending of ongoing interaction between two injections | |
246 | try { | |
247 |
1
1. scan : removed call to java/lang/Thread::sleep → NO_COVERAGE |
Thread.sleep(500); |
248 | } catch (InterruptedException e) { | |
249 | | |
250 | LOGGER.log(LogLevelUtil.IGNORE, e, e); | |
251 |
1
1. scan : removed call to java/lang/Thread::interrupt → NO_COVERAGE |
Thread.currentThread().interrupt(); |
252 | } | |
253 | ||
254 | // Display result only in console | |
255 | var requestUnsubscribe = new Request(); | |
256 |
1
1. scan : removed call to com/jsql/model/bean/util/Request::setMessage → NO_COVERAGE |
requestUnsubscribe.setMessage(Interaction.UNSUBSCRIBE); |
257 |
1
1. scan : removed call to com/jsql/model/InjectionModel::sendToViews → NO_COVERAGE |
MediatorHelper.model().sendToViews(requestUnsubscribe); |
258 |
1
1. scan : removed call to com/jsql/model/InjectionModel::subscribe → NO_COVERAGE |
MediatorHelper.model().subscribe(new ScanListTerminal()); |
259 | | |
260 |
1
1. scan : removed call to com/jsql/model/InjectionModel::setIsScanning → NO_COVERAGE |
MediatorHelper.model().setIsScanning(true); |
261 |
1
1. scan : removed call to com/jsql/model/accessible/ResourceAccess::setScanStopped → NO_COVERAGE |
MediatorHelper.model().getResourceAccess().setScanStopped(false); |
262 | | |
263 | for (ItemList urlItemList: urlsItemList) { | |
264 | | |
265 | var urlItemListScan = (ItemListScan) urlItemList; | |
266 |
2
1. scan : negated conditional → NO_COVERAGE 2. scan : negated conditional → NO_COVERAGE |
if (MediatorHelper.model().isStoppedByUser() || MediatorHelper.model().getResourceAccess().isScanStopped()) { |
267 | break; | |
268 | } | |
269 | | |
270 | LOGGER.log(LogLevelUtil.CONSOLE_INFORM, "Scanning {}", urlItemListScan.getBeanInjection().getUrl()); | |
271 | ||
272 | Optional<Vendor> vendor = MediatorHelper.model().getMediatorVendor().getVendors() | |
273 | .stream() | |
274 |
2
1. lambda$scan$3 : replaced boolean return with true for com/jsql/view/swing/manager/ManagerScan::lambda$scan$3 → NO_COVERAGE 2. lambda$scan$3 : replaced boolean return with false for com/jsql/view/swing/manager/ManagerScan::lambda$scan$3 → NO_COVERAGE |
.filter(v -> v.toString().equalsIgnoreCase(urlItemListScan.getBeanInjection().getVendor())) |
275 | .findAny(); | |
276 | ||
277 |
1
1. scan : removed call to com/jsql/model/injection/vendor/MediatorVendor::setVendorByUser → NO_COVERAGE |
MediatorHelper.model().getMediatorVendor().setVendorByUser(vendor.orElse(MediatorHelper.model().getMediatorVendor().getAuto())); |
278 | ||
279 |
1
1. scan : removed call to com/jsql/util/ParameterUtil::controlInput → NO_COVERAGE |
MediatorHelper.model().getMediatorUtils().getParameterUtil().controlInput( |
280 | urlItemListScan.getBeanInjection().getUrl(), | |
281 | urlItemListScan.getBeanInjection().getRequest(), | |
282 | urlItemListScan.getBeanInjection().getHeader(), | |
283 | urlItemListScan.getBeanInjection().getMethodInstance(), | |
284 | urlItemListScan.getBeanInjection().getRequestType(), | |
285 | true | |
286 | ); | |
287 | | |
288 | try { | |
289 |
1
1. scan : removed call to java/lang/Thread::sleep → NO_COVERAGE |
Thread.sleep(500); |
290 | } catch (InterruptedException e) { | |
291 | | |
292 | LOGGER.log(LogLevelUtil.IGNORE, e, e); | |
293 |
1
1. scan : removed call to java/lang/Thread::interrupt → NO_COVERAGE |
Thread.currentThread().interrupt(); |
294 | } | |
295 | } | |
296 | | |
297 | // Get back the normal view | |
298 |
1
1. scan : removed call to com/jsql/model/InjectionModel::sendToViews → NO_COVERAGE |
MediatorHelper.model().sendToViews(requestUnsubscribe); |
299 |
1
1. scan : removed call to com/jsql/model/InjectionModel::subscribe → NO_COVERAGE |
MediatorHelper.model().subscribe(MediatorHelper.frame().getSubscriber()); |
300 | | |
301 |
1
1. scan : removed call to com/jsql/model/InjectionModel::setIsScanning → NO_COVERAGE |
MediatorHelper.model().setIsScanning(false); |
302 |
1
1. scan : removed call to com/jsql/model/InjectionModel::setIsStoppedByUser → NO_COVERAGE |
MediatorHelper.model().setIsStoppedByUser(false); |
303 |
1
1. scan : removed call to com/jsql/model/accessible/ResourceAccess::setScanStopped → NO_COVERAGE |
MediatorHelper.model().getResourceAccess().setScanStopped(false); |
304 | ||
305 | var request = new Request(); | |
306 |
1
1. scan : removed call to com/jsql/model/bean/util/Request::setMessage → NO_COVERAGE |
request.setMessage(Interaction.END_SCAN); |
307 |
1
1. scan : removed call to com/jsql/model/InjectionModel::sendToViews → NO_COVERAGE |
MediatorHelper.model().sendToViews(request); |
308 | } | |
309 | } | |
Mutations | ||
61 |
1.1 |
|
67 |
1.1 |
|
68 |
1.1 |
|
71 |
1.1 |
|
73 |
1.1 |
|
74 |
1.1 |
|
77 |
1.1 |
|
79 |
1.1 |
|
81 |
1.1 |
|
87 |
1.1 |
|
88 |
1.1 |
|
89 |
1.1 |
|
92 |
1.1 2.2 |
|
93 |
1.1 |
|
95 |
1.1 |
|
100 |
1.1 |
|
101 |
1.1 |
|
102 |
1.1 |
|
103 |
1.1 |
|
105 |
1.1 |
|
113 |
1.1 |
|
114 |
1.1 |
|
116 |
1.1 |
|
123 |
1.1 |
|
125 |
1.1 |
|
132 |
1.1 |
|
146 |
1.1 |
|
158 |
1.1 2.2 |
|
177 |
1.1 |
|
184 |
1.1 |
|
185 |
1.1 |
|
187 |
1.1 |
|
188 |
1.1 |
|
189 |
1.1 |
|
191 |
1.1 |
|
193 |
1.1 |
|
195 |
1.1 |
|
204 |
1.1 |
|
206 |
1.1 |
|
207 |
1.1 |
|
208 |
1.1 |
|
211 |
1.1 2.2 |
|
212 |
1.1 |
|
215 |
1.1 |
|
219 |
1.1 |
|
220 |
1.1 |
|
221 |
1.1 |
|
222 |
1.1 |
|
226 |
1.1 |
|
242 |
1.1 |
|
243 |
1.1 |
|
247 |
1.1 |
|
251 |
1.1 |
|
256 |
1.1 |
|
257 |
1.1 |
|
258 |
1.1 |
|
260 |
1.1 |
|
261 |
1.1 |
|
266 |
1.1 2.2 |
|
274 |
1.1 2.2 |
|
277 |
1.1 |
|
279 |
1.1 |
|
289 |
1.1 |
|
293 |
1.1 |
|
298 |
1.1 |
|
299 |
1.1 |
|
301 |
1.1 |
|
302 |
1.1 |
|
303 |
1.1 |
|
306 |
1.1 |
|
307 |
1.1 |