1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace LightSaml\Tests\Functional\Bridge\Pimple; |
4
|
|
|
|
5
|
|
|
use LightSaml\Bridge\Pimple\Container\BuildContainer; |
6
|
|
|
use LightSaml\Bridge\Pimple\Container\PartyContainer; |
7
|
|
|
use LightSaml\Bridge\Pimple\Container\StoreContainer; |
8
|
|
|
use LightSaml\Bridge\Pimple\Container\SystemContainer; |
9
|
|
|
use LightSaml\ClaimTypes; |
10
|
|
|
use LightSaml\Helper; |
11
|
|
|
use LightSaml\Model\Protocol\Response; |
12
|
|
|
use LightSaml\Provider\TimeProvider\TimeProviderInterface; |
13
|
|
|
use LightSaml\SamlConstants; |
14
|
|
|
use LightSaml\State\Request\RequestState; |
15
|
|
|
use LightSaml\Store\Request\RequestStateArrayStore; |
16
|
|
|
use LightSaml\Tests\BaseTestCase; |
17
|
|
|
use LightSaml\Tests\Fixtures\Meta\TimeProviderMock; |
18
|
|
|
use Pimple\Container; |
19
|
|
|
use Symfony\Component\DomCrawler\Crawler; |
20
|
|
|
use Symfony\Component\HttpFoundation\Request; |
21
|
|
|
|
22
|
|
|
class ProfileTest extends BaseTestCase |
23
|
|
|
{ |
24
|
|
|
const OWN_ENTITY_ID = 'https://localhost/lightSAML/lightSAML'; |
25
|
|
|
|
26
|
|
|
public function test_idp_stores() |
27
|
|
|
{ |
28
|
|
|
$buildContainer = $this->getBuildContainer(); |
29
|
|
|
$allIdpEntityDescriptors = $buildContainer->getPartyContainer()->getIdpEntityDescriptorStore()->all(); |
30
|
|
|
|
31
|
|
|
$this->assertCount(4, $allIdpEntityDescriptors); |
|
|
|
|
32
|
|
|
$this->assertEquals('https://idp.testshib.org/idp/shibboleth', $allIdpEntityDescriptors[0]->getEntityID()); |
33
|
|
|
$this->assertEquals('https://sp.testshib.org/shibboleth-sp', $allIdpEntityDescriptors[1]->getEntityID()); |
34
|
|
|
$this->assertEquals('https://localhost/lightSAML/lightSAML-IDP', $allIdpEntityDescriptors[2]->getEntityID()); |
35
|
|
|
$this->assertEquals('https://openidp.feide.no', $allIdpEntityDescriptors[3]->getEntityID()); |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
public function test_metadata_profile() |
39
|
|
|
{ |
40
|
|
|
$buildContainer = $this->getBuildContainer(); |
41
|
|
|
|
42
|
|
|
$builder = new \LightSaml\Builder\Profile\Metadata\MetadataProfileBuilder($buildContainer); |
43
|
|
|
|
44
|
|
|
$context = $builder->buildContext(); |
45
|
|
|
$action = $builder->buildAction(); |
46
|
|
|
|
47
|
|
|
$action->execute($context); |
48
|
|
|
|
49
|
|
|
$this->assertNotNull($context->getHttpResponseContext()->getResponse()); |
50
|
|
|
$xml = $context->getHttpResponseContext()->getResponse()->getContent(); |
51
|
|
|
|
52
|
|
|
$root = new \SimpleXMLElement($xml); |
53
|
|
|
|
54
|
|
|
$this->assertEquals('EntityDescriptor', $root->getName()); |
55
|
|
|
$this->assertEquals('SPSSODescriptor', $root->SPSSODescriptor->getName()); |
56
|
|
|
$this->assertEquals('https://localhost/lightsaml/lightSAML/web/sp/acs.php', $root->SPSSODescriptor->AssertionConsumerService['Location']); |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
public function test_send_authn_request_profile() |
60
|
|
|
{ |
61
|
|
|
$buildContainer = $this->getBuildContainer(); |
62
|
|
|
|
63
|
|
|
$idpEntityId = 'https://localhost/lightSAML/lightSAML-IDP'; |
64
|
|
|
|
65
|
|
|
$builder = new \LightSaml\Builder\Profile\WebBrowserSso\Sp\SsoSpSendAuthnRequestProfileBuilder($buildContainer, $idpEntityId); |
66
|
|
|
$context = $builder->buildContext(); |
67
|
|
|
$action = $builder->buildAction(); |
68
|
|
|
|
69
|
|
|
$action->execute($context); |
70
|
|
|
|
71
|
|
|
$html = $context->getHttpResponseContext()->getResponse()->getContent(); |
72
|
|
|
|
73
|
|
|
$crawler = new Crawler($html); |
74
|
|
|
|
75
|
|
|
$code = $crawler->filter('body form input[name="SAMLRequest"]')->first()->attr('value'); |
76
|
|
|
$xml = base64_decode($code); |
77
|
|
|
|
78
|
|
|
$root = new \SimpleXMLElement($xml); |
79
|
|
|
$root->registerXPathNamespace('saml', SamlConstants::NS_ASSERTION); |
80
|
|
|
$this->assertEquals('AuthnRequest', $root->getName()); |
81
|
|
|
$this->assertEquals(self::OWN_ENTITY_ID, (string) $root->children('saml', true)->Issuer); |
82
|
|
|
$this->assertEquals('https://localhost/lightsaml/lightSAML-IDP/web/idp/login.php', $root['Destination']); |
83
|
|
|
$this->assertEquals('Signature', $root->children('ds', true)->Signature->getName()); |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
public function test_receive_response_profile() |
87
|
|
|
{ |
88
|
|
|
$buildContainer = $this->getBuildContainer( |
89
|
|
|
'_1db06e4f91d3997b7ed3285a59f77028071db2dc5f', |
90
|
|
|
new TimeProviderMock( |
91
|
|
|
new \DateTime('@'.Helper::parseSAMLTime('2015-11-22T15:37:14Z'), new \DateTimeZone('UTC')) |
92
|
|
|
) |
93
|
|
|
); |
94
|
|
|
|
95
|
|
|
$builder = new \LightSaml\Builder\Profile\WebBrowserSso\Sp\SsoSpReceiveResponseProfileBuilder($buildContainer); |
96
|
|
|
|
97
|
|
|
$context = $builder->buildContext(); |
98
|
|
|
$action = $builder->buildAction(); |
99
|
|
|
|
100
|
|
|
$request = Request::create('https://localhost/lightsaml/lightSAML/web/sp/acs.php', 'POST', ['SAMLResponse' => $this->getSamlResponseCode()]); |
101
|
|
|
$context->getHttpRequestContext()->setRequest($request); |
102
|
|
|
|
103
|
|
|
$action->execute($context); |
104
|
|
|
|
105
|
|
|
/** @var Response $response */ |
106
|
|
|
$response = $context->getInboundMessage(); |
107
|
|
|
$this->assertInstanceOf(Response::class, $response); |
108
|
|
|
$this->assertCount(1, $response->getAllAssertions()); |
|
|
|
|
109
|
|
|
$this->assertEquals('[email protected]', $response->getFirstAssertion()->getFirstAttributeStatement() |
110
|
|
|
->getFirstAttributeByName(ClaimTypes::EMAIL_ADDRESS)->getFirstAttributeValue()); |
111
|
|
|
} |
112
|
|
|
|
113
|
|
|
public function test_attribute_value_provider_throws_exception() |
114
|
|
|
{ |
115
|
|
|
$this->expectExceptionMessage("Attribute value provider not set"); |
116
|
|
|
$this->expectException(\LightSaml\Error\LightSamlBuildException::class); |
117
|
|
|
$buildContainer = $this->getBuildContainer(); |
118
|
|
|
$buildContainer->getProviderContainer()->getAttributeValueProvider(); |
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
public function test_session_info_provider_throws_exception() |
122
|
|
|
{ |
123
|
|
|
$this->expectExceptionMessage("Session info provider not set"); |
124
|
|
|
$this->expectException(\LightSaml\Error\LightSamlBuildException::class); |
125
|
|
|
$buildContainer = $this->getBuildContainer(); |
126
|
|
|
$buildContainer->getProviderContainer()->getSessionInfoProvider(); |
127
|
|
|
} |
128
|
|
|
|
129
|
|
|
public function test_name_id_provider_throws_exception() |
130
|
|
|
{ |
131
|
|
|
$this->expectExceptionMessage("Name ID provider not set"); |
132
|
|
|
$this->expectException(\LightSaml\Error\LightSamlBuildException::class); |
133
|
|
|
$buildContainer = $this->getBuildContainer(); |
134
|
|
|
$buildContainer->getProviderContainer()->getNameIdProvider(); |
135
|
|
|
} |
136
|
|
|
|
137
|
|
|
public function test_session() |
138
|
|
|
{ |
139
|
|
|
$buildContainer = $this->getBuildContainer(); |
140
|
|
|
$this->assertInstanceOf(\Symfony\Component\HttpFoundation\Session\Session::class, $buildContainer->getSystemContainer()->getSession()); |
141
|
|
|
} |
142
|
|
|
|
143
|
|
View Code Duplication |
public function test_idp_entity_descriptor() |
|
|
|
|
144
|
|
|
{ |
145
|
|
|
$pimple = new Container(); |
146
|
|
|
$pimple->register(new \LightSaml\Bridge\Pimple\Container\Factory\PartyContainerProvider()); |
147
|
|
|
$buildContainer = new BuildContainer($pimple); |
148
|
|
|
|
149
|
|
|
$this->assertInstanceOf(\LightSaml\Store\EntityDescriptor\EntityDescriptorStoreInterface::class, $buildContainer->getPartyContainer()->getIdpEntityDescriptorStore()); |
150
|
|
|
} |
151
|
|
|
|
152
|
|
View Code Duplication |
public function test_sp_entity_descriptor() |
|
|
|
|
153
|
|
|
{ |
154
|
|
|
$pimple = new Container(); |
155
|
|
|
$pimple->register(new \LightSaml\Bridge\Pimple\Container\Factory\PartyContainerProvider()); |
156
|
|
|
$buildContainer = new BuildContainer($pimple); |
157
|
|
|
|
158
|
|
|
$this->assertInstanceOf(\LightSaml\Store\EntityDescriptor\EntityDescriptorStoreInterface::class, $buildContainer->getPartyContainer()->getSpEntityDescriptorStore()); |
159
|
|
|
} |
160
|
|
|
|
161
|
|
|
private function getBuildContainer($inResponseTo = null, TimeProviderInterface $timeProvider = null) |
162
|
|
|
{ |
163
|
|
|
$buildContainer = new BuildContainer($pimple = new Container()); |
164
|
|
|
|
165
|
|
|
// OWN |
166
|
|
|
$ownCredential = new \LightSaml\Credential\X509Credential( |
167
|
|
|
\LightSaml\Credential\X509Certificate::fromFile(__DIR__.'/../../../../../../web/sp/saml.crt'), |
168
|
|
|
\LightSaml\Credential\KeyHelper::createPrivateKey(__DIR__.'/../../../../../../web/sp/saml.key', null, true) |
169
|
|
|
); |
170
|
|
|
$ownCredential->setEntityId(self::OWN_ENTITY_ID); |
171
|
|
|
|
172
|
|
|
$ownEntityDescriptor = new \LightSaml\Builder\EntityDescriptor\SimpleEntityDescriptorBuilder( |
173
|
|
|
self::OWN_ENTITY_ID, |
174
|
|
|
'https://localhost/lightsaml/lightSAML/web/sp/acs.php', |
175
|
|
|
null, |
176
|
|
|
$ownCredential->getCertificate() |
177
|
|
|
); |
178
|
|
|
|
179
|
|
|
$buildContainer->getPimple()->register(new \LightSaml\Bridge\Pimple\Container\Factory\OwnContainerProvider( |
180
|
|
|
$ownEntityDescriptor, |
181
|
|
|
[$ownCredential] |
182
|
|
|
)); |
183
|
|
|
|
184
|
|
|
// SYSTEM |
185
|
|
|
$buildContainer->getPimple()->register(new \LightSaml\Bridge\Pimple\Container\Factory\SystemContainerProvider(true)); |
186
|
|
|
if ($timeProvider) { |
187
|
|
|
$pimple[SystemContainer::TIME_PROVIDER] = function () use ($timeProvider) { |
188
|
|
|
return $timeProvider; |
189
|
|
|
}; |
190
|
|
|
} |
191
|
|
|
|
192
|
|
|
// PARTY |
193
|
|
|
$buildContainer->getPimple()->register(new \LightSaml\Bridge\Pimple\Container\Factory\PartyContainerProvider()); |
194
|
|
|
$pimple[PartyContainer::IDP_ENTITY_DESCRIPTOR] = function () { |
195
|
|
|
$idpProvider = new \LightSaml\Store\EntityDescriptor\FixedEntityDescriptorStore(); |
196
|
|
|
$idpProvider->add( |
197
|
|
|
\LightSaml\Model\Metadata\EntitiesDescriptor::load(__DIR__.'/../../../../../../web/sp/testshib-providers.xml') |
198
|
|
|
); |
199
|
|
|
$idpProvider->add( |
200
|
|
|
\LightSaml\Model\Metadata\EntityDescriptor::load(__DIR__.'/../../../../../../web/sp/localhost-lightsaml-lightsaml-idp.xml') |
201
|
|
|
); |
202
|
|
|
$idpProvider->add( |
203
|
|
|
\LightSaml\Model\Metadata\EntityDescriptor::load(__DIR__.'/../../../../../../web/sp/openidp.feide.no.xml') |
204
|
|
|
); |
205
|
|
|
|
206
|
|
|
return $idpProvider; |
207
|
|
|
}; |
208
|
|
|
|
209
|
|
|
// STORE |
210
|
|
|
$buildContainer->getPimple()->register( |
211
|
|
|
new \LightSaml\Bridge\Pimple\Container\Factory\StoreContainerProvider( |
212
|
|
|
$buildContainer->getSystemContainer() |
213
|
|
|
) |
214
|
|
|
); |
215
|
|
|
if ($inResponseTo) { |
216
|
|
|
$pimple[StoreContainer::REQUEST_STATE_STORE] = function () use ($inResponseTo) { |
217
|
|
|
$store = new RequestStateArrayStore(); |
218
|
|
|
$store->set(new RequestState($inResponseTo)); |
219
|
|
|
|
220
|
|
|
return $store; |
221
|
|
|
}; |
222
|
|
|
} |
223
|
|
|
|
224
|
|
|
// PROVIDER |
225
|
|
|
$buildContainer->getPimple()->register( |
226
|
|
|
new \LightSaml\Bridge\Pimple\Container\Factory\ProviderContainerProvider() |
227
|
|
|
); |
228
|
|
|
|
229
|
|
|
// CREDENTIAL |
230
|
|
|
$buildContainer->getPimple()->register( |
231
|
|
|
new \LightSaml\Bridge\Pimple\Container\Factory\CredentialContainerProvider( |
232
|
|
|
$buildContainer->getPartyContainer(), |
233
|
|
|
$buildContainer->getOwnContainer() |
234
|
|
|
) |
235
|
|
|
); |
236
|
|
|
|
237
|
|
|
// SERVICE |
238
|
|
|
$buildContainer->getPimple()->register( |
239
|
|
|
new \LightSaml\Bridge\Pimple\Container\Factory\ServiceContainerProvider( |
240
|
|
|
$buildContainer->getCredentialContainer(), |
241
|
|
|
$buildContainer->getStoreContainer(), |
242
|
|
|
$buildContainer->getSystemContainer() |
243
|
|
|
) |
244
|
|
|
); |
245
|
|
|
|
246
|
|
|
return $buildContainer; |
247
|
|
|
} |
248
|
|
|
|
249
|
|
|
/** |
250
|
|
|
* @return string |
251
|
|
|
*/ |
252
|
|
|
private function getSamlResponseCode() |
253
|
|
|
{ |
254
|
|
|
return 'PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzYW1scDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIiBJRD0iX2I4YzNlZjQ0ZmZjZDNjMjc1OWYyYWU0ZTdjZGVjN2YwZGVhNGU0MGRkOCIgSW5SZXNwb25zZVRvPSJfMWRiMDZlNGY5MWQzOTk3YjdlZDMyODVhNTlmNzcwMjgwNzFkYjJkYzVmIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxNS0xMS0yMlQxNTozODoxNFoiIERlc3RpbmF0aW9uPSJodHRwczovL2xvY2FsaG9zdC9saWdodHNhbWwvbGlnaHRTQU1ML3dlYi9zcC9hY3MucGhwIj48c2FtbDpJc3N1ZXIgeG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6bmFtZWlkLWZvcm1hdDplbnRpdHkiPmh0dHBzOi8vbG9jYWxob3N0L2xpZ2h0U0FNTC9saWdodFNBTUwtSURQPC9zYW1sOklzc3Vlcj48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KICA8ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPgogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPgogIDxkczpSZWZlcmVuY2UgVVJJPSIjX2I4YzNlZjQ0ZmZjZDNjMjc1OWYyYWU0ZTdjZGVjN2YwZGVhNGU0MGRkOCI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+djZyaEovaUMyY3p4VXdoVHAxeStFOUZiYjlrPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5oTU43VzkrU08wOU1XOVEvWkx1aHlFNTJpZ3NxclRmallxZmJPRGJBbUtVQXFzT2llU2t6NU84cXhjdGR0K2FQTlNmTmdmeW96MCtuT2xvOXNtellISlRnZm1tV1ZGQUtkQjh3TU5XeU9NN3RZbWVqdU1DYm9pWmJORjJjUWNBc1lTazJ4R1JEVW53OWlRNGNIdTQ1S1ZWR01FdnlLblArQXBGWXgvSmdDUDU4MVQ0dU44c21reFp6bG1Wa1N1NSthdG11eEFXQlVWcytqMkk5US9tU09VUllyZWh5MUxqbWQ5bTBqVG00bGpMS3RZNW9FS3Z5TmpVeEthNlJFcThYbVhuSUtiTjJkazN2eThMcWE1SS9DTWNrQU52YmVDemdxNXdacGFiTlY2bStuSVptZnNvME9jdFdsa3dGOFFUSE9yQXRSMUpzamhmT2hBRzRVN2JvWXc9PTwvZHM6U2lnbmF0dXJlVmFsdWU+CjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUR5akNDQXJLZ0F3SUJBZ0lKQUpOT0Z1UWQ3MjdjTUEwR0NTcUdTSWIzRFFFQkJRVUFNRXd4Q3pBSkJnTlZCQVlUQWxKVE1SRXdEd1lEVlFRSUV3aENaV3huY21Ga1pURVNNQkFHQTFVRUNoTUpUR2xuYUhSVFFVMU1NUll3RkFZRFZRUURFdzFzYVdkb2RITmhiV3d1WTI5dE1CNFhEVEUxTURreE16RTVNREUwTUZvWERUSTFNRGt4TURFNU1ERTBNRm93VERFTE1Ba0dBMVVFQmhNQ1VsTXhFVEFQQmdOVkJBZ1RDRUpsYkdkeVlXUmxNUkl3RUFZRFZRUUtFd2xNYVdkb2RGTkJUVXd4RmpBVUJnTlZCQU1URFd4cFoyaDBjMkZ0YkM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDN3BVS09QTXlFMm9TY0hMUEdKRlRlcEs5ajFIMDNlL3MvV25PTnc4WndZQmFCSVlJUXVYNnVFOGpGUGREMHVRU2FZcE93NWg1VGdxNnhCVjdtMmtQTzUzaHM4Z0VHV1JiQ2RDdHhpOUVNSndJT1lyK2lzRzBOK0R2VjlLeWJKZjZ0cWNNNTBQaUZqVk50Zng4SXViTXBBS0NicXVhcWRMYUhIMHJnUDFoYmduR201WVpreUVLNHM4eHVMVURTNnFMN043YS9lejJaazQ1dTNMM3FGY3VuY1BJNUJUbkpnNmZxbHlwRGhDRE9CSTVMancxMEhtZ1pIUElYek9oRVBWVityWDJpSGhGNFY5dnpFb2VJVUFCWVhRVk5SUk5IcFBkVnNLNmlUVGt5dmJyR0ovdHYzb0ZaaE5PU0wwS3V5K1E5bmxFOWZFRnF5VXlkSjY3dnNYcVpBZ01CQUFHamdhNHdnYXN3SFFZRFZSME9CQllFRkhQVDZFeTFxZ3hNek1JdDJkM09XdXd6ZlBTVU1Id0dBMVVkSXdSMU1IT0FGSFBUNkV5MXFneE16TUl0MmQzT1d1d3pmUFNVb1ZDa1RqQk1NUXN3Q1FZRFZRUUdFd0pTVXpFUk1BOEdBMVVFQ0JNSVFtVnNaM0poWkdVeEVqQVFCZ05WQkFvVENVeHBaMmgwVTBGTlRERVdNQlFHQTFVRUF4TU5iR2xuYUhSellXMXNMbU52YllJSkFKTk9GdVFkNzI3Y01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUhrSHR3SkJvZU9odnIwNk0wTWlrS2M5OXplNlRxQUd2ZitRa2dGb1Yxc1dHQWgzTktjQVIrWFNsZksrc1FXckhHa2lpYTVoV0tnQVBNTVVia0xQOURGV2tqYksyNDFpc0NaWkQvTHZBMWFuYlYrN1BpZG4rc3daNWRSN3luWDJ2ajBrRlliK1ZzR1BrYXZOY2o4Uk4vRGR1aE4vVG1pNXNRQWxXaGF3MDZVQWVFcVh0RmVMYlRnTGZmQmFqN1BtUjBJWWp2VFpBMFgyRmRSdTBHWFJ4bjd6Z2hqcHZTcTludVdhM3BHYmZkVnRMNkdJa3dZVVBjRHpqcjRPZUdYTm1JWmUvd01Dbno2VkdaWStMVWd6aS80REFDNlYzT2pNdWhkcVMvMitvMStDWEN3TjA4Q0lIUVY2K0FVQmVuRVZhd01zaWFkTEJneDNrRmU1aVhyWVJNQT08L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L2RzOlNpZ25hdHVyZT48ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KICA8ZHM6U2lnbmVkSW5mbz48ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPgogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPgogIDxkczpSZWZlcmVuY2UgVVJJPSIjX2I4YzNlZjQ0ZmZjZDNjMjc1OWYyYWU0ZTdjZGVjN2YwZGVhNGU0MGRkOCI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+QVREc2tQVGZuRmtFSTNXenJNQ3JDelNCNktvPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5nZTNYeG1ZMWw3M2FuUWs1L2Fzd0JCVENkVkpGa0U1TlBOOVlCbmVvK2lkREhKb2IvMitPcnZyS1B5QlQwZHBSSnBTellVYUYyRllOaU1RMG5jNkpQdDVyMk52c2Q4aVB0VzZXRjRhYWVYZDRmTlFQZXRNL3AzS2l0ejl3b0NzakdJNUNQNy85eUkrVTlUbEo0QWlLdTNMTEdHbjQxbnZxVG9sUVRRa0RDajJvQjZmTVp6TFBOYlFEVFV2SFI0REdMdGt4aU0wSk1IRUdyYVE4NGhzeENuaTBYQ1BNd0w1dnVmOFMrMng2ODc0VDBpbFllZnU4ZnFRanFOK0t1NklyZFBycE9QRG1SUDhGemlyRWFkMXJNZFpSK2dpM3VmVmpxZFZhTWhMLzFPSkhqZnRUQzRORzI2MElib1V6QVowa1BHM2V1T0tIWjUydHdhT1BVdEFqU1E9PTwvZHM6U2lnbmF0dXJlVmFsdWU+CjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUR5akNDQXJLZ0F3SUJBZ0lKQUpOT0Z1UWQ3MjdjTUEwR0NTcUdTSWIzRFFFQkJRVUFNRXd4Q3pBSkJnTlZCQVlUQWxKVE1SRXdEd1lEVlFRSUV3aENaV3huY21Ga1pURVNNQkFHQTFVRUNoTUpUR2xuYUhSVFFVMU1NUll3RkFZRFZRUURFdzFzYVdkb2RITmhiV3d1WTI5dE1CNFhEVEUxTURreE16RTVNREUwTUZvWERUSTFNRGt4TURFNU1ERTBNRm93VERFTE1Ba0dBMVVFQmhNQ1VsTXhFVEFQQmdOVkJBZ1RDRUpsYkdkeVlXUmxNUkl3RUFZRFZRUUtFd2xNYVdkb2RGTkJUVXd4RmpBVUJnTlZCQU1URFd4cFoyaDBjMkZ0YkM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDN3BVS09QTXlFMm9TY0hMUEdKRlRlcEs5ajFIMDNlL3MvV25PTnc4WndZQmFCSVlJUXVYNnVFOGpGUGREMHVRU2FZcE93NWg1VGdxNnhCVjdtMmtQTzUzaHM4Z0VHV1JiQ2RDdHhpOUVNSndJT1lyK2lzRzBOK0R2VjlLeWJKZjZ0cWNNNTBQaUZqVk50Zng4SXViTXBBS0NicXVhcWRMYUhIMHJnUDFoYmduR201WVpreUVLNHM4eHVMVURTNnFMN043YS9lejJaazQ1dTNMM3FGY3VuY1BJNUJUbkpnNmZxbHlwRGhDRE9CSTVMancxMEhtZ1pIUElYek9oRVBWVityWDJpSGhGNFY5dnpFb2VJVUFCWVhRVk5SUk5IcFBkVnNLNmlUVGt5dmJyR0ovdHYzb0ZaaE5PU0wwS3V5K1E5bmxFOWZFRnF5VXlkSjY3dnNYcVpBZ01CQUFHamdhNHdnYXN3SFFZRFZSME9CQllFRkhQVDZFeTFxZ3hNek1JdDJkM09XdXd6ZlBTVU1Id0dBMVVkSXdSMU1IT0FGSFBUNkV5MXFneE16TUl0MmQzT1d1d3pmUFNVb1ZDa1RqQk1NUXN3Q1FZRFZRUUdFd0pTVXpFUk1BOEdBMVVFQ0JNSVFtVnNaM0poWkdVeEVqQVFCZ05WQkFvVENVeHBaMmgwVTBGTlRERVdNQlFHQTFVRUF4TU5iR2xuYUhSellXMXNMbU52YllJSkFKTk9GdVFkNzI3Y01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUhrSHR3SkJvZU9odnIwNk0wTWlrS2M5OXplNlRxQUd2ZitRa2dGb1Yxc1dHQWgzTktjQVIrWFNsZksrc1FXckhHa2lpYTVoV0tnQVBNTVVia0xQOURGV2tqYksyNDFpc0NaWkQvTHZBMWFuYlYrN1BpZG4rc3daNWRSN3luWDJ2ajBrRlliK1ZzR1BrYXZOY2o4Uk4vRGR1aE4vVG1pNXNRQWxXaGF3MDZVQWVFcVh0RmVMYlRnTGZmQmFqN1BtUjBJWWp2VFpBMFgyRmRSdTBHWFJ4bjd6Z2hqcHZTcTludVdhM3BHYmZkVnRMNkdJa3dZVVBjRHpqcjRPZUdYTm1JWmUvd01Dbno2VkdaWStMVWd6aS80REFDNlYzT2pNdWhkcVMvMitvMStDWEN3TjA4Q0lIUVY2K0FVQmVuRVZhd01zaWFkTEJneDNrRmU1aVhyWVJNQT08L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L2RzOlNpZ25hdHVyZT48c2FtbHA6U3RhdHVzPjxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWxwOlN0YXR1cz48c2FtbDpFbmNyeXB0ZWRBc3NlcnRpb24geG1sbnM6c2FtbD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI+PHhlbmM6RW5jcnlwdGVkRGF0YSB4bWxuczp4ZW5jPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyMiIHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI0VsZW1lbnQiPjx4ZW5jOkVuY3J5cHRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNhZXMxMjgtY2JjIi8+PGRzaWc6S2V5SW5mbyB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48eGVuYzpFbmNyeXB0ZWRLZXk+PHhlbmM6RW5jcnlwdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPjx4ZW5jOkNpcGhlckRhdGE+PHhlbmM6Q2lwaGVyVmFsdWU+TFRHVUdjMzkzSHVaeDM0eVBjRjJjRGZnS0o3bDNOdnYxKzh2QWIvSTUxdXZmSWlyeHVqeGNBcUZ3YVl5WXlMekVzbnlCVUJhdUZiYzZhR2hUQlhuaWlieWpiR0NzWGtTdHc2NUJlb0o5alpPZDNyRVJvZ0dEaHBDVktHZTF3UVZLMVIvRTdZTzZDVWt2WHdqWmhxalBwSEIwcGVlUHJDUVZtOUprV0xBOFNBR0pSRzJwVUNJRUNVWE1LUGxqZ1FFKzNQRkQ0dGlBN0tvZ3hTQTVrcldjbmVjOTA1ZWl5eUJlN202UXh3OEZYSXVZSU50U2VQOUU2dXdCd2xFdUdUOVRjSXJhV0dCYXNmRnlRNXkya0huanJYdHljT2RnaXZOUFoyQ1Y1bUNLRGFxUjloT094dXpPUnVpM3d2cDBoV1E1aHAwQ1Y2Z3hVM3ZRdXM0aXdJQytBPT08L3hlbmM6Q2lwaGVyVmFsdWU+PC94ZW5jOkNpcGhlckRhdGE+PC94ZW5jOkVuY3J5cHRlZEtleT48L2RzaWc6S2V5SW5mbz4KICAgPHhlbmM6Q2lwaGVyRGF0YT4KICAgICAgPHhlbmM6Q2lwaGVyVmFsdWU+Nk5ZaXU1aGN6NTBlblBYdUllRCt0MUlMcTFtQm1QZ0Y1ZTJuWW9hR0wrZ0EvcHgwZkNzOWRJci8wejJkY3pZZ1YrUThFK2FydFptUGJtai8zalFjZkswNHlaZFYvL0YrdEdOaFFYM3VKbmFxSVQ5WGE5dENic29MaWQydE1ucTJkZ3psb1N1VWR4K05MY0p5VnJWYUs4ek15N21PVVdtRndQV2U1b0Y1ZEl2N1ZXeEY4aitrVHAzRHNnVmZlS2ZWaG1wUEFFMGJPanhXWUoxVEhZUEttQjRIS3duOW9COERXM1FnQjV1R2hBUzFlMXFFM0pXdFY0c3Y2b1N2Nk9ocE9oaXREN1BTRzNlTStBSVlYa2tEaXBXU01PZGhJT0lSYlg0aHNZKzczemIzclJXZjFYUlFWVlRnZmVReW9lMG5GdzlQZXpsOGpmUnpSSTlTa0toQVVvKzhwbUtKVUIxZTNNOUZlK1g5K3U5Yjc3QmdUTkFIWlhhS1pKNnRmTmxsVG5sbFBvU2ZDalRDZ3BNOXNEUXE3ZlZNd1ltSHdYWklGTmIxazErWU81bFpOZkRvckpkd0FtRHBrVVRwNm9LKzFJOEw3SzZqdVVPRHB6UlRwUkx3RjY0VjlVUW95TnBVRkZnL0FQeTR1MkFGTTNEcEpoaFR3M0RpTWh5c3BkOXFiN1d4dlZnM3F0a1h3cFA2bWlYd3Q1ei83NVBtUitHWnVVcS9TcEhmNXJDTE5SN2RicHU3UHhyTzliV0s5Q1VTZEswWXA4QTI5dnYzaTJBWk9WM2JoMFJMVlhiV0RPL2gvaWx5MnFpWlNJdlA5cjNZamEwTjdmeUZKbExOWVo4RWkvSkpyUldONkc3Q1hUOVMvRjIvN1RDU24vVXZwK0tYcjF1WXhtQmtXU0JkWmFuaFdPdzdLTC9jUnpLZk83YlMrMkN0UjRHYWVNbkJWK3NqRnliUStzUE9iTExoS3AwUEdTMW9CeG91bnpmQ3V6YTlDQnVRelVqQ1VGT25aampraVZaZVloeFJCa05PZ0lWSTkxQ2l2cmxkc2NQZEQ4UWVlSU8xcldyRHVIZzhwRXBoN00zQXh6RmFBSHRlb2ZlQnl6UVkxNjloQTZCTlhma1hGakdyZXZZNDdIc05YSERMRUEvcWxXTFczc3RZcWtvU3NuWFRjYXI2bmlvRkI1T3pHY1N3bXBWcTBBY0k0VTgzQzJ5RG9VSWxocmRRU2x5NWpKSzliZkYxZmxmMFNwaVk0RDdQYXR6QmFaQVB2eGZESElmWVBBSWNUMXNFNWsyNERrU25DSXZjK3RxRkd2SmFTb080UTdXZkh4ZEMrUlJYaWlQaVpMcHdXdlpxdFNhZEFIYXljd08ybDlJRnd2dTB4WFlNdmZXL1REVWQvTlFsMjJpOFdmTkhBOFVrQUgvR2lvZTA4ZXJCZlN4THdqNlFGTmxhZ2NCL25CV0JMN2RFM1JpbXVqOHdtU0JwN3FGNXdJQnYwNEZGblc1WTVSTmxEV2hUa280ZVpZNkV5NHVXYjNsWnN5di9MWWUwT1JPa0tkNE1LckoxaDJaMU9CaTloUldDMFhzdmpFRmFKUVRmYlQyOHJnUStFVWJxOE04U21XR2RXRnIrbVVIQTVGVjl0NlYzNVpGVGdpdFV3TjFpSnBMeUhpS29wZWpjSEU3Q3cvaEI4OGJTN1h2V0xSSEV2NFdVOE9uQ3FWQ20wdzFVTFptQWNpdWJrNjhuOU55VVNpTWdzbnhjT0owOG1rNEpqMFZJUmlpMUc5NzVub0x5UjZRT3Y4dWlEMlFCYjNZRnZKTzJYSk1JSExBZG05b1JQVEVuYlVxb0RXQXcxcGEvTjEza3JsdENRMFcxT21YcmFjcStSNnMzaG9GU3ZEaU0wZ1FpQ284U2RGZE9RUkJNRVlXMk8rdlhwYWt1dmhEMUVNcnBjWjdHUFlBZ3pjdHhER0M3WEhFVmRxNzBsYW84a2lZMHRoWWJEbVhuaEtpNlFqRDNIZlU0NHhkaXZ6S256VHJJMWZRTUJFQmVBV2dDVCtWbFg1NlRyTEg0WFFTSmEvMnBYbXpaVHI3ZFpwQ2dTQ3pwL1pBNXlLYXovTHVwR2I4TFFWTDJMbnJYb3kzU0RSb012d1owMFM2eFJ6ZnY3QVR1TmMvZW1aem8zYXJ1bXlwNGxYU0hiTGFxdGgvdGsvRWpMZ1NUUStpY1ExeGpPU01mWWZpc21maEhaZXhVN1JhbFhjanlRb1dON1liNlFrV1U3WXpna1BrSWJnMFc1SXpGOURaSkZEVE9LNVAwMkJtbVJnTll0SHVucWRRckV5Mi95djNwVlE4VVBqYjB4SWxlcE5DWVpLSlB1NmJqa0N0OXhZU0pLUnpzV1hqZm5TMGJ1ZDlkOHRTdWZOeCtqZzRTVXErYkJTc2pxWUwwQm93MWZDTjVSM3ZnMHdqU3RteVNTYUdNdW1GVzM1UkVxd2xoQzBoZS9BTVVWZTVOMEFkYmlnclE4QzJTaG9xdW5vOUdkVlo0aDdoUWJKbHo3b3JBaEJVV0VhUmRKQ1FOYmZwN2gzOThJaGhCVkFvVEhlZkFGdmVBRS9YSlhvWkxuejUyUmFHZDk3QTRBaVdNQnlYNDFYUkQ1L1M0cTVZVmVUNjRYUUZrNEk5dWNCZ09HaCsybXkrdWhLL1VEMjBvcm9JaThHVzFNenF0aENNbjBTRURVMVJFMFN5Q3NnK3NKMWZVMWFsLzZEZGFEamZGZ3Z6SWZoNmZqT2FSb2NSaEFrS2dxSnF4YnFnTm5tNlhEWDNLbXorWU5TSWtoVVd2T20xYTV1cnRLelh0dkIzOW5DN1A5VDZVTkpobEZ4ZUxBZlZSa1NlTHdjRnk3Z04yUW4rbXNieGhPSXVGdmNLbHNEY210dTNFY3c1RS9UMWVjMU54MFlzT051Sm0vUUNXWGJNc2tTK0h6QkI2bURuemdIWkRwTkFFMGdaTllnZWVDNTNWSjVyNzNydzkybTVqMEZkVEZCd0p5TzFpRWhmZTNvWWhrR1Q1UzBDRXI5aG1mSWxMMDlXS2E1T2w2Qkx5VE9JUitibnJ3alZXMzZsdFk0QjdDK0QxVGdpbFY4MmJacXR1OFhtcDNva2ZlV3lMR0dTcktpQytBekE0NEhBVVN1TVBKbjZmbHgwTTFOODBaZDFqN3R2aXMxaGNLUGQwbXhuSXJqU1dqd2hoMGpjaVdkZk9zdFBPMTA2UGt0dkdjU0ZLajhzaTJLOVVFcHpCU3VTRTEvODNQNkF5RjJ0T0N1YTBBNlVheWZaR2szTVgzdlRHVmoxNXdoZEc2RlpGY21KTnZVc2l5ZjNaZmhnV0VjQ0FLQ2U5OEYyb2tGYjZrSlRUVk1wSUxPdkUxK3dWKzdZTWRSdi9iL3lzTXZMYVQ1MkdMMmd2citUdy9xL2ZNeGpSRUpadGJzUjJrY1dkMWNVUW1lUE5rNFBlVVRRem9DNGxHaVVFTWEwb1RnZE5hVVZmNkwyUGxUbWNLVW5tOFVERno2K3ZGZ3V5N1M2S0lBSlBBTnA5ekRBOXlHWFBac3lyZ1hQdTdaaWttSmxaMnk3OFFRQkdFdFc2c2pITHNZZHNoRU9wRDc5ZHJWajhvMGhzVGFkdzJHZzE3akMyRFRrZCtRZHQxMkZMZW1VVStWRWxBUUhqWGtmRzc0d2xnbVBqOW0xZWIyS0U1bHAzbDVqd3NrdGNzSjJjMm5zZ3lVaFZ0ZjFCd2svV2RXb3lrWFg2Ty84a29COHpJU0dPdzJMZ1l0cm9UUTJvcHI4YXFmTFZUdXZBbjRwR3JNRmlRUUlmNW50YUcxOFc5bTVIclpFVFBKZXkzWW1GUStJcUJhRjkxOVhlanZLZDYyc2EvZHphakFaQ0pTRmxpaCtOYXZ3WHJFaUJxZU03Z05zVU9mMWZTYUwwUFdDRHVrSUt3RXVDaWdXQWo5NytXUWVNc3hFYkJGRk1oTVNRZjB4ekRHcnE4dDA3Y3FhVlJVQ3lnUXpybml0SHhIYmM2RTBTeE1Dais3MjlCZVJ4aVJLSkxKajBXYlo5dGZUdkJ1Q2ZxbVRoaG9xOFRWelJVMko4OUFuZVNuenJpa044c1psaytHQnJ4ajF2cGViRUJ3Y3diMUNIM0pzZmFNblp4eGFROXppMlYvSDdRVC9NODZ6aUdpamxUS0VMWHZ6MytJY0VDVjE5YlYyMjhsRmRabXppTnBxSytneFZzUjE4VC9GaHZRUFRqQWpteVpDaHhjK0JhcEhoSmd3VTh2ZTl5QURIS0FXeUlsVFVqWDUvcWhqaGhia1ozS1hRa0NrMXBudTFCZ1RyWWZOZFpUYW1nclEyMU5jRVF3L2xBZ1M2ZndTTVdJZ3B1djd4Q3RscTFlVS9RSElST3JQcEI2aGpieUMwbnJWci9neW15b0ZzQVlkeHZTWmhXWGxJbWU3SXBXdWNUaGwzOTNNek5LRXdKTjQzWHNxUGM1QVFkN1NUSCtWVm15VUFYd3Rab3VQa2JqMlVYbGNiVThwU3ZhWFBaVUhIaUIwUTEzNU1RMjA3Rnh6UjhSNlZJY1lSMFQvd25sNGFMTlR5SS9ERVl0ZFhwcHJhcytJWmdFMmM2TE1VTjZOd0tLcWVBUWh6L0hvL1hTL2dZd3VDREcrWWpmYThVRCtJeTd6ai9EUDZJWkphK3RrbFVMZTYxTnlWQzFFOERzNUNBVXROZFp3ZnpncUhyT1lqUk9KVFhOTjNSS2U0YmtYQXdLNDcybzJENy95TFBycFVuVUpiYkJ2dThDMDd1KzI4cmhSSHdaUWUyYytOKzBEc3BoSkJwSnZvNmZFSTRaUnk3QVphZWtGZWdlVThCWmZEL1Vzb29PcERvS29KdjBNZDl4TEJjUE1ITTQ1UWhHMHhob0VZb1JFR2dNMFVwWWlpYkp5OHpwU3ZZM0xKbzFiQjN0bTRORnNDTEZzYXFwQnlnKzYyandTNXVBL29RNktJUzVPWFZwQ3c4Q3FTL01nN2xlQ3ZHTWlaQnhLUjFnZTFseURxUGQ2dE1Sd2dwTmpSZ0gzZEEwSTQrY3RDWk9xY2N4NE1XeVhGcy9aYU12ZkVMK1FJUWJkYTRQNEphVEtla1gyN1dSVGFXdnl1V2lxVFYxeUFxaVEvMGduVjIzVDhNY1VGQ003UWxRZUh5cWtIY29EUFA4VUVEYUNmTEdKdXJSRlVvL2YzNlEwVWI4Q1Fyc2xCd2k5cTRTSjFZR3JvcDBpWGlPTFBQM0RSNHF4VklKZTYxTElIS3pjb016c0duQ29nMXlvSW1UM2ZEZEhrZkdxaHh0Y0xaZGRuczRRcmJnSm5oOXUxUlIzU2hUUG4zRHVYNDNXOWNlVDlVY0ltVlpKZExVRHorRHUxZkt0WTlzNk1wZ1ZmM2xrWWowaTg5c0xiYkxTRlhKb0NNUDV3YUJoT2lzV0ZYWUNCc1dRUXd6Nm9ndXRHdlVCRlFWVzd2KzJjT0ZMWGRDWFlxc21uc2JXbEs1RUprU3NKbm5lNUFZRjhNTGt4VkdHWUlIZU1UY05tZHdseFB6K09yTzdzdXk5TXFTRzR6UmxvWUxLMHRjNXlrTjMxeS9lazNsdVhTY1JYZzQ1YVdMd0NYSDJOYTFxSFpRT0RublVPTFJyb3AyQW1qVG9iVlVMR25Ibm52bHZiZXVyY0ZIY2U3R2laTlozSHNDZG1qY0Zob21QWEVwNW5ab3dkYnJ3dVdXRUJqMmVvMFZOWUZZeVVyOUp3ZFFUZ0tUWThVSU5MTWpkWGNxUXV4Yjh3c25XSEdod0w1dzN2WFBDTkJQSXJUcVZMbklXeUlLZHNIbVYvZnlPc0NxNWE5U2NWMXYrVEtJOTNmamltRU43V0NUVE5XUUdhUlkvcHFTK01MZElIb0xpZjJJUkZqOWcwQWhHS0E5NFNzNXgwbDg0ekhUZlc0bDJsNjBiSWtJZmJWOHBTdTRZQlZlZEZicmRsS0MzWllFV2haZGZhYUp2QTNlYjBQSVpCK1hWUjhaa0NqS3JRTWpmMmZQV29obEo1WVF3MDhRQVJYN0h0VWlZaVJNMzRLTFB3SEpqOFc3U1M0SkpTSGo0V05DY3dYYU9YQStYT0c0LzhFMmhNbDVRMXIvRVVsNGFMTk5CSC8zUlpzNklBT0xJOEhlbkpMSFo0Q1A2VE9vbThYNmFXZGVFa3YvTEk1d3V1OTJ3cjZzdnN5S1ZVTHg2U2MxY0FsbXpQaTVlYkdyR2FFQkxYYmptak9QbzRhbUN4SGdCRzF5aTZXV2w3eHNnU3A1RGptZi9sWEFDQmdCbTJidUxHVDVUWkh3ZDl6eDRTaG10MTlRV0MwZGVhemQxWGlKSkU0dlZ4dFY3VEZIekpkSFlvMnM4YXpDR3lDMnBsN05yYXlmZVAxbDRoSlBiRDNSODlab0k2ZXIxT2p4amNoTzVmcEt5djYrakdhWkdSSXJ2aVpsTktVQmxLaHRNanpxSUZYME1LeDhkY0tGdUpKU2VGOHdFR3NZSlkyNm1YY1VIL0RRLytqZEwwbGJ1WFd1VzN0c21zYWRNZXVjTEpocHg2clRDeUJhT0lhMjdpQjBvVEMvdmNoWXBzK05iUGhrNEsxU3ZVVWR0TXEzeXUyUkRtM0JNeGVndnBUcExiaWl3VEgvcnJuamNFR0ZyaFRqVVJyMUNhaVVsdDNsZnR3N0RoVjJxT1VhUUtzb1pYSEVzMStPajNwODJNWmg3V0Zhd1RyMGJTTFVnMmp4dXhxOTRNUzVrNlpXRzhuNXF0eW1DRWhHNUtJOGxxZ1g3Qk5xRjM2aEJsZkNsUkZrcmlHdFN2T01oMVJJTXRIK0VFei9RdHo0aVp3R05GaHlQN21HdTRsTE94Njg0K3RxeXVEbUwzaE9WTUFwb08zU25jbS84RUIwZ1RTR0xSSEx5amozMnAzM3J0K2NaY0tZVCtKVVdDL0wrUHd4UkdWc3FXRm5LbzM3RURyWXNkWE13V2swZ0YvRmZ6WDhqbXZ5SkZWR29GQXA4eXNmTjBlVm1nVjc0eXZVMGFwbjJGUGlvWjNoZnk4eHhVZmRPNkp2S3lRejk2bWNzSHRtYUpvRTRETEJQNktXNnF2ald1Ky9NOS9HUmk2OFdnNGxyTmFtSEIvOUU0MHhLKzJHS1ZiblV6Yll5OW00bGVCYjNrYjhqNFpqSWFQTHZzK0lzQ1VCRGlHazV3d255TFhFeENpZWZCc0hPbktNQ2w3QzVyRzc1Y3FpWkYxVmFhOHc0Q1F0ZytNandvVGR4Q25FODE4Q0dnMjQ2cDJocjYzUHgrVUVHclVKNE9oZ1V5MDdBZWhidlVCUGpvVWxJd3dpUGQ2VjAxTnBXMTFHekkvQ1AvamVZRVhnSVJ6V0hhb09mL08xK3gxLzFoTVI0R0FibCtlRlcvNjQxaTIvZkFFNGJTRVBwbk9wa1BORkRqbUx4MDF6YVhIMUJIQUVVUWlPa3VMTUpuNDNPQ3ZrbGJXeVhHUlNhMkZjMjhMTlVWM1QwMDVCUUcvNFhWR0E9PTwveGVuYzpDaXBoZXJWYWx1ZT4KICAgPC94ZW5jOkNpcGhlckRhdGE+CjwveGVuYzpFbmNyeXB0ZWREYXRhPjwvc2FtbDpFbmNyeXB0ZWRBc3NlcnRpb24+PC9zYW1scDpSZXNwb25zZT4K'; |
255
|
|
|
} |
256
|
|
|
} |
257
|
|
|
|
It seems like the type of the argument is not accepted by the function/method which you are calling.
In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.
We suggest to add an explicit type cast like in the following example: