GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

YandexTest   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 395
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 0
Metric Value
wmc 15
c 0
b 0
f 0
lcom 1
cbo 9
dl 0
loc 395
rs 10

15 Methods

Rating   Name   Duplication   Size   Complexity  
A getCacheDir() 0 4 1
A testGetName() 0 5 1
A testGeocodeWithLocalhostIPv4() 0 5 1
A testGeocodeWithLocalhostIPv6() 0 5 1
A testGeocodeWithEmpty() 0 8 1
A testGeocodeWithFakeAddress() 0 8 1
B testGeocodeWithRealAddress() 0 34 1
A testGeocodeWithRealAddressWithUALocale() 0 56 1
B testGeocodeWithRealAddressWithUSLocale() 0 33 1
B testGeocodeWithRealAddressWithBYLocale() 0 31 1
B testReverseWithRealCoordinates() 0 46 1
A testReverseWithRealCoordinatesWithUSLocaleAndStreeToponym() 0 58 1
B testReverseWithRealCoordinatesWithUALocaleAndHouseToponym() 0 34 1
B testReverseWithRealCoordinatesWithTRLocaleAndLocalityToponym() 0 34 1
A testReverseMetroStationToGetName() 0 9 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Geocoder package.
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 *
10
 * @license    MIT License
11
 */
12
13
namespace Geocoder\Provider\Yandex\Tests;
14
15
use Geocoder\Collection;
16
use Geocoder\IntegrationTest\BaseTestCase;
17
use Geocoder\Location;
18
use Geocoder\Provider\Yandex\Model\YandexAddress;
19
use Geocoder\Query\GeocodeQuery;
20
use Geocoder\Query\ReverseQuery;
21
use Geocoder\Provider\Yandex\Yandex;
22
23
/**
24
 * @author Antoine Corcy <[email protected]>
25
 */
