Blame view

php/classes/AmdaStats.php 12 KB
16035364   Benjamin Renard   First commit
1
2
3
<?php
/**
 * @class AmdaStats
ebe18d0a   Elena.Budnik   new amda stat
4
 * @version  $Id: AmdaStats.php 2964 2015-06-26 07:53:48Z elena $ 
16035364   Benjamin Renard   First commit
5
6
7
 */ 
 
class AmdaStats {
ebe18d0a   Elena.Budnik   new amda stat
8

54d90dbc   Benjamin Renard   Add concurrent ac...
9
10
        public $statsFilePath;
	public $tasks = array('plot', 'mining', 'print', 'statistics');
ea08d095   Benjamin Renard   Add WS requests i...
11
	public $tasksWs = array('ws_print', 'ws_plot');
ebe18d0a   Elena.Budnik   new amda stat
12
	public $tasksAdd = array('ttoper', 'samp', 'upload', 'create', 'images');
ddeb2c40   Benjamin Renard   Do not exlude imp...
13
	public $usersToExclude = array('bouchemit');
ebe18d0a   Elena.Budnik   new amda stat
14
15
	public $success = true;
	private $user = null;
2e7079bb   Benjamin Renard   First implementat...
16
	private $task = array('request'=>'plot','condition'=>'mining', 'download'=>'print','statistic'=>'statistics',
b9c5d84e   Benjamin Renard   Add test for getP...
17
				'getparameter'=>'ws_print', 'getdataset' => 'ws_print', 'getorbites' => 'ws_print', 'getplot' => 'ws_plot');
a4da6a12   Elena.Budnik   temporary commit
18
	
504c431a   Benjamin Renard   Fix AmdaStats
19
	public function __construct($user, $year = NULL) {
54d90dbc   Benjamin Renard   Add concurrent ac...
20
21
22
		if (!is_dir(DATAPATH.'Statistics')) {
			if (!mkdir(DATAPATH.'Statistics', 0775)) $this->success = false; //return -1;
			if (!chgrp(DATAPATH.'Statistics', APACHE_USER)) $this->success = false; // return -1;
ebe18d0a   Elena.Budnik   new amda stat
23
24
		}

504c431a   Benjamin Renard   Fix AmdaStats
25
		$this->statsFilePath = $this->getStatsFilePath($user, $year);
54d90dbc   Benjamin Renard   Add concurrent ac...
26
	}
ebe18d0a   Elena.Budnik   new amda stat
27

54d90dbc   Benjamin Renard   Add concurrent ac...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
	public function addTask($user, $task, $vars) {
		$this->concurrentAccessGuestFile(array($this,'_addTask'),array('user' => $user, 'task' => $task, 'vars' => $vars));
	}

	public function getModulesStat($start, $stop, $update) {
		return $this->concurrentAccessGuestFile(array($this,'_getModulesStat'), array('start' => $start, 'stop' => $stop, 'update' => $update));
	}

	public function mergeXml($year) {
		return $this->concurrentAccessGuestFile(array($this,'_mergeXml'), array('year' => $year));
	}

	public function getDataStat($index, $start, $stop, $update) {
		return $this->concurrentAccessGuestFile(array($this,'_getDataStat'), array('index' => $index, 'start', $start, 'stop' => $stop, 'update' => $update));
	}

	public function mergeStats($inXml) {
		return $this->concurrentAccessGuestFile(array($this,'_mergeStats'), array('inXml' => $inXml));
	}

504c431a   Benjamin Renard   Fix AmdaStats
48
49
50
51
52
	private function getStatsFilePath($user, $year) {
		if (!isset($year))
			$thisYear = date("Y");
		else
			$thisYear = $year;
54d90dbc   Benjamin Renard   Add concurrent ac...
53
54
		if (empty($user)){		
			return DATAPATH."Statistics/Stats$thisYear.xml";
ebe18d0a   Elena.Budnik   new amda stat
55
		}
54d90dbc   Benjamin Renard   Add concurrent ac...
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
		return USERPATH.$user."/Stats$thisYear.xml";
	}

	private function concurrentAccessGuestFile($callback, $options) {
		$lockFile =  $this->statsFilePath.".lockfile";

		$fp = fopen($lockFile, "w+");

		if ($fp === false) {
			return false;
		}

		$res = true;

		if (flock($fp, LOCK_EX))
		{
			$newFile = FALSE;
			if (!file_exists($this->statsFilePath)) {
				$res = $this->_generateXml();
ebe18d0a   Elena.Budnik   new amda stat
75
			}
54d90dbc   Benjamin Renard   Add concurrent ac...
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

			if ($res) {
				$dom = new DomDocument("1.0","UTF-8");
				$dom->preserveWhiteSpace = false;
				$dom->formatOutput = true;
				$res = $dom->load($this->statsFilePath);
				if (!$newFile) {
					// add missing tasks if needed
					$allTasks = array_merge($this->tasks, $this->tasksAdd, $this->tasksWs);
					$newTask = FALSE;
					foreach ($allTasks as $task) {
						$items = $dom->getElementsByTagName($task);
						if ($items->length == 0) {
							//add missing task
							$element = $dom->createElement("$task");
							$dom->documentElement->appendChild($element);
							$newTask = TRUE;
						}
ea08d095   Benjamin Renard   Add WS requests i...
94
					}
54d90dbc   Benjamin Renard   Add concurrent ac...
95
96
97
					if ($newTask) {
						$dom->save($this->statsFilePath);
					}					
ea08d095   Benjamin Renard   Add WS requests i...
98
				}
54d90dbc   Benjamin Renard   Add concurrent ac...
99
100
				if ($res) {
					$func_res = call_user_func($callback,$dom, $options);
ea08d095   Benjamin Renard   Add WS requests i...
101
102
				}
			}
54d90dbc   Benjamin Renard   Add concurrent ac...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
		}
		else
			$res = false;

		fclose($fp);

		if ($res)
			return $func_res;

		return false;
	}

