1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAVACL; 4*a1a3b679SAndreas Boehler 5*a1a3b679SAndreas Boehleruse Sabre\DAV; 6*a1a3b679SAndreas Boehleruse Sabre\HTTP; 7*a1a3b679SAndreas Boehler 8*a1a3b679SAndreas Boehlerrequire_once 'Sabre/HTTP/ResponseMock.php'; 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas Boehlerclass ExpandPropertiesTest extends \PHPUnit_Framework_TestCase { 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas Boehler function getServer() { 13*a1a3b679SAndreas Boehler 14*a1a3b679SAndreas Boehler $tree = array( 15*a1a3b679SAndreas Boehler new DAV\Mock\PropertiesCollection('node1', [], array( 16*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}simple' => 'foo', 17*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}href' => new DAV\Xml\Property\Href('node2'), 18*a1a3b679SAndreas Boehler '{DAV:}displayname' => 'Node 1', 19*a1a3b679SAndreas Boehler )), 20*a1a3b679SAndreas Boehler new DAV\Mock\PropertiesCollection('node2', [], array( 21*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}simple' => 'simple', 22*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}hreflist' => new DAV\Xml\Property\Href(['node1','node3']), 23*a1a3b679SAndreas Boehler '{DAV:}displayname' => 'Node 2', 24*a1a3b679SAndreas Boehler )), 25*a1a3b679SAndreas Boehler new DAV\Mock\PropertiesCollection('node3', [], array( 26*a1a3b679SAndreas Boehler '{http://sabredav.org/ns}simple' => 'simple', 27*a1a3b679SAndreas Boehler '{DAV:}displayname' => 'Node 3', 28*a1a3b679SAndreas Boehler )), 29*a1a3b679SAndreas Boehler ); 30*a1a3b679SAndreas Boehler 31*a1a3b679SAndreas Boehler $fakeServer = new DAV\Server($tree); 32*a1a3b679SAndreas Boehler $fakeServer->sapi = new HTTP\SapiMock(); 33*a1a3b679SAndreas Boehler $fakeServer->debugExceptions = true; 34*a1a3b679SAndreas Boehler $fakeServer->httpResponse = new HTTP\ResponseMock(); 35*a1a3b679SAndreas Boehler $plugin = new Plugin(); 36*a1a3b679SAndreas Boehler $plugin->allowAccessToNodesWithoutACL = true; 37*a1a3b679SAndreas Boehler 38*a1a3b679SAndreas Boehler $this->assertTrue($plugin instanceof Plugin); 39*a1a3b679SAndreas Boehler $fakeServer->addPlugin($plugin); 40*a1a3b679SAndreas Boehler $this->assertEquals($plugin, $fakeServer->getPlugin('acl')); 41*a1a3b679SAndreas Boehler 42*a1a3b679SAndreas Boehler return $fakeServer; 43*a1a3b679SAndreas Boehler 44*a1a3b679SAndreas Boehler } 45*a1a3b679SAndreas Boehler 46*a1a3b679SAndreas Boehler function testSimple() { 47*a1a3b679SAndreas Boehler 48*a1a3b679SAndreas Boehler $xml = '<?xml version="1.0"?> 49*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:"> 50*a1a3b679SAndreas Boehler <d:property name="displayname" /> 51*a1a3b679SAndreas Boehler <d:property name="foo" namespace="http://www.sabredav.org/NS/2010/nonexistant" /> 52*a1a3b679SAndreas Boehler <d:property name="simple" namespace="http://sabredav.org/ns" /> 53*a1a3b679SAndreas Boehler <d:property name="href" namespace="http://sabredav.org/ns" /> 54*a1a3b679SAndreas Boehler</d:expand-property>'; 55*a1a3b679SAndreas Boehler 56*a1a3b679SAndreas Boehler $serverVars = array( 57*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'REPORT', 58*a1a3b679SAndreas Boehler 'HTTP_DEPTH' => '0', 59*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/node1', 60*a1a3b679SAndreas Boehler ); 61*a1a3b679SAndreas Boehler 62*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 63*a1a3b679SAndreas Boehler $request->setBody($xml); 64*a1a3b679SAndreas Boehler 65*a1a3b679SAndreas Boehler $server = $this->getServer(); 66*a1a3b679SAndreas Boehler $server->httpRequest = $request; 67*a1a3b679SAndreas Boehler 68*a1a3b679SAndreas Boehler $server->exec(); 69*a1a3b679SAndreas Boehler 70*a1a3b679SAndreas Boehler $this->assertEquals(207, $server->httpResponse->status,'Incorrect status code received. Full body: ' . $server->httpResponse->body); 71*a1a3b679SAndreas Boehler $this->assertEquals(array( 72*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [DAV\Version::VERSION], 73*a1a3b679SAndreas Boehler 'Content-Type' => ['application/xml; charset=utf-8'], 74*a1a3b679SAndreas Boehler ), $server->httpResponse->getHeaders()); 75*a1a3b679SAndreas Boehler 76*a1a3b679SAndreas Boehler 77*a1a3b679SAndreas Boehler $check = array( 78*a1a3b679SAndreas Boehler '/d:multistatus', 79*a1a3b679SAndreas Boehler '/d:multistatus/d:response' => 1, 80*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:href' => 1, 81*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat' => 2, 82*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop' => 2, 83*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/d:displayname' => 1, 84*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:simple' => 1, 85*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1, 86*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:href' => 1, 87*a1a3b679SAndreas Boehler ); 88*a1a3b679SAndreas Boehler 89*a1a3b679SAndreas Boehler $xml = simplexml_load_string($server->httpResponse->body); 90*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('d','DAV:'); 91*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('s','http://sabredav.org/ns'); 92*a1a3b679SAndreas Boehler foreach($check as $v1=>$v2) { 93*a1a3b679SAndreas Boehler 94*a1a3b679SAndreas Boehler $xpath = is_int($v1)?$v2:$v1; 95*a1a3b679SAndreas Boehler 96*a1a3b679SAndreas Boehler $result = $xml->xpath($xpath); 97*a1a3b679SAndreas Boehler 98*a1a3b679SAndreas Boehler $count = 1; 99*a1a3b679SAndreas Boehler if (!is_int($v1)) $count = $v2; 100*a1a3b679SAndreas Boehler 101*a1a3b679SAndreas Boehler $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response: ' . $server->httpResponse->body); 102*a1a3b679SAndreas Boehler 103*a1a3b679SAndreas Boehler } 104*a1a3b679SAndreas Boehler 105*a1a3b679SAndreas Boehler } 106*a1a3b679SAndreas Boehler 107*a1a3b679SAndreas Boehler /** 108*a1a3b679SAndreas Boehler * @depends testSimple 109*a1a3b679SAndreas Boehler */ 110*a1a3b679SAndreas Boehler function testExpand() { 111*a1a3b679SAndreas Boehler 112*a1a3b679SAndreas Boehler $xml = '<?xml version="1.0"?> 113*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:"> 114*a1a3b679SAndreas Boehler <d:property name="href" namespace="http://sabredav.org/ns"> 115*a1a3b679SAndreas Boehler <d:property name="displayname" /> 116*a1a3b679SAndreas Boehler </d:property> 117*a1a3b679SAndreas Boehler</d:expand-property>'; 118*a1a3b679SAndreas Boehler 119*a1a3b679SAndreas Boehler $serverVars = array( 120*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'REPORT', 121*a1a3b679SAndreas Boehler 'HTTP_DEPTH' => '0', 122*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/node1', 123*a1a3b679SAndreas Boehler ); 124*a1a3b679SAndreas Boehler 125*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 126*a1a3b679SAndreas Boehler $request->setBody($xml); 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas Boehler $server = $this->getServer(); 129*a1a3b679SAndreas Boehler $server->httpRequest = $request; 130*a1a3b679SAndreas Boehler 131*a1a3b679SAndreas Boehler $server->exec(); 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler $this->assertEquals(207, $server->httpResponse->status, 'Incorrect response status received. Full response body: ' . $server->httpResponse->body); 134*a1a3b679SAndreas Boehler $this->assertEquals(array( 135*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [DAV\Version::VERSION], 136*a1a3b679SAndreas Boehler 'Content-Type' => ['application/xml; charset=utf-8'], 137*a1a3b679SAndreas Boehler ), $server->httpResponse->getHeaders()); 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler 140*a1a3b679SAndreas Boehler $check = array( 141*a1a3b679SAndreas Boehler '/d:multistatus', 142*a1a3b679SAndreas Boehler '/d:multistatus/d:response' => 1, 143*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:href' => 1, 144*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat' => 1, 145*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop' => 1, 146*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1, 147*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response' => 1, 148*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1, 149*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1, 150*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1, 151*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1, 152*a1a3b679SAndreas Boehler ); 153*a1a3b679SAndreas Boehler 154*a1a3b679SAndreas Boehler $xml = simplexml_load_string($server->httpResponse->body); 155*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('d','DAV:'); 156*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('s','http://sabredav.org/ns'); 157*a1a3b679SAndreas Boehler foreach($check as $v1=>$v2) { 158*a1a3b679SAndreas Boehler 159*a1a3b679SAndreas Boehler $xpath = is_int($v1)?$v2:$v1; 160*a1a3b679SAndreas Boehler 161*a1a3b679SAndreas Boehler $result = $xml->xpath($xpath); 162*a1a3b679SAndreas Boehler 163*a1a3b679SAndreas Boehler $count = 1; 164*a1a3b679SAndreas Boehler if (!is_int($v1)) $count = $v2; 165*a1a3b679SAndreas Boehler 166*a1a3b679SAndreas Boehler $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . ' Full response body: ' . $server->httpResponse->getBodyAsString()); 167*a1a3b679SAndreas Boehler 168*a1a3b679SAndreas Boehler } 169*a1a3b679SAndreas Boehler 170*a1a3b679SAndreas Boehler } 171*a1a3b679SAndreas Boehler 172*a1a3b679SAndreas Boehler /** 173*a1a3b679SAndreas Boehler * @depends testSimple 174*a1a3b679SAndreas Boehler */ 175*a1a3b679SAndreas Boehler function testExpandHrefList() { 176*a1a3b679SAndreas Boehler 177*a1a3b679SAndreas Boehler $xml = '<?xml version="1.0"?> 178*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:"> 179*a1a3b679SAndreas Boehler <d:property name="hreflist" namespace="http://sabredav.org/ns"> 180*a1a3b679SAndreas Boehler <d:property name="displayname" /> 181*a1a3b679SAndreas Boehler </d:property> 182*a1a3b679SAndreas Boehler</d:expand-property>'; 183*a1a3b679SAndreas Boehler 184*a1a3b679SAndreas Boehler $serverVars = array( 185*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'REPORT', 186*a1a3b679SAndreas Boehler 'HTTP_DEPTH' => '0', 187*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/node2', 188*a1a3b679SAndreas Boehler ); 189*a1a3b679SAndreas Boehler 190*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 191*a1a3b679SAndreas Boehler $request->setBody($xml); 192*a1a3b679SAndreas Boehler 193*a1a3b679SAndreas Boehler $server = $this->getServer(); 194*a1a3b679SAndreas Boehler $server->httpRequest = $request; 195*a1a3b679SAndreas Boehler 196*a1a3b679SAndreas Boehler $server->exec(); 197*a1a3b679SAndreas Boehler 198*a1a3b679SAndreas Boehler $this->assertEquals(207, $server->httpResponse->status); 199*a1a3b679SAndreas Boehler $this->assertEquals(array( 200*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [DAV\Version::VERSION], 201*a1a3b679SAndreas Boehler 'Content-Type' => ['application/xml; charset=utf-8'], 202*a1a3b679SAndreas Boehler ), $server->httpResponse->getHeaders()); 203*a1a3b679SAndreas Boehler 204*a1a3b679SAndreas Boehler 205*a1a3b679SAndreas Boehler $check = array( 206*a1a3b679SAndreas Boehler '/d:multistatus', 207*a1a3b679SAndreas Boehler '/d:multistatus/d:response' => 1, 208*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:href' => 1, 209*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat' => 1, 210*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop' => 1, 211*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1, 212*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2, 213*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2, 214*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 2, 215*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 2, 216*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2, 217*a1a3b679SAndreas Boehler ); 218*a1a3b679SAndreas Boehler 219*a1a3b679SAndreas Boehler $xml = simplexml_load_string($server->httpResponse->body); 220*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('d','DAV:'); 221*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('s','http://sabredav.org/ns'); 222*a1a3b679SAndreas Boehler foreach($check as $v1=>$v2) { 223*a1a3b679SAndreas Boehler 224*a1a3b679SAndreas Boehler $xpath = is_int($v1)?$v2:$v1; 225*a1a3b679SAndreas Boehler 226*a1a3b679SAndreas Boehler $result = $xml->xpath($xpath); 227*a1a3b679SAndreas Boehler 228*a1a3b679SAndreas Boehler $count = 1; 229*a1a3b679SAndreas Boehler if (!is_int($v1)) $count = $v2; 230*a1a3b679SAndreas Boehler 231*a1a3b679SAndreas Boehler $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result)); 232*a1a3b679SAndreas Boehler 233*a1a3b679SAndreas Boehler } 234*a1a3b679SAndreas Boehler 235*a1a3b679SAndreas Boehler } 236*a1a3b679SAndreas Boehler 237*a1a3b679SAndreas Boehler /** 238*a1a3b679SAndreas Boehler * @depends testExpand 239*a1a3b679SAndreas Boehler */ 240*a1a3b679SAndreas Boehler function testExpandDeep() { 241*a1a3b679SAndreas Boehler 242*a1a3b679SAndreas Boehler $xml = '<?xml version="1.0"?> 243*a1a3b679SAndreas Boehler<d:expand-property xmlns:d="DAV:"> 244*a1a3b679SAndreas Boehler <d:property name="hreflist" namespace="http://sabredav.org/ns"> 245*a1a3b679SAndreas Boehler <d:property name="href" namespace="http://sabredav.org/ns"> 246*a1a3b679SAndreas Boehler <d:property name="displayname" /> 247*a1a3b679SAndreas Boehler </d:property> 248*a1a3b679SAndreas Boehler <d:property name="displayname" /> 249*a1a3b679SAndreas Boehler </d:property> 250*a1a3b679SAndreas Boehler</d:expand-property>'; 251*a1a3b679SAndreas Boehler 252*a1a3b679SAndreas Boehler $serverVars = array( 253*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'REPORT', 254*a1a3b679SAndreas Boehler 'HTTP_DEPTH' => '0', 255*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/node2', 256*a1a3b679SAndreas Boehler ); 257*a1a3b679SAndreas Boehler 258*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 259*a1a3b679SAndreas Boehler $request->setBody($xml); 260*a1a3b679SAndreas Boehler 261*a1a3b679SAndreas Boehler $server = $this->getServer(); 262*a1a3b679SAndreas Boehler $server->httpRequest = $request; 263*a1a3b679SAndreas Boehler 264*a1a3b679SAndreas Boehler $server->exec(); 265*a1a3b679SAndreas Boehler 266*a1a3b679SAndreas Boehler $this->assertEquals(207, $server->httpResponse->status); 267*a1a3b679SAndreas Boehler $this->assertEquals(array( 268*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [DAV\Version::VERSION], 269*a1a3b679SAndreas Boehler 'Content-Type' => ['application/xml; charset=utf-8'], 270*a1a3b679SAndreas Boehler ), $server->httpResponse->getHeaders()); 271*a1a3b679SAndreas Boehler 272*a1a3b679SAndreas Boehler 273*a1a3b679SAndreas Boehler $check = array( 274*a1a3b679SAndreas Boehler '/d:multistatus', 275*a1a3b679SAndreas Boehler '/d:multistatus/d:response' => 1, 276*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:href' => 1, 277*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat' => 1, 278*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop' => 1, 279*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1, 280*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2, 281*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2, 282*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 3, 283*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 3, 284*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2, 285*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href' => 2, 286*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response' => 1, 287*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1, 288*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1, 289*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1, 290*a1a3b679SAndreas Boehler '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1, 291*a1a3b679SAndreas Boehler ); 292*a1a3b679SAndreas Boehler 293*a1a3b679SAndreas Boehler $xml = simplexml_load_string($server->httpResponse->body); 294*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('d','DAV:'); 295*a1a3b679SAndreas Boehler $xml->registerXPathNamespace('s','http://sabredav.org/ns'); 296*a1a3b679SAndreas Boehler foreach($check as $v1=>$v2) { 297*a1a3b679SAndreas Boehler 298*a1a3b679SAndreas Boehler $xpath = is_int($v1)?$v2:$v1; 299*a1a3b679SAndreas Boehler 300*a1a3b679SAndreas Boehler $result = $xml->xpath($xpath); 301*a1a3b679SAndreas Boehler 302*a1a3b679SAndreas Boehler $count = 1; 303*a1a3b679SAndreas Boehler if (!is_int($v1)) $count = $v2; 304*a1a3b679SAndreas Boehler 305*a1a3b679SAndreas Boehler $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result)); 306*a1a3b679SAndreas Boehler 307*a1a3b679SAndreas Boehler } 308*a1a3b679SAndreas Boehler 309*a1a3b679SAndreas Boehler } 310*a1a3b679SAndreas Boehler} 311