26
class YandexTest extends BaseTestCase
27
{
28
    protected function getCacheDir()
29
    {
30
        return __DIR__.'/.cached_responses';
31
    }
32
33
    public function testGetName()
34
    {
35
        $provider = new Yandex($this->getMockedHttpClient());
36
        $this->assertEquals('yandex', $provider->getName());
37
    }
38
39
    /**
40
     * @expectedException \Geocoder\Exception\UnsupportedOperation
41
     * @expectedExceptionMessage The Yandex provider does not support IP addresses, only street addresses.
42
     */
43
    public function testGeocodeWithLocalhostIPv4()
44
    {
45
        $provider = new Yandex($this->getMockedHttpClient());
46
        $provider->geocodeQuery(GeocodeQuery::create('127.0.0.1'));
47
    }
48
49
    /**
50
     * @expectedException \Geocoder\Exception\UnsupportedOperation
51
     * @expectedExceptionMessage The Yandex provider does not support IP addresses, only street addresses.
52
     */
53
    public function testGeocodeWithLocalhostIPv6()
54
    {
55
        $provider = new Yandex($this->getMockedHttpClient());
56
        $provider->geocodeQuery(GeocodeQuery::create('::1'));
57
    }
58
59
    public function testGeocodeWithEmpty()
60
    {
61
        $provider = new Yandex($this->getMockedHttpClient('{"error":{"status":"400","message":"missing geocode parameter"}}'));
62
        $result = $provider->geocodeQuery(GeocodeQuery::create('xx'));
63
64
        $this->assertInstanceOf(Collection::class, $result);
65
        $this->assertEquals(0, $result->count());
66
    }
67
68
    public function testGeocodeWithFakeAddress()
69
    {
70
        $provider = new Yandex($this->getHttpClient());
71
        $result = $provider->geocodeQuery(GeocodeQuery::create('foobar'));
72
73
        $this->assertInstanceOf(Collection::class, $result);
74
        $this->assertEquals(0, $result->count());
75
    }
76
77
    public function testGeocodeWithRealAddress()
78
    {
79
        $provider = new Yandex($this->getHttpClient());
80
        $results = $provider->geocodeQuery(GeocodeQuery::create('10 avenue Gambetta, Paris, France'));
81
82
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
83
        $this->assertCount(1, $results);
84
85
        /** @var Location $result */
86
        $result = $results->first();
87
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
88
        $this->assertEquals(48.863277, $result->getCoordinates()->getLatitude(), '', 0.01);
89
        $this->assertEquals(2.389016, $result->getCoordinates()->getLongitude(), '', 0.01);
90
        $this->assertNotNull($result->getBounds());
91
        $this->assertEquals(48.861926, $result->getBounds()->getSouth(), '', 0.01);
92
        $this->assertEquals(2.386967, $result->getBounds()->getWest(), '', 0.01);
93
        $this->assertEquals(48.864629, $result->getBounds()->getNorth(), '', 0.01);
94
        $this->assertEquals(2.391064, $result->getBounds()->getEast(), '', 0.01);
95
        $this->assertEquals(10, $result->getStreetNumber());
96
        $this->assertEquals('Avenue Gambetta', $result->getStreetName());
97
        $this->assertEquals('Париж', $result->getLocality());
98
        $this->assertEquals('XX округ', $result->getSubLocality());
99
        $this->assertCount(2, $result->getAdminLevels());
100
        $this->assertEquals('Париж', $result->getAdminLevels()->get(2)->getName());
101
        $this->assertEquals('Иль-Де-Франс', $result->getAdminLevels()->get(1)->getName());
102
        $this->assertEquals('Франция', $result->getCountry()->getName());
103
        $this->assertEquals('FR', $result->getCountry()->getCode());
104
105
        // not provided
106
        $this->assertNull($result->getPostalCode());
107
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
108
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
109
        $this->assertNull($result->getTimezone());
110
    }
111
112
    public function testGeocodeWithRealAddressWithUALocale()
113
    {
114
        $provider = new Yandex($this->getHttpClient());
115
        $results = $provider->geocodeQuery(GeocodeQuery::create('Copenhagen, Denmark')->withLocale('uk-UA'));
116
117
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
118
        $this->assertCount(5, $results);
119
120
        /** @var Location $result */
121
        $result = $results->first();
122
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
123
        $this->assertEquals(55.675676, $result->getCoordinates()->getLatitude(), '', 0.01);
124
        $this->assertEquals(12.567593, $result->getCoordinates()->getLongitude(), '', 0.01);
125
        $this->assertNotNull($result->getBounds());
126
        $this->assertEquals(55.614999, $result->getBounds()->getSouth(), '', 0.01);
127
        $this->assertEquals(12.45295, $result->getBounds()->getWest(), '', 0.01);
128
        $this->assertEquals(55.73259, $result->getBounds()->getNorth(), '', 0.01);
129
        $this->assertEquals(12.65075, $result->getBounds()->getEast(), '', 0.01);
130
        $this->assertNull($result->getStreetNumber());
131
        $this->assertNull($result->getStreetName());
132
        $this->assertEquals('Копенгаген', $result->getLocality());
133
        $this->assertCount(2, $result->getAdminLevels());
134
        $this->assertEquals('Столичная область', $result->getAdminLevels()->get(1)->getName());
135
        $this->assertEquals('Данія', $result->getCountry()->getName());
136
        $this->assertEquals('DK', $result->getCountry()->getCode());
137
138
        // not provided
139
        $this->assertNull($result->getPostalCode());
140
        $this->assertNull($result->getSubLocality());
141
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
142
        $this->assertNull($result->getTimezone());
143
144
        /** @var Location $result */
145
        $result = $results->get(1);
146
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
147
        $this->assertEquals(55.455739, $result->getCoordinates()->getLatitude(), '', 0.01);
148
        $this->assertEquals(9.972854, $result->getCoordinates()->getLongitude(), '', 0.01);
149
150
        /** @var Location $result */
151
        $result = $results->get(2);
152
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
153
        $this->assertEquals(55.713258, $result->getCoordinates()->getLatitude(), '', 0.01);
154
        $this->assertEquals(12.534930, $result->getCoordinates()->getLongitude(), '', 0.01);
155
156
        /** @var Location $result */
157
        $result = $results->get(3);
158
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
159
        $this->assertEquals(55.698878, $result->getCoordinates()->getLatitude(), '', 0.01);
160
        $this->assertEquals(12.578211, $result->getCoordinates()->getLongitude(), '', 0.01);
161
162
        /** @var Location $result */
163
        $result = $results->get(4);
164
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
165
        $this->assertEquals(55.690380, $result->getCoordinates()->getLatitude(), '', 0.01);
166
        $this->assertEquals(12.554827, $result->getCoordinates()->getLongitude(), '', 0.01);
167
    }
168
169
    public function testGeocodeWithRealAddressWithUSLocale()
170
    {
171
        $provider = new Yandex($this->getHttpClient());
172
        $results = $provider->geocodeQuery(GeocodeQuery::create('1600 Pennsylvania Ave, Washington')->withLocale('en-US'));
173
174
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
175
        $this->assertCount(5, $results);
176
177
        /** @var Location $result */
178
        $result = $results->first();
179
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
180
        $this->assertEquals(38.897695, $result->getCoordinates()->getLatitude(), '', 0.01);
181
        $this->assertEquals(-77.038692, $result->getCoordinates()->getLongitude(), '', 0.01);
182
        $this->assertNotNull($result->getBounds());
183
        $this->assertEquals(38.891265, $result->getBounds()->getSouth(), '', 0.01);
184
        $this->assertEquals(-77.046921, $result->getBounds()->getWest(), '', 0.01);
185
        $this->assertEquals(38.904125, $result->getBounds()->getNorth(), '', 0.01);
186
        $this->assertEquals(-77.030464, $result->getBounds()->getEast(), '', 0.01);
187
        $this->assertEquals(1600, $result->getStreetNumber());
188
        $this->assertEquals('Pennsylvania Ave NW', $result->getStreetName());
189
        $this->assertEquals('Washington', $result->getLocality());
190
        $this->assertCount(2, $result->getAdminLevels());
191
        $this->assertEquals('District of Columbia', $result->getAdminLevels()->get(2)->getName());
192
        $this->assertEquals('District of Columbia', $result->getAdminLevels()->get(1)->getName());
193
        $this->assertEquals('United States', $result->getCountry()->getName());
194
        $this->assertEquals('US', $result->getCountry()->getCode());
195
196
        // not provided
197
        $this->assertNull($result->getPostalCode());
198
        $this->assertNull($result->getSubLocality());
199
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
200
        $this->assertNull($result->getTimezone());
201
    }
202
203
    public function testGeocodeWithRealAddressWithBYLocale()
204
    {
205
        $provider = new Yandex($this->getHttpClient());
206
        $results = $provider->geocodeQuery(GeocodeQuery::create('ул.Ленина, 19, Минск 220030, Республика Беларусь')->withLocale('be-BY'));
207
208
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
209
        $this->assertCount(1, $results);
210
211
        /** @var Location $result */
212
        $result = $results->first();
213
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
214
        $this->assertEquals(53.898077, $result->getCoordinates()->getLatitude(), '', 0.01);
215
        $this->assertEquals(27.563673, $result->getCoordinates()->getLongitude(), '', 0.01);
216
        $this->assertNotNull($result->getBounds());
217
        $this->assertEquals(53.896867, $result->getBounds()->getSouth(), '', 0.01);
218
        $this->assertEquals(27.561624, $result->getBounds()->getWest(), '', 0.01);
219
        $this->assertEquals(53.899286, $result->getBounds()->getNorth(), '', 0.01);
220
        $this->assertEquals(27.565721, $result->getBounds()->getEast(), '', 0.01);
221
        $this->assertEquals(19, $result->getStreetNumber());
222
        $this->assertEquals('улица Ленина', $result->getStreetName());
223
        $this->assertEquals('Минск', $result->getLocality());
224
        $this->assertCount(1, $result->getAdminLevels());
225
        $this->assertEquals('Минск', $result->getAdminLevels()->get(1)->getName());
226
        $this->assertEquals('Беларусь', $result->getCountry()->getName());
227
        $this->assertEquals('BY', $result->getCountry()->getCode());
228
229
        // not provided
230
        $this->assertNull($result->getPostalCode());
231
        $this->assertNull($result->getSubLocality());
232
        $this->assertNull($result->getTimezone());
233
    }
234
235
    public function testReverseWithRealCoordinates()
236
    {
237
        $provider = new Yandex($this->getHttpClient());
238
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(48.863216489553, 2.388771995902061));
239
240
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
241
        $this->assertCount(5, $results);
242
243
        /** @var Location $result */
244
        $result = $results->first();
245
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
246
        $this->assertEquals(48.863212, $result->getCoordinates()->getLatitude(), '', 0.01);
247
        $this->assertEquals(2.388773, $result->getCoordinates()->getLongitude(), '', 0.01);
248
        $this->assertNotNull($result->getBounds());
249
        $this->assertEquals(48.86294, $result->getBounds()->getSouth(), '', 0.01);
250
        $this->assertEquals(2.387497, $result->getBounds()->getWest(), '', 0.01);
251
        $this->assertEquals(48.877038, $result->getBounds()->getNorth(), '', 0.01);
252
        $this->assertEquals(2.406587, $result->getBounds()->getEast(), '', 0.01);
253
        $this->assertNull($result->getStreetNumber());
254
        $this->assertEquals('Avenue Gambetta', $result->getStreetName());
255
        $this->assertEquals('Париж', $result->getLocality());
256
        $this->assertEquals('XX округ', $result->getSubLocality());
257
        $this->assertCount(2, $result->getAdminLevels());
258
        $this->assertEquals('Париж', $result->getAdminLevels()->get(2)->getName());
259
        $this->assertEquals('Иль-Де-Франс', $result->getAdminLevels()->get(1)->getName());
260
        $this->assertEquals('Франция', $result->getCountry()->getName());
261
        $this->assertEquals('FR', $result->getCountry()->getCode());
262
263
        // not provided
264
        $this->assertNull($result->getPostalCode());
265
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
266
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
267
        $this->assertNull($result->getTimezone());
268
269
        /** @var Location $result */
270
        $result = $results->get(1);
271
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
272
        $this->assertEquals(48.864848, $result->getCoordinates()->getLatitude(), '', 0.01);
273
        $this->assertEquals(2.3993549, $result->getCoordinates()->getLongitude(), '', 0.01);
274
275
        /** @var Location $result */
276
        $result = $results->get(2);
277
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
278
        $this->assertEquals(48.856929, $result->getCoordinates()->getLatitude(), '', 0.01);
279
        $this->assertEquals(2.341197, $result->getCoordinates()->getLongitude(), '', 0.01);
280
    }