        private function _generateXml() {
		$dom = new DomDocument("1.0","UTF-8");
		$dom->preserveWhiteSpace = false;
		$dom->formatOutput = true;

		$rootElement = $dom->createElement('stats');

		$allTasks = array_merge($this->tasks, $this->tasksAdd, $this->tasksWs);

		foreach ($allTasks as $task) {
			$element = $dom->createElement("$task");
			$rootElement->appendChild($element);
		}

		$dom->appendChild($rootElement);

		return $dom->save($this->statsFilePath);
ea08d095   Benjamin Renard   Add WS requests i...
132
	}
16035364   Benjamin Renard   First commit
133
134
135
136

/*
*  Merge individual User Stats.xml into one generique Stats.xml
*/
54d90dbc   Benjamin Renard   Add concurrent ac...
137
	private function _mergeXml($dom, $options) {
be67b122   Elena.Budnik   stats.xml par yesr
138
139
140
		// long procedure
		ini_set('max_execution_time', 600); 
		
ea08d095   Benjamin Renard   Add WS requests i...
141
		$allTasks = array_merge($this->tasks, $this->tasksAdd, $this->tasksWs);
ebe18d0a   Elena.Budnik   new amda stat
142

ea08d095   Benjamin Renard   Add WS requests i...
143
		$userDoc = new DomDocument("1.0");
54d90dbc   Benjamin Renard   Add concurrent ac...
144
		if ($options['year'] == null) $options['year'] = date("Y");
d3ee926a   Elena.Budnik   users in dataset ...
145

ebe18d0a   Elena.Budnik   new amda stat
146
147
		$users=glob(USERPATH."*");
		foreach ($users as $user) {        
54d90dbc   Benjamin Renard   Add concurrent ac...
148
			$userXmlPath = $user."/Stats".$options['year'].".xml";
ea08d095   Benjamin Renard   Add WS requests i...
149
150
151
152
153
154

			if (!file_exists($userXmlPath)) continue;

			$userDoc->load($userXmlPath);

			foreach ($allTasks as $task) {
54d90dbc   Benjamin Renard   Add concurrent ac...
155
				$globalTaskItems = $dom->getElementsByTagName($task);
ea08d095   Benjamin Renard   Add WS requests i...
156
157
158
159
160
161
162
163
164
165
				if ($globalTaskItems->length == 0)
					continue;
				$globalTaskItem = $globalTaskItems->item(0);
				$userTaskItems = $userDoc->getElementsByTagName($task);
				if ($userTaskItems->length == 0)
					continue;
				$userTaskItem = $userTaskItems->item(0);
				$userItems = $userTaskItem->getElementsByTagName("item");
				if ($userItems->length > 0) {
					foreach ($userItems as $userItem) {
54d90dbc   Benjamin Renard   Add concurrent ac...
166
						$globalItem = $dom->importNode($userItem, true);
ea08d095   Benjamin Renard   Add WS requests i...
167
						$globalTaskItem->appendChild($globalItem);
ebe18d0a   Elena.Budnik   new amda stat
168
169
170
171
172
173
					}
				}          
			}
		}

		// write task statistics as json
54d90dbc   Benjamin Renard   Add concurrent ac...
174
		$this->_getModulesStat($dom, array('start' => null, 'stop' => null, 'update' => TRUE));
ebe18d0a   Elena.Budnik   new amda stat
175
		// write data statistics as json
54d90dbc   Benjamin Renard   Add concurrent ac...
176
		$this->_getDataStat($dom, array('index' => 0, 'start', null, 'stop' => null, 'update' => true));
d3ee926a   Elena.Budnik   users in dataset ...
177
	
54d90dbc   Benjamin Renard   Add concurrent ac...
178
		return  $dom->save($this->statsFilePath);
ebe18d0a   Elena.Budnik   new amda stat
179
180
	}

54d90dbc   Benjamin Renard   Add concurrent ac...
181
182
183
	private function _addTask($dom, $options) {
		if ($options['task'] == 'killplot')
			return FALSE;
a4da6a12   Elena.Budnik   temporary commit
184
			
54d90dbc   Benjamin Renard   Add concurrent ac...
185
186
		if ($options['vars'])
			$realTask = $this->task[$options['task']];
a4da6a12   Elena.Budnik   temporary commit
187
		else
54d90dbc   Benjamin Renard   Add concurrent ac...
188
			$realTask = $options['task'];
fcfa8fa8   Elena.Budnik   donot create task...
189

54d90dbc   Benjamin Renard   Add concurrent ac...
190
191
		if (!in_array($options['user'], $this->usersToExclude)) {
			$taskElementNode = $dom->getElementsByTagName("$realTask");
fcfa8fa8   Elena.Budnik   donot create task...
192
193
194
195

			if ($taskElementNode->length < 1) 
					return; 
					
a4da6a12   Elena.Budnik   temporary commit
196
			$taskElement = $taskElementNode->item(0);
ebe18d0a   Elena.Budnik   new amda stat
197
			if (is_object($taskElement)) {
54d90dbc   Benjamin Renard   Add concurrent ac...
198
				$newTask = $dom->createElement('item');
ebe18d0a   Elena.Budnik   new amda stat
199
				$newTask->setAttribute('date', date('Y-m-d'));
54d90dbc   Benjamin Renard   Add concurrent ac...
200
				$newTask->setAttribute('user', $options['user']);
a4da6a12   Elena.Budnik   temporary commit
201
           
54d90dbc   Benjamin Renard   Add concurrent ac...
202
				if ($options['vars']) { 
a4da6a12   Elena.Budnik   temporary commit
203
204
					$ID = array();

54d90dbc   Benjamin Renard   Add concurrent ac...
205
					foreach ($options['vars'] as $var) {
fcfa8fa8   Elena.Budnik   donot create task...
206
						$ID[] = $var;
ebe18d0a   Elena.Budnik   new amda stat
207
208
209
210
211
					}
						
					$ID = array_unique($ID);

					foreach ($ID as $id) {
54d90dbc   Benjamin Renard   Add concurrent ac...
212
						$datasetElement = $dom->createElement('dataset', $id);
ebe18d0a   Elena.Budnik   new amda stat
213
214
215
						$newTask->appendChild($datasetElement);  
					}         
				}
a4da6a12   Elena.Budnik   temporary commit
216
				
ebe18d0a   Elena.Budnik   new amda stat
217
				$taskElement->appendChild($newTask);
54d90dbc   Benjamin Renard   Add concurrent ac...
218
				return $dom->save($this->statsFilePath);  
ebe18d0a   Elena.Budnik   new amda stat
219
220
			}
			else 
54d90dbc   Benjamin Renard   Add concurrent ac...
221
				error_log('Check Stats.xml - no task element '.$options['task'], 1, email);
ebe18d0a   Elena.Budnik   new amda stat
222
		}
54d90dbc   Benjamin Renard   Add concurrent ac...
223
224

		return FALSE;
ebe18d0a   Elena.Budnik   new amda stat
225
	}
16035364   Benjamin Renard   First commit
226
227
228
229
 
/*
*     Show Statistics
*/
54d90dbc   Benjamin Renard   Add concurrent ac...
230
	private function _getModulesStat($dom, $options){
16035364   Benjamin Renard   First commit
231

54d90dbc   Benjamin Renard   Add concurrent ac...
232
233
		if (!$options['update'] && file_exists(DATAPATH.'Statistics/tasks.json')) {
			return  file_get_contents(DATAPATH.'Statistics/tasks.json');
ebe18d0a   Elena.Budnik   new amda stat
234
235
236
		}
		
		$taskArray = array();
16035364   Benjamin Renard   First commit
237

ea08d095   Benjamin Renard   Add WS requests i...
238
		foreach (array_merge($this->tasks,$this->tasksAdd, $this->tasksWs) as $task) {
54d90dbc   Benjamin Renard   Add concurrent ac...
239
			$taskItems = $dom->getElementsByTagName($task);
ea08d095   Benjamin Renard   Add WS requests i...
240
241
242
			if ($taskItems->length < 1)
				return;
			$theTask = $taskItems->item(0);
ebe18d0a   Elena.Budnik   new amda stat
243
244
			$items = $theTask->getElementsByTagName('item');
			$hints = $items->length;
16035364   Benjamin Renard   First commit
245

54d90dbc   Benjamin Renard   Add concurrent ac...
246
			$startStop = $this->getStartStop($items, $options['start'], $options['stop']);
ea08d095   Benjamin Renard   Add WS requests i...
247
248
249
			
			$taskArray[] = array('task' => $task, 'number' => $hints,
				'start' => $startStop[0], 'stop' => $startStop[1]); 
ebe18d0a   Elena.Budnik   new amda stat
250
		}
aa94fd24   elena   Merge with last svn
251

ebe18d0a   Elena.Budnik   new amda stat
252
		$objToReturn = json_encode(array('stats' => $taskArray));
aa94fd24   elena   Merge with last svn
253

ebe18d0a   Elena.Budnik   new amda stat
254
		file_put_contents(DATAPATH.'Statistics/tasks.json', $objToReturn);
aa94fd24   elena   Merge with last svn
255

ebe18d0a   Elena.Budnik   new amda stat
256
257
		return $objToReturn;
	}
aa94fd24   elena   Merge with last svn
258

ebe18d0a   Elena.Budnik   new amda stat
259
260
261
/*
*     Show Statistics
*/
54d90dbc   Benjamin Renard   Add concurrent ac...
262
	private function _getDataStat($dom, $options){
ebe18d0a   Elena.Budnik   new amda stat
263

54d90dbc   Benjamin Renard   Add concurrent ac...
264
		if (!$options['update'] && file_exists(DATAPATH.'Statistics/data.json')) {
ebe18d0a   Elena.Budnik   new amda stat
265
266
267
268
269
270
271
			$GENERALarray = json_decode(file_get_contents(DATAPATH.'Statistics/data.json'));
		}
		else {
			$VIarray = array();
			$TOTALarray = array();
			$STARTarray = array();
			$STOParray = array();
d3ee926a   Elena.Budnik   users in dataset ...
272
			$usersArray = array();
ebe18d0a   Elena.Budnik   new amda stat
273

ea08d095   Benjamin Renard   Add WS requests i...
274
275
276
			$dataTasks = array_merge($this->tasks, $this->tasksWs);

			foreach ($dataTasks as $task) {
54d90dbc   Benjamin Renard   Add concurrent ac...
277
				$taskItems = $dom->getElementsByTagName($task);
ea08d095   Benjamin Renard   Add WS requests i...
278
279
280
				if ($taskItems->length < 1)
					continue;
				$theTask = $taskItems->item(0);
ebe18d0a   Elena.Budnik   new amda stat
281
282
283
284
285
286
				$items = $theTask->getElementsByTagName('item');
				$TASKarray = array();
		
				foreach ($items as $item){
					$VIs = $item->getElementsByTagName('dataset');
					$time = strtotime($item->getAttribute('date'));
d3ee926a   Elena.Budnik   users in dataset ...
287
288
					$user = $item->getAttribute('user');
					
ebe18d0a   Elena.Budnik   new amda stat
289
290
291
					foreach ($VIs as $VI) {
						$id = $VI->nodeValue;
						if ($id) {
54d90dbc   Benjamin Renard   Add concurrent ac...
292
293
294
295
296
297
							if (!in_array($id, $usersArray)) {
								$usersArray[$id] = array();
							}
							if (!in_array($user, $usersArray[$id])) {
								$usersArray[$id][$user] = 0;
							}
d3ee926a   Elena.Budnik   users in dataset ...
298
299
							$usersArray[$id][$user]++;

54d90dbc   Benjamin Renard   Add concurrent ac...
300
							if (array_key_exists($id, $TASKarray)) {
ebe18d0a   Elena.Budnik   new amda stat
301
302
303
304
305
306
307
308
								$TASKarray[$id]++;
								$TOTALarray[$id]++;
								if ($STARTarray[$id] > $time) 
											$STARTarray[$id] = $time;
								if ($STOParray[$id] < $time) 
											$STOParray[$id] = $time;
							}
							else {
54d90dbc   Benjamin Renard   Add concurrent ac...
309
								if (!array_key_exists($id,$TOTALarray)) { 
ebe18d0a   Elena.Budnik   new amda stat
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
									$STARTarray[$id] = $time;
									$STOParray[$id] = $time;
									$TOTALarray[$id] = 1;
								} 
								else {
									if ($STARTarray[$id] > $time) 
													$STARTarray[$id] = $time;
									if ($STOParray[$id] < $time) 
													$STOParray[$id] = $time;
									$TOTALarray[$id]++;
								}
								$TASKarray[$id] = 1;
							}            
						}                     
					}
				}
				$VIarray[$task] = $TASKarray;
			}
d3ee926a   Elena.Budnik   users in dataset ...
328

ebe18d0a   Elena.Budnik   new amda stat
329
330
			$GENERALarray = array();
			arsort($TOTALarray);
e566b28b   Elena.Budnik   add percent
331
332
333
			
			$Ntotal = 0; 
           
ebe18d0a   Elena.Budnik   new amda stat
334
335
336
			foreach ($TOTALarray as $key => $value) {
				$viStart = $STARTarray[$key];
				$viStop = $STOParray[$key];
54d90dbc   Benjamin Renard   Add concurrent ac...
337
338
339
340
341
342
				$plot = (empty($VIarray['plot']) || empty($VIarray['plot'][$key])) ? 0 : $VIarray['plot'][$key];
				$mining = (empty($VIarray['mining']) || empty($VIarray['mining'][$key])) ? 0 : $VIarray['mining'][$key];
				$print = (empty($VIarray['print']) || empty($VIarray['print'][$key])) ? 0 : $VIarray['print'][$key];
				$stat = (empty($VIarray['statistics']) || empty($VIarray['statistics'][$key])) ? 0 : $VIarray['statistics'][$key];
				$ws_print = (empty($VIarray['ws_print']) || empty($VIarray['ws_print'][$key])) ? 0 : $VIarray['ws_print'][$key];
				$ws_plot = (empty($VIarray['ws_plot']) || empty($VIarray['ws_plot'][$key])) ? 0 : $VIarray['ws_plot'][$key];
d3ee926a   Elena.Budnik   users in dataset ...
343
344
				$uniqueUsers = count($usersArray[$key]);
				
ebe18d0a   Elena.Budnik   new amda stat
345
346
				if ($key != 'undefined') 
				{
e566b28b   Elena.Budnik   add percent
347
					$GENERALarray[] = array('id' => $key, 'number' => $value, 'percent' => $value,
ebe18d0a   Elena.Budnik   new amda stat
348
												'plot' => $plot, 'mining' => $mining, 
54d90dbc   Benjamin Renard   Add concurrent ac...
349
350
												'print' => $print,'statistics' => $stat,
												'ws_print' => $ws_print, 'ws_plot' => $ws_plot,
d3ee926a   Elena.Budnik   users in dataset ...
351
												'start' => $viStart, 'stop' => $viStop, 'unique' => $uniqueUsers);
e566b28b   Elena.Budnik   add percent
352
353
												
					$Ntotal += $value;							
ebe18d0a   Elena.Budnik   new amda stat
354
				}
e566b28b   Elena.Budnik   add percent
355
356
357
			}
			
			$Ntotal /= 100;
ebe18d0a   Elena.Budnik   new amda stat
358

e566b28b   Elena.Budnik   add percent
359
360
361
362
363
364
			foreach ($GENERALarray as &$elem) {
						$elem['percent'] = round($elem['percent'] / $Ntotal, 2);
			}
			
		}
 
ebe18d0a   Elena.Budnik   new amda stat
365
		$Nmax = count($GENERALarray);
16035364   Benjamin Renard   First commit
366
 
54d90dbc   Benjamin Renard   Add concurrent ac...
367
368
		$length = $options['index'] + 20 > $Nmax ? $Nmax - $options['index'] + 1 : 20;
		$objToReturn = array('stats' => array_reverse(array_slice($GENERALarray, $options['index'], $length)));
ebe18d0a   Elena.Budnik   new amda stat
369
370
		
		file_put_contents(DATAPATH.'Statistics/data.json',json_encode($GENERALarray)); 
e566b28b   Elena.Budnik   add percent
371
		
ebe18d0a   Elena.Budnik   new amda stat
372
373
374
375
376
377
378
379
380
		//  $objToReturn = array('stats' => $GENERALarray);
		return $objToReturn;
	}

