route4me 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +10 -0
- data/Gemfile +2 -0
- data/README.md +72 -0
- data/VERSION +1 -0
- data/examples/addresses.json +410 -0
- data/examples/get_route_manifest.rb +6 -0
- data/examples/get_route_tracking.rb +9 -0
- data/examples/helper.rb +7 -0
- data/examples/multiple_depot_multiple_driver.rb +20 -0
- data/examples/multiple_depot_with_time_window.rb +20 -0
- data/examples/reoptimization.rb +9 -0
- data/examples/single_driver_round_trip.rb +20 -0
- data/examples/single_driver_route_ten_stops.rb +18 -0
- data/examples/track.rb +14 -0
- data/lib/route4me.rb +119 -0
- data/lib/route4me/enum/algorithm_type.rb +11 -0
- data/lib/route4me/enum/avoid.rb +8 -0
- data/lib/route4me/enum/device_type.rb +9 -0
- data/lib/route4me/enum/direction_method.rb +7 -0
- data/lib/route4me/enum/distance_unit.rb +6 -0
- data/lib/route4me/enum/metric.rb +9 -0
- data/lib/route4me/enum/optimization_type.rb +7 -0
- data/lib/route4me/enum/travel_mode.rb +7 -0
- data/lib/route4me/errors/api_error.rb +4 -0
- data/lib/route4me/errors/route4me_error.rb +16 -0
- data/lib/route4me/optimization_problem.rb +40 -0
- data/lib/route4me/route.rb +21 -0
- data/lib/route4me/track.rb +17 -0
- data/lib/route4me/util.rb +28 -0
- data/lib/route4me/version.rb +3 -0
- data/route4me.gemspec +24 -0
- data/spec/route4me/optimization_problem_spec.rb +217 -0
- data/spec/route4me/route_spec.rb +60 -0
- data/spec/route4me/track_spec.rb +35 -0
- data/spec/spec_helper.rb +49 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0879f426bd8d43e25b855a940717c91b58c6b8a3
|
4
|
+
data.tar.gz: 6bdc3b5ed82c878889a5aeb8d2a9a531a022d323
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e75c447be83c2e45f7c85218b86743d588e9145cac3fe7c22ba89c404518797d5f10b52ea07ff3b9cd548395b89ab8ded5e73ad39a714f6b28d3d9b825b1fa12
|
7
|
+
data.tar.gz: cfc64a48993dba14010710d9b92f910db4073b6c1641074f28edae5dcd1af4a3b17ad429b8660845febc434e9c8421071c1f4ffede0f49f6394097c5ead0580e
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
Route4Me Ruby SDK
|
2
|
+
-----------------
|
3
|
+
|
4
|
+
Access Route4Me's logistics-as-a-service API using our Ruby SDK
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
```
|
9
|
+
gem install --source https://github.com/route4me/route4me-ruby-sdk route4me
|
10
|
+
# or
|
11
|
+
gem install route4me
|
12
|
+
```
|
13
|
+
|
14
|
+
## Usage example
|
15
|
+
|
16
|
+
### Single Driver Route Optimization
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'route4me'
|
20
|
+
require './addresses'
|
21
|
+
|
22
|
+
Route4me.api_key = '11111111111111111111111111111111'
|
23
|
+
problem = Route4me::OptimizationProblem.optimize(
|
24
|
+
:addresses => addresses.first(10),
|
25
|
+
:parameters => {
|
26
|
+
:algorithm_type => Route4me::AlgorithmType::TSP,
|
27
|
+
:distance_unit => Route4me::DistanceUnit::MILES,
|
28
|
+
:device_type => Route4me::DeviceType::WEB,
|
29
|
+
:optimize => Route4me::OptimizationType::DISTANCE,
|
30
|
+
:travel_mode => Route4me::TravelMode::DRIVING,
|
31
|
+
:vehicle_capacity => 1,
|
32
|
+
:vehicle_max_distance_mi => 10000
|
33
|
+
}
|
34
|
+
)
|
35
|
+
|
36
|
+
puts problem
|
37
|
+
```
|
38
|
+
|
39
|
+
### Multiple Depot Multiple driver route optimization
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
require 'route4me'
|
43
|
+
require './addresses'
|
44
|
+
|
45
|
+
Route4me.api_key = '11111111111111111111111111111111'
|
46
|
+
problem = Route4me::OptimizationProblem.optimize(
|
47
|
+
:addresses => addresses,
|
48
|
+
:parameters => {
|
49
|
+
:algorithm_type => Route4me::AlgorithmType::CVRP_TW_MD,
|
50
|
+
:distance_unit => Route4me::DistanceUnit::MILES,
|
51
|
+
:device_type => Route4me::DeviceType::WEB,
|
52
|
+
:optimize => Route4me::OptimizationType::DISTANCE,
|
53
|
+
:travel_mode => Route4me::TravelMode::DRIVING,
|
54
|
+
:route_max_duration => 86400,
|
55
|
+
:vehicle_capacity => 50,
|
56
|
+
:vehicle_max_distance_mi => 10000,
|
57
|
+
:parts => 50
|
58
|
+
}
|
59
|
+
)
|
60
|
+
|
61
|
+
puts problem
|
62
|
+
```
|
63
|
+
|
64
|
+
### More examples
|
65
|
+
|
66
|
+
Please see [examples](examples/) folder for more examples, which are to demonstrate examples of Route & GPS calls and some optimization problems (single driver, round trip, multiple driver, time window, re-optimization).
|
67
|
+
|
68
|
+
## Tests
|
69
|
+
|
70
|
+
```
|
71
|
+
rspec spec
|
72
|
+
```
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.1.0
|
@@ -0,0 +1,410 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"lng": -85.757308,
|
4
|
+
"lat": 38.251698,
|
5
|
+
"is_depot": true,
|
6
|
+
"time": 300,
|
7
|
+
"sequence_no": 0,
|
8
|
+
"address": "455 S 4th St, Louisville, KY 40202"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"lng": -85.793846,
|
12
|
+
"lat": 38.141598,
|
13
|
+
"is_depot": false,
|
14
|
+
"time": 300,
|
15
|
+
"sequence_no": 1,
|
16
|
+
"address": "1604 PARKRIDGE PKWY, Louisville, KY, 40214"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"lng": -85.786514,
|
20
|
+
"lat": 38.202496,
|
21
|
+
"is_depot": false,
|
22
|
+
"time": 300,
|
23
|
+
"sequence_no": 2,
|
24
|
+
"address": "1407 MCCOY, Louisville, KY, 40215"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"lng": -85.774864,
|
28
|
+
"lat": 38.178844,
|
29
|
+
"is_depot": false,
|
30
|
+
"time": 300,
|
31
|
+
"sequence_no": 3,
|
32
|
+
"address": "4805 BELLEVUE AVE, Louisville, KY, 40215"
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"lng": -85.821121,
|
36
|
+
"lat": 38.248684,
|
37
|
+
"is_depot": false,
|
38
|
+
"time": 300,
|
39
|
+
"sequence_no": 4,
|
40
|
+
"address": "730 CECIL AVENUE, Louisville, KY, 40211"
|
41
|
+
},
|
42
|
+
{
|
43
|
+
"lng": -85.800034,
|
44
|
+
"lat": 38.251923,
|
45
|
+
"is_depot": false,
|
46
|
+
"time": 300,
|
47
|
+
"sequence_no": 5,
|
48
|
+
"address": "650 SOUTH 29TH ST UNIT 315, Louisville, KY, 40211"
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"lng": -85.824638,
|
52
|
+
"lat": 38.176067,
|
53
|
+
"is_depot": false,
|
54
|
+
"time": 300,
|
55
|
+
"sequence_no": 6,
|
56
|
+
"address": "4629 HILLSIDE DRIVE, Louisville, KY, 40216"
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"lng": -85.775558,
|
60
|
+
"lat": 38.179806,
|
61
|
+
"is_depot": false,
|
62
|
+
"time": 300,
|
63
|
+
"sequence_no": 7,
|
64
|
+
"address": "4738 BELLEVUE AVE, Louisville, KY, 40215"
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"lng": -85.815094,
|
68
|
+
"lat": 38.259335,
|
69
|
+
"is_depot": false,
|
70
|
+
"time": 300,
|
71
|
+
"sequence_no": 8,
|
72
|
+
"address": "318 SO. 39TH STREET, Louisville, KY, 40212"
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"lng": -85.785118,
|
76
|
+
"lat": 38.179253,
|
77
|
+
"is_depot": false,
|
78
|
+
"time": 300,
|
79
|
+
"sequence_no": 9,
|
80
|
+
"address": "1324 BLUEGRASS AVE, Louisville, KY, 40215"
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"lng": -85.792854,
|
84
|
+
"lat": 38.162472,
|
85
|
+
"is_depot": false,
|
86
|
+
"time": 300,
|
87
|
+
"sequence_no": 10,
|
88
|
+
"address": "7305 ROYAL WOODS DR, Louisville, KY, 40214"
|
89
|
+
},
|
90
|
+
{
|
91
|
+
"lng": -85.783966,
|
92
|
+
"lat": 38.229584,
|
93
|
+
"is_depot": false,
|
94
|
+
"time": 300,
|
95
|
+
"sequence_no": 11,
|
96
|
+
"address": "1661 W HILL ST, Louisville, KY, 40210"
|
97
|
+
},
|
98
|
+
{
|
99
|
+
"lng": -85.822594,
|
100
|
+
"lat": 38.210606,
|
101
|
+
"is_depot": false,
|
102
|
+
"time": 300,
|
103
|
+
"sequence_no": 12,
|
104
|
+
"address": "3222 KINGSWOOD WAY, Louisville, KY, 40216"
|
105
|
+
},
|
106
|
+
{
|
107
|
+
"lng": -85.796783,
|
108
|
+
"lat": 38.153767,
|
109
|
+
"is_depot": false,
|
110
|
+
"time": 300,
|
111
|
+
"sequence_no": 13,
|
112
|
+
"address": "1922 PALATKA RD, Louisville, KY, 40214"
|
113
|
+
},
|
114
|
+
{
|
115
|
+
"lng": -85.796852,
|
116
|
+
"lat": 38.235847,
|
117
|
+
"is_depot": false,
|
118
|
+
"time": 300,
|
119
|
+
"sequence_no": 14,
|
120
|
+
"address": "1314 SOUTH 26TH STREET, Louisville, KY, 40210"
|
121
|
+
},
|
122
|
+
{
|
123
|
+
"lng": -85.789032,
|
124
|
+
"lat": 38.218662,
|
125
|
+
"is_depot": false,
|
126
|
+
"time": 300,
|
127
|
+
"sequence_no": 15,
|
128
|
+
"address": "2135 MCCLOSKEY AVENUE, Louisville, KY, 40210"
|
129
|
+
},
|
130
|
+
{
|
131
|
+
"lng": -85.781387,
|
132
|
+
"lat": 38.206154,
|
133
|
+
"is_depot": false,
|
134
|
+
"time": 300,
|
135
|
+
"sequence_no": 16,
|
136
|
+
"address": "1409 PHYLLIS AVE, Louisville, KY, 40215"
|
137
|
+
},
|
138
|
+
{
|
139
|
+
"lng": -85.839149,
|
140
|
+
"lat": 38.187511,
|
141
|
+
"is_depot": false,
|
142
|
+
"time": 300,
|
143
|
+
"sequence_no": 17,
|
144
|
+
"address": "4504 SUNFLOWER AVE, Louisville, KY, 40216"
|
145
|
+
},
|
146
|
+
{
|
147
|
+
"lng": -85.795059,
|
148
|
+
"lat": 38.241405,
|
149
|
+
"is_depot": false,
|
150
|
+
"time": 300,
|
151
|
+
"sequence_no": 18,
|
152
|
+
"address": "2512 GREENWOOD AVE, Louisville, KY, 40210"
|
153
|
+
},
|
154
|
+
{
|
155
|
+
"lng": -85.863319,
|
156
|
+
"lat": 38.166065,
|
157
|
+
"is_depot": false,
|
158
|
+
"time": 300,
|
159
|
+
"sequence_no": 19,
|
160
|
+
"address": "5500 WILKE FARM AVE, Louisville, KY, 40216"
|
161
|
+
},
|
162
|
+
{
|
163
|
+
"lng": -85.786201,
|
164
|
+
"lat": 38.193283,
|
165
|
+
"is_depot": false,
|
166
|
+
"time": 300,
|
167
|
+
"sequence_no": 20,
|
168
|
+
"address": "3640 LENTZ AVE, Louisville, KY, 40215"
|
169
|
+
},
|
170
|
+
{
|
171
|
+
"lng": -85.780037,
|
172
|
+
"lat": 38.17952,
|
173
|
+
"is_depot": false,
|
174
|
+
"time": 300,
|
175
|
+
"sequence_no": 21,
|
176
|
+
"address": "1020 BLUEGRASS AVE, Louisville, KY, 40215"
|
177
|
+
},
|
178
|
+
{
|
179
|
+
"lng": -85.814156,
|
180
|
+
"lat": 38.26498,
|
181
|
+
"is_depot": false,
|
182
|
+
"time": 300,
|
183
|
+
"sequence_no": 22,
|
184
|
+
"address": "123 NORTH 40TH ST, Louisville, KY, 40212"
|
185
|
+
},
|
186
|
+
{
|
187
|
+
"lng": -85.802867,
|
188
|
+
"lat": 38.151072,
|
189
|
+
"is_depot": false,
|
190
|
+
"time": 300,
|
191
|
+
"sequence_no": 23,
|
192
|
+
"address": "7315 ST ANDREWS WOODS CIRCLE UNIT 104, Louisville, KY, 40214"
|
193
|
+
},
|
194
|
+
{
|
195
|
+
"lng": -85.849937,
|
196
|
+
"lat": 38.182594,
|
197
|
+
"is_depot": false,
|
198
|
+
"time": 300,
|
199
|
+
"sequence_no": 24,
|
200
|
+
"address": "3210 POPLAR VIEW DR, Louisville, KY, 40216"
|
201
|
+
},
|
202
|
+
{
|
203
|
+
"lng": -85.811447,
|
204
|
+
"lat": 38.1754,
|
205
|
+
"is_depot": false,
|
206
|
+
"time": 300,
|
207
|
+
"sequence_no": 25,
|
208
|
+
"address": "4519 LOUANE WAY, Louisville, KY, 40216"
|
209
|
+
},
|
210
|
+
{
|
211
|
+
"lng": -85.798279,
|
212
|
+
"lat": 38.161839,
|
213
|
+
"is_depot": false,
|
214
|
+
"time": 300,
|
215
|
+
"sequence_no": 26,
|
216
|
+
"address": "6812 MANSLICK RD, Louisville, KY, 40214"
|
217
|
+
},
|
218
|
+
{
|
219
|
+
"lng": -85.788353,
|
220
|
+
"lat": 38.172031,
|
221
|
+
"is_depot": false,
|
222
|
+
"time": 300,
|
223
|
+
"sequence_no": 27,
|
224
|
+
"address": "1524 HUNTOON AVENUE, Louisville, KY, 40215"
|
225
|
+
},
|
226
|
+
{
|
227
|
+
"lng": -85.779816,
|
228
|
+
"lat": 38.209663,
|
229
|
+
"is_depot": false,
|
230
|
+
"time": 300,
|
231
|
+
"sequence_no": 28,
|
232
|
+
"address": "1307 LARCHMONT AVE, Louisville, KY, 40215"
|
233
|
+
},
|
234
|
+
{
|
235
|
+
"lng": -85.791962,
|
236
|
+
"lat": 38.26844,
|
237
|
+
"is_depot": false,
|
238
|
+
"time": 300,
|
239
|
+
"sequence_no": 29,
|
240
|
+
"address": "434 N 26TH STREET #2, Louisville, KY, 40212"
|
241
|
+
},
|
242
|
+
{
|
243
|
+
"lng": -85.80629,
|
244
|
+
"lat": 38.250397,
|
245
|
+
"is_depot": false,
|
246
|
+
"time": 300,
|
247
|
+
"sequence_no": 30,
|
248
|
+
"address": "678 WESTLAWN ST, Louisville, KY, 40211"
|
249
|
+
},
|
250
|
+
{
|
251
|
+
"lng": -85.790421,
|
252
|
+
"lat": 38.248882,
|
253
|
+
"is_depot": false,
|
254
|
+
"time": 300,
|
255
|
+
"sequence_no": 31,
|
256
|
+
"address": "2308 W BROADWAY, Louisville, KY, 40211"
|
257
|
+
},
|
258
|
+
{
|
259
|
+
"lng": -85.794257,
|
260
|
+
"lat": 38.233579,
|
261
|
+
"is_depot": false,
|
262
|
+
"time": 300,
|
263
|
+
"sequence_no": 32,
|
264
|
+
"address": "2332 WOODLAND AVE, Louisville, KY, 40210"
|
265
|
+
},
|
266
|
+
{
|
267
|
+
"lng": -85.783928,
|
268
|
+
"lat": 38.239697,
|
269
|
+
"is_depot": false,
|
270
|
+
"time": 300,
|
271
|
+
"sequence_no": 33,
|
272
|
+
"address": "1706 WEST ST. CATHERINE, Louisville, KY, 40210"
|
273
|
+
},
|
274
|
+
{
|
275
|
+
"lng": -85.792397,
|
276
|
+
"lat": 38.216465,
|
277
|
+
"is_depot": false,
|
278
|
+
"time": 300,
|
279
|
+
"sequence_no": 34,
|
280
|
+
"address": "1699 WATHEN LN, Louisville, KY, 40216"
|
281
|
+
},
|
282
|
+
{
|
283
|
+
"lng": -85.831787,
|
284
|
+
"lat": 38.186245,
|
285
|
+
"is_depot": false,
|
286
|
+
"time": 300,
|
287
|
+
"sequence_no": 35,
|
288
|
+
"address": "2416 SUNSHINE WAY, Louisville, KY, 40216"
|
289
|
+
},
|
290
|
+
{
|
291
|
+
"lng": -85.798355,
|
292
|
+
"lat": 38.158466,
|
293
|
+
"is_depot": false,
|
294
|
+
"time": 300,
|
295
|
+
"sequence_no": 36,
|
296
|
+
"address": "6925 MANSLICK RD, Louisville, KY, 40214"
|
297
|
+
},
|
298
|
+
{
|
299
|
+
"lng": -85.785082,
|
300
|
+
"lat": 38.212438,
|
301
|
+
"is_depot": false,
|
302
|
+
"time": 300,
|
303
|
+
"sequence_no": 37,
|
304
|
+
"address": "2707 7TH ST, Louisville, KY, 40215"
|
305
|
+
},
|
306
|
+
{
|
307
|
+
"lng": -85.826668,
|
308
|
+
"lat": 38.179394,
|
309
|
+
"is_depot": false,
|
310
|
+
"time": 300,
|
311
|
+
"sequence_no": 38,
|
312
|
+
"address": "2014 KENDALL LN, Louisville, KY, 40216"
|
313
|
+
},
|
314
|
+
{
|
315
|
+
"lng": -85.812012,
|
316
|
+
"lat": 38.273354,
|
317
|
+
"is_depot": false,
|
318
|
+
"time": 300,
|
319
|
+
"sequence_no": 39,
|
320
|
+
"address": "612 N 39TH ST, Louisville, KY, 40212"
|
321
|
+
},
|
322
|
+
{
|
323
|
+
"lng": -85.786781,
|
324
|
+
"lat": 38.261703,
|
325
|
+
"is_depot": false,
|
326
|
+
"time": 300,
|
327
|
+
"sequence_no": 40,
|
328
|
+
"address": "2215 ROWAN ST, Louisville, KY, 40212"
|
329
|
+
},
|
330
|
+
{
|
331
|
+
"lng": -85.78653,
|
332
|
+
"lat": 38.241611,
|
333
|
+
"is_depot": false,
|
334
|
+
"time": 300,
|
335
|
+
"sequence_no": 41,
|
336
|
+
"address": "1826 W. KENTUCKY ST, Louisville, KY, 40210"
|
337
|
+
},
|
338
|
+
{
|
339
|
+
"lng": -85.796211,
|
340
|
+
"lat": 38.224716,
|
341
|
+
"is_depot": false,
|
342
|
+
"time": 300,
|
343
|
+
"sequence_no": 42,
|
344
|
+
"address": "1810 GREGG AVE, Louisville, KY, 40210"
|
345
|
+
},
|
346
|
+
{
|
347
|
+
"lng": -85.825836,
|
348
|
+
"lat": 38.191753,
|
349
|
+
"is_depot": false,
|
350
|
+
"time": 300,
|
351
|
+
"sequence_no": 43,
|
352
|
+
"address": "4103 BURRRELL DRIVE, Louisville, KY, 40216"
|
353
|
+
},
|
354
|
+
{
|
355
|
+
"lng": -85.823463,
|
356
|
+
"lat": 38.259903,
|
357
|
+
"is_depot": false,
|
358
|
+
"time": 300,
|
359
|
+
"sequence_no": 44,
|
360
|
+
"address": "359 SOUTHWESTERN PKWY, Louisville, KY, 40212"
|
361
|
+
},
|
362
|
+
{
|
363
|
+
"lng": -85.792109,
|
364
|
+
"lat": 38.252781,
|
365
|
+
"is_depot": false,
|
366
|
+
"time": 300,
|
367
|
+
"sequence_no": 45,
|
368
|
+
"address": "2407 W CHESTNUT ST, Louisville, KY, 40211"
|
369
|
+
},
|
370
|
+
{
|
371
|
+
"lng": -85.786658,
|
372
|
+
"lat": 38.257616,
|
373
|
+
"is_depot": false,
|
374
|
+
"time": 300,
|
375
|
+
"sequence_no": 46,
|
376
|
+
"address": "225 S 22ND ST, Louisville, KY, 40212"
|
377
|
+
},
|
378
|
+
{
|
379
|
+
"lng": -85.786072,
|
380
|
+
"lat": 38.202122,
|
381
|
+
"is_depot": false,
|
382
|
+
"time": 300,
|
383
|
+
"sequence_no": 47,
|
384
|
+
"address": "1404 MCCOY AVE, Louisville, KY, 40215"
|
385
|
+
},
|
386
|
+
{
|
387
|
+
"lng": -85.799438,
|
388
|
+
"lat": 38.270061,
|
389
|
+
"is_depot": false,
|
390
|
+
"time": 300,
|
391
|
+
"sequence_no": 48,
|
392
|
+
"address": "117 FOUNT LANDING CT, Louisville, KY, 40212"
|
393
|
+
},
|
394
|
+
{
|
395
|
+
"lng": -85.7798,
|
396
|
+
"lat": 38.145851,
|
397
|
+
"is_depot": false,
|
398
|
+
"time": 300,
|
399
|
+
"sequence_no": 49,
|
400
|
+
"address": "5504 SHOREWOOD DRIVE, Louisville, KY, 40214"
|
401
|
+
},
|
402
|
+
{
|
403
|
+
"lng": -85.780251,
|
404
|
+
"lat": 38.211025,
|
405
|
+
"is_depot": false,
|
406
|
+
"time": 300,
|
407
|
+
"sequence_no": 50,
|
408
|
+
"address": "1406 CENTRAL AVE, Louisville, KY, 40208"
|
409
|
+
}
|
410
|
+
]
|