281
282
    public function testReverseWithRealCoordinatesWithUSLocaleAndStreeToponym()
283
    {
284
        $provider = new Yandex($this->getHttpClient(), 'street');
285
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(48.863216489553, 2.388771995902061)->withLocale('en-US'));
286
287
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
288
        $this->assertCount(5, $results);
289
290
        /** @var Location $result */
291
        $result = $results->first();
292
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
293
        $this->assertEquals(48.87132, $result->getCoordinates()->getLatitude(), '', 0.01);
294
        $this->assertEquals(2.404017, $result->getCoordinates()->getLongitude(), '', 0.01);
295
        $this->assertNotNull($result->getBounds());
296
        $this->assertEquals(48.86294, $result->getBounds()->getSouth(), '', 0.01);
297
        $this->assertEquals(2.387497, $result->getBounds()->getWest(), '', 0.01);
298
        $this->assertEquals(48.877038, $result->getBounds()->getNorth(), '', 0.01);
299
        $this->assertEquals(2.406587, $result->getBounds()->getEast(), '', 0.01);
300
        $this->assertNull($result->getStreetNumber());
301
        $this->assertEquals('Avenue Gambetta', $result->getStreetName());
302
        $this->assertEquals('20e Arrondissement', $result->getSubLocality());
303
        $this->assertEquals('Paris', $result->getLocality());