	public function getStartStop($items, $start, $stop) {
		if (!$start) $start = 0;
		if (!$stop) $stop = 100000000000;
		
		$date = array();
ebe18d0a   Elena.Budnik   new amda stat
381

ea08d095   Benjamin Renard   Add WS requests i...
382
383
384
385
386
387
388
389
390
391
		if ($items->length < 1) {
			return array(0, 0);
		}
		else {
			foreach ($items as $item) {
				$newDate = strtotime($item->getAttribute('date'));

				if (($newDate > $start) && ($newDate < $stop))
					$date[] =  $newDate;        
			}
ebe18d0a   Elena.Budnik   new amda stat
392
393
394
395
396
		}

		return array(min($date), max($date));
	}

54d90dbc   Benjamin Renard   Add concurrent ac...
397
	private function _mergeStats($dom, $options) {
ebe18d0a   Elena.Budnik   new amda stat
398

54d90dbc   Benjamin Renard   Add concurrent ac...
399
		if (!file_exists($options['inXml'])) return 0;
ebe18d0a   Elena.Budnik   new amda stat
400

ea08d095   Benjamin Renard   Add WS requests i...
401
		$tags = array_merge($this->tasks,$this->tasksAdd, $this->tasksWs);
ebe18d0a   Elena.Budnik   new amda stat
402

ebe18d0a   Elena.Budnik   new amda stat
403
404
		$doc2 = new DomDocument("1.0");

54d90dbc   Benjamin Renard   Add concurrent ac...
405
		if (!$doc2->load($options['inXml'])) return 0;
ebe18d0a   Elena.Budnik   new amda stat
406
407

		foreach ($tags as $tag){
54d90dbc   Benjamin Renard   Add concurrent ac...
408
			$tag1 = $dom->getElementsByTagName($tag)->item(0);
ebe18d0a   Elena.Budnik   new amda stat
409
410
411
412
			$tag2 = $doc2->getElementsByTagName($tag)->item(0);
			$items2 = $tag2->getElementsByTagName("item");
			if ($items2->length > 0) {
				foreach ($items2 as $item2) {
54d90dbc   Benjamin Renard   Add concurrent ac...
413
					$item1 = $dom->importNode($item2, true);
ebe18d0a   Elena.Budnik   new amda stat
414
415
416
417
418
					$tag1->appendChild($item1);
				}
			}
		}

54d90dbc   Benjamin Renard   Add concurrent ac...
419
		return $dom->save($this->statsFilePath);
ebe18d0a   Elena.Budnik   new amda stat
420
	} 
16035364   Benjamin Renard   First commit
421
422
}
?>