304
        $this->assertCount(2, $result->getAdminLevels());
305
        $this->assertEquals('Paris', $result->getAdminLevels()->get(2)->getName());
306
        $this->assertEquals('Ile-de-France', $result->getAdminLevels()->get(1)->getName());
307
        $this->assertEquals('France', $result->getCountry()->getName());
308
        $this->assertEquals('FR', $result->getCountry()->getCode());
309
310
        // not provided
311
        $this->assertNull($result->getPostalCode());
312
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
313
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
314
        $this->assertNull($result->getTimezone());
315
316
        /** @var Location $result */
317
        $result = $results->get(1);
318
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
319
        $this->assertEquals(48.863230, $result->getCoordinates()->getLatitude(), '', 0.01);
320
        $this->assertEquals(2.388261, $result->getCoordinates()->getLongitude(), '', 0.01);
321
322
        /** @var Location $result */
323
        $result = $results->get(2);
324
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
325
        $this->assertEquals(48.866022, $result->getCoordinates()->getLatitude(), '', 0.01);
326
        $this->assertEquals(2.389662, $result->getCoordinates()->getLongitude(), '', 0.01);
327
328
        /** @var Location $result */
329
        $result = $results->get(3);
330
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
331
        $this->assertEquals(48.863918, $result->getCoordinates()->getLatitude(), '', 0.01);
332
        $this->assertEquals(2.387767, $result->getCoordinates()->getLongitude(), '', 0.01);
333
334
        /** @var Location $result */
335
        $result = $results->get(4);
336
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
337
        $this->assertEquals(48.863787, $result->getCoordinates()->getLatitude(), '', 0.01);
338
        $this->assertEquals(2.389600, $result->getCoordinates()->getLongitude(), '', 0.01);
339
    }
340
341
    public function testReverseWithRealCoordinatesWithUALocaleAndHouseToponym()
342
    {
343
        $provider = new Yandex($this->getHttpClient(), 'house');
344
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(60.4539471768582, 22.2567842183875)->withLocale('uk-UA'));
345
346
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
347
        $this->assertCount(5, $results);
348
349
        /** @var Location $result */
350
        $result = $results->first();
351
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
352
        $this->assertEquals(60.454462, $result->getCoordinates()->getLatitude(), '', 0.01);
353
        $this->assertEquals(22.256561, $result->getCoordinates()->getLongitude(), '', 0.01);
354
        $this->assertNotNull($result->getBounds());
355
        $this->assertEquals(60.45345, $result->getBounds()->getSouth(), '', 0.01);
356
        $this->assertEquals(22.254513, $result->getBounds()->getWest(), '', 0.01);
357
        $this->assertEquals(60.455474, $result->getBounds()->getNorth(), '', 0.01);
358
        $this->assertEquals(22.258609, $result->getBounds()->getEast(), '', 0.01);
359
        $this->assertEquals(36, $result->getStreetNumber());
360
        $this->assertEquals('Bangårdsgatan', $result->getStreetName());
361
        $this->assertEquals('Турку', $result->getLocality());
362
        $this->assertEquals('Кескуста', $result->getSubLocality());
363
        $this->assertCount(2, $result->getAdminLevels());
364
        $this->assertEquals('Исконная Финляндия', $result->getAdminLevels()->get(2)->getName());
365
        $this->assertEquals('Юго-Западная Финляндия', $result->getAdminLevels()->get(1)->getName());
366
        $this->assertEquals('Фінляндія', $result->getCountry()->getName());
367
        $this->assertEquals('FI', $result->getCountry()->getCode());
368
369
        // not provided
370
        $this->assertNull($result->getPostalCode());
371
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
372
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
373
        $this->assertNull($result->getTimezone());
374
    }
375
376
    public function testReverseWithRealCoordinatesWithTRLocaleAndLocalityToponym()
377
    {
378
        $provider = new Yandex($this->getHttpClient(), 'locality');
379
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(40.900640, 29.198184)->withLocale('tr-TR'));
380
381
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
382
        $this->assertCount(5, $results);
383
384
        /** @var Location $result */
385
        $result = $results->first();
386
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
387
        $this->assertEquals(40.874651, $result->getCoordinates()->getLatitude(), '', 0.01);
388
        $this->assertEquals(29.129562, $result->getCoordinates()->getLongitude(), '', 0.01);
389
        $this->assertNotNull($result->getBounds());
390
        $this->assertEquals(40.860413, $result->getBounds()->getSouth(), '', 0.01);
391
        $this->assertEquals(29.107230, $result->getBounds()->getWest(), '', 0.01);
392
        $this->assertEquals(40.876111, $result->getBounds()->getNorth(), '', 0.01);
393
        $this->assertEquals(29.139021, $result->getBounds()->getEast(), '', 0.01);
394
        $this->assertNull($result->getStreetName());
395
        $this->assertNull($result->getStreetNumber());
396
        $this->assertEquals('Büyükada', $result->getLocality());
397
        $this->assertCount(2, $result->getAdminLevels());
398
        $this->assertEquals('Adalar', $result->getAdminLevels()->get(2)->getName());
399
        $this->assertEquals('İstanbul', $result->getAdminLevels()->get(1)->getName());
400
        $this->assertEquals('Türkiye', $result->getCountry()->getName());
401
        $this->assertEquals('TR', $result->getCountry()->getCode());
402
403
        // not provided
404
        $this->assertNull($result->getPostalCode());
405
        $this->assertNull($result->getSubLocality());
406
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
407
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
408
        $this->assertNull($result->getTimezone());
409
    }
410
411
    public function testReverseMetroStationToGetName()
412
    {
413
        $provider = new Yandex($this->getHttpClient(), 'metro');
414
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(60.036843, 30.324285));
415
416
        /** @var YandexAddress $first */
417
        $first = $results->first();
418
        $this->assertEquals('метро Озерки', $first->getName());
419
    }
420
}
421