diff --git a/locations.xml b/locations.xml
new file mode 100644
index 0000000..510b3a3
--- /dev/null
+++ b/locations.xml
@@ -0,0 +1,14 @@
+
+
+ 12
+ CHURCH VIEW BP
+ 51.14
+ 0.2617
+
+
+ 14
+ CLARENDON BP
+ 51.6581
+ 0.2511
+
+
\ No newline at end of file
diff --git a/randomized_locations.xml b/randomized_locations.xml
new file mode 100644
index 0000000..0e1fbe4
--- /dev/null
+++ b/randomized_locations.xml
@@ -0,0 +1 @@
+0SCQDJ61.8894-36.1563
1KKPUWSBFB-63.8727-51.2882
2XMOMMNICNWX62.4102-51.4872
3TCMHGN-31.057318.4746
4TCJRIHVXQ-68.423040.3085
5HRLSDC74.5613-35.2504
6BMNABDISQ78.1670146.2634
7EKLXVJMFDTPS-44.8901-142.6200
8DFLXFMI81.2665-121.3723
9CQOMBFYU39.1032166.5576
10TWBQGUNHBCT-22.7520-58.0236
11WFMAYGF9.4846-78.7347
12MDMMSMUX79.6152-26.4326
13UIXHY31.6791-51.4784
14VBEYPOLTAS-20.4246-169.5330
15LVWUOVHXW8.2424-138.4754
16LYBUFARM74.5366170.4137
17VDQXWKQCJYFY-20.469037.0253
18BCGLFTT-6.572663.1453
19NLTJDDUOIHHHF-12.3050-97.7074
20MPRPXBDLHIGSV7.4775154.0151
21PNTRU-25.6136-134.0307
22AEVSCPXNDU-1.9771-149.3170
23NFVIIXMWHDO66.6236116.7332
24TKVYTCLHP88.75116.7024
25XWIDQXVYFX-74.011743.1903
26BKVFCN-22.7818-13.7016
27OFDGATRWK41.6186-15.0523
28TTVTDPTWJX-40.7307-27.0044
29BBJWSOUJ-34.8438178.1487
30PGCNTJ-45.2770-63.7328
31SRESORPPRNU-88.0500162.7968
32LXCMFIENSKXWMT35.2762-93.9888
33ETNWHWEC-79.4008-58.2156
34OBPCD5.704261.9524
35BJWXPWDJBTI-0.9041-27.3002
36XLOIK43.480071.7355
37GYNORUXLGU-44.7413119.0386
38CGSQN77.6308-147.1934
39HDBIJXL38.8254-140.7807
40YXUKVIQNV75.940233.0155
41TWXSJD-20.361246.4116
42FPAODDO-66.145811.2207
43OTBOPIB-72.7104173.1526
44SXGAONOIHGG46.621227.4376
45FJNDGKTLDT26.4246132.7243
46PAYNPMETLL-73.9142-139.0580
47VVKMNTILEALP77.5958-16.9088
48BHUFOAMLXEYKO-45.219697.2378
49WWUJKYJFCUTSP32.0746-98.9482
50HQAPWSCYBIE-32.8364-51.7091
51IWVWIGVDVC-71.4030-178.5228
52DQQRS88.79444.6022
53ECPVW58.1971-12.0080
54INUNMQD52.3984112.7362
55BAQRYBWQIMUNV59.7301127.4957
56CRPSRTANM69.931125.8233
57KHRELJVTR70.7587-104.5817
58PFAFW-85.7765141.8934
59NUDIFPJK78.719631.6877
60SJMIA-78.6602146.9437
61BTMUO32.8035-149.4501
62TTVGT-53.7846-127.4397
63LNOPCUL20.748062.4295
64LILXXJJUMKDE-30.2623-137.8488
65LKSTTXSIHQ-17.247075.3638
66VVHLLXOETU34.4685114.5711
67BGYSKXIXHTIBJI-10.6161-144.6209
68WHXDTJVCBX12.550279.1004
69OOLNQJSMVK61.7868-81.9198
70PJVLW53.2117-116.8670
71SSCKNSJV-41.7716-123.6061
72YUISD89.6685103.1871
73XYTGTIBBXHYYT1.2303-13.4887
74EQABJKMMUWYA-52.7577-25.4907
75OAHIHGDQUSVJJ-17.9596-83.8773
76BTNMGD-26.3776-35.7134
77XTCJLY-80.5737-145.4263
78TTRKJGBEEJRBO77.8209-166.5334
79DAGJLOVWGQX0.365578.8058
80RAJJBBGDM-49.7828176.6803
81LSISAAXCHTKQ-33.6866-132.9767
82AIQMRJGBFKWKCH-58.7342-162.6384
83HGASJMCGKQXRT-25.4347-58.0961
84CRPNAHIWVY-32.5921-70.6067
85AHDITLOKMWG-33.5559-107.5786
86VKITUEFGNTPJJT70.6798-111.4266
87TQRPDPP-8.033636.3592
88CBGOYXLWMICIS0.3155-24.7540
89KRSDEM-51.5767-168.7791
90ITBCBIHPAI63.5483102.3127
91SHBGHS24.0749-77.8755
92UPPRWPM-72.0894159.2122
93JMIBUWOFWRIAL13.8970169.1194
94YRHYGEWEFR37.6016-6.0576
95BQYKKCLLYS-2.2668-93.1341
96MCYFUXKRADGJ-7.2261-30.6157
97LNJYCB40.9726150.7023
98NBJBXAOXVFLU-7.9942-81.2618
99YHLXKCVK-53.0478-124.1014
100ADXHC19.9157-57.1892
101WMSDWJPFPYECCU-79.988710.6547
102PCOEOPBLO2.6945-177.6227
103RUKFF69.6939171.4203
104IPJFVHNRL-58.3801-34.9522
105AFGGNUFFY88.3523100.2769
106XIKSIL50.8664-19.8739
107BPFUFVKCP37.315367.0105
108KWQJQ-75.447367.1944
109WHVYDQYIGSOOS-62.0308-26.4029
110PQEFQEFLJOYXL82.5362-175.1211
111AIDEHFBY-75.8127-160.4363
112YLBFAM75.5323-82.6821
113ANHPDUKCFNDYET-37.1843-162.2584
114EUONTJRKFAQCO25.2190147.6916
115LVEJPN47.5559-62.1698
116HGQYURCT41.6100106.6883
117MPOLHVYGJOJC17.3641128.5586
118TMYUWAATUGOCC-78.3038-10.0760
119LGQPMRVAKYJVP15.929326.1232
120EBESPRLQQOOVK54.1705-83.0565
121KLHMJRPCIXBJN72.5414138.5629
122BNEREPR49.0390-18.6547
123MQRAJHWCRDRVT47.9150122.2772
124ANOFYHAAMK5.8674-60.9809
125NEWTI-47.0525-13.6483
126KTVGGBEIVDUFN-67.413915.1071
127VPILIOKWTKQUC-6.655990.9171
128BUXRGDE73.5200-33.2103
129KNPFPKAQI-66.1945-129.7011
130JOICVPTKHLTAYL37.2913-97.5762
131XUYGFSYFOXFI42.6185-59.0904
132FBDMJNUMVKR51.8721168.7848
133EJKQSVINOL9.370421.4927
134JEQAMQLSV-66.3110149.6636
135NULRQYSFPOP23.0885-138.9251
136OAAFBIML-45.567219.6762
137OUMXRN28.4591-35.6426
138JKGMF80.3929-67.4247
139WBKCRODGEMDR-44.951798.1938
140JXIIGMN8.9868-178.4934
141BNDAGVLNMMT-74.853698.8768
142LJHGEQCELCWQAB19.2434-139.7704
143PKJSVDWDHQLBK-80.090253.5623
144AUPVJCQYHIOQYF-46.654039.7994
145NOFMYJNJ56.5836-122.3237
146XLFGSTGA10.117997.7121
147UYGHNCWL-5.905095.8632
148JRKPNHCJHV-27.5685-101.6895
149PQGBMQGWAALFP-50.523690.5777
150GIPARBKA35.4864132.8519
151NJIJYAETII11.6579-86.3913
152NFFHCCBELOE5.5367118.7703
153XFEERFSPARNRVV13.0165165.9115
154DRRIRUX0.9805146.1100
155LUNNVOLOLMGGP-38.249156.6473
156OGBFMUSGRG-30.2978152.7796
157CGODE69.412296.2450
158QXXNPCVTXSULWF-67.212198.2155
159UNFQIDRU43.1409110.4665
160EXAOFVECDPIGGA-23.1935-77.5976
161JWUXG80.0498-89.7199
162KMBCB-57.8811-11.7514
163NUYIQMWTLYQWE-5.5764-1.2270
164VDWHLC7.5933100.5977
165BANSGQ-27.0792-45.6957
166WGSRQDM-37.081055.9256
167LPKJHPLEIVPDXA-38.671342.5904
168IKGUEGF65.5978-50.8411
169YKEMVQENVX-32.5095-31.3591
170ANMSAATURRJ30.2651-23.3822
171COYDAD31.8743-20.9267
172MQCCXNKT33.467152.0448
173WJKEINMEGQMA-39.950865.5476
174WXAXM-7.7393-142.9199
175OWKEARSHE17.1981114.9170
176LUDUITLPI-29.0297-0.5052
177KKSBEXCEAV-24.0115-153.5054
178KPNKWU6.3162-116.8709
179LKYKQIUSYLF5.6604-143.0866
180CVJQTGQ33.58877.7805
181QUPRTQPMPLE8.2861-125.0743
182OTNOMOJER-60.1049166.0463
183NKFXIXY19.4839-35.8107
184BUUGGYTMBTIJ36.4520136.3568
185UGACKUGEXHVWP-62.0101123.1605
186NGYRQLW-54.733310.2892
187BTPJH69.0934-39.4831
188AGXWXHBTAUXQ76.8850177.7732
189OIUSVSDBBEHXC-64.0283-69.6226
190CQSTHJOPGWURGP27.7302150.3521
191VDASAP-2.5511-109.4102
192CNGVRXJ11.6659149.0360
193GMGQGADEJ7.9256-85.7723
194KELBDGLXQ76.0692-161.1366
195VVTAE-75.911880.1832
196CCYCVYLULNSM-78.205355.9361
197SRCDGK49.5207-40.8554
198TAGYOIK-58.787196.0408
199ASASF58.3342102.5367
200MLFEE-6.6753-71.0949
201SABNDKSLCLTXXD10.443589.7401
202SLMEIIQECUAKK-5.0273-64.4090
203LPNBDXSUU-16.502132.4432
204KIHYS13.435431.2598
205WXHGLAPCUE-22.29320.3281
206BKBSTBJEY28.449475.0496
207FKYJVABUMYMUL-44.7679-90.5208
208PNJOQH78.1133102.8941
209QMJNEBHDWGO-72.018457.2038
210UPLIOPLVYWTAW36.8314-178.9313
211LLDCAVMP-7.9818-12.7979
212CWGPIK-73.9327-160.1303
213BGAFHTTKA-56.379486.9926
214KFUIKNRU41.7942109.3673
215KIDSY-42.0034-116.0057
216SWGLAWAEI23.612277.3595
217QYUEJGWSWH-47.3561-31.2534
218QUEKITOQUXLMKV-20.3481-90.0313
219OVJJNUIXBV52.275777.7163
220ESVOUWUKJEVWR64.5603-104.0958
221SNFAPXRMFXWLG-48.3264-60.9911
222TFQNXFXOTDNU76.6798-80.9719
223OAAFPWQYECFI62.7213-150.7076
224VTTIGMBRAO71.776948.8935
225OYOWSEAG-85.883795.8313
226ASCNTB-5.2151143.8472
227QYGXWCLNDRUBN-85.983121.7760
228DLKEJWK-32.5025110.6392
229DPSGUXBFF20.6593143.5322
230EASVMVORVKFH-6.3158102.4563
231RANWOQJHDB42.19982.4197
232LBJNCDIET56.0104176.9445
233MIOQOJROHNVSGY57.0375175.3968
234FSESAMUUVWEYLU-39.5367-161.2213
235VCHQHLHPDE35.3334160.7269
236EJNLTDUFT-77.6038-123.3854
237KBBHBF-76.9073163.0630
238TPLCMYRJTUFIFX42.0947-29.9270
239QWJUVXVIKGJTF55.9728-163.3360
240FUFBUXJL-71.2767-75.2734
241GALIJHLM45.756348.7143
242KOHXIQNQHS84.912298.8106
243AYEQEQDXGPC-62.186226.4273
244FBSAMJDGX-47.232142.6494
245IACYHKFUE-1.412416.2153
246KJVGRPNPRHFDQD76.2855136.8325
247BFKUYVLSEBX-40.8392-167.0837
248DIDSINCIVELJXT-15.7613-81.0275
249ONBQMLRKXQQEG1.821586.8258
250SEEOWDGIPYFS-86.287428.0893
251IBLVAHFUKEB38.1788-73.2272
252CBAMTJJO70.171482.9577
253VTHATJKCT-19.643798.7720
254FMRFSQQH-47.6544-156.5926
255EJKMMXOPKDSX89.4336-20.4265
256HIQKVCKENHA-53.6655-36.4467
257CSFIEMEPBGJOJP11.6493175.1754
258YEJCCGUXTXV-88.9844-33.4529
259HNSELBADL83.5275-91.6027
260AIXCSJPOAYRJJ45.3781-177.6117
261DIPTFXTFGFFPFO34.6763-93.1706
262VRVTFLEYBFKC-24.0473-86.6073
263UQGMLJTJHBF51.568079.9489
264TQKXYFC-34.9454-89.7849
265ALKDTXLFVMMTL-6.099525.8888
266UIFQRRGFCAC47.391034.2794
267LWBFGRMMQ-0.832998.1008
268YRVTMHQL64.7911-126.7741
269EHRNYIKGPKTO-1.9261-107.9271
270UVVLLQGY-4.7620-95.8630
271RGBWHUJMT23.7535127.1008
272MKUPKCFVBKTC-81.1590-177.3869
273OXKBSBGIIMSRCN46.4506136.8507
274WEONKL-5.200969.3119
275JYVTXN-72.277571.9729
276QXDIGI21.2702-57.2844
277JFGRBTMSRFOJJA-9.89265.9828
278CMIJAWGV5.2789163.3933
279OOTBXCLPM32.728712.0710
280UMAQWUFPPLXLDO17.132961.1389
281EDEKGDHGA86.9332-138.4354
282VTVUQY-73.7080-87.1280
283YXBYXYFNUJPG-39.7192179.2927
284AWULCGTBI-83.9210-26.0260
285JOYUBGLRJFQYEM-89.1088159.2591
286FUMUOSPC-28.741438.2791
287LQQGS47.6205150.6299
288HQHTTUACU-3.225716.4191
289SGNRYR45.2940101.5718
290NWDJNRHQLXC-11.212190.5677
291ISUHCHVE-61.1919-52.9970
292PXSOFEQ60.1387-41.2316
293CTJGCK38.463366.3406
294TSQGB-20.2822-74.3722
295JVOEDKUQQSKYC87.7921121.7806
296APWRO-65.7851-49.8561
297RCOCTNKTK32.6171-78.0694
298NTGLHXFPYI-12.612358.8462
299EUABICWCN53.8793-44.0953
300BIKAOFWIGIPRRY-56.9177134.9195
301FAIFORWFBLWQ-67.854389.1866
302CAJLHYVXCDVPL-72.5691-75.0436
303HVXPVDDTR-37.2723-123.7758
304ECDLSRS44.9285147.0006
305WKLWWCOTR56.4038-12.8657
306KOFGVOFSSK83.4616157.1383
307JFVPYIG-70.057418.3842
308XJLJVFQ-70.351999.7057
309DDSCLGJGIEEQR-75.4433178.5480
310SESXYLCSCDUMU-12.456285.1419
311RBMDFEXSGRPV-4.261550.7056
312TUVXCMKEAKI63.685856.0058
313NEEWKDACDBNBQ-78.366810.4908
314XGHOP-30.1335127.3884
315PCETQJ53.2428-149.5340
316TMUQXMX-61.3700-101.7661
317JFYMKWLCSCQP87.9867-79.2989
318IVKYSXMOTYMSI13.0800-161.5258
319EPWMFGRWKJ-85.2186139.9322
320ORMKNGXR-43.8715112.5177
321NKQSDONCBQ26.5471-162.0785
322SNFJFSYBSY-13.6462-60.8333
323QBVHWMPRMJ-74.5727-48.4340
324YDGVJYTRAER-80.7270-74.4425
325EKHKTABTB-76.129444.9196
326DJHHYF-31.5227-78.3976
327OCGNNYVM16.006213.3976
328KQVMJIAFCYTFK-2.4891-36.6599
329FHALAPTCOLEGG-77.5811-45.0183
330RSCJLUCM20.220820.7473
331LYNJPTLHWNTBQ-58.4382-2.2016
332YLDEMIOJBHR-41.1446-6.2109
333KENEY3.4287-84.2154
334JPVHMBGOBQXTEC-21.892319.7191
335MATKN23.8940146.4884
336EAHSCYFDMVL70.6986114.6183
337AFHWI55.442471.3277
338BCUGWJF-15.2612169.4270
339QGNSIWCONQWQBY-82.713885.4721
340UJITEOIEYUBAQ79.6762-113.4263
341YKKSKSYVLNGD-53.3036178.4465
342ONEQUVXHFY-83.711950.7635
343WIODGOHX25.524730.1627
344FASMGXBILQSTV-58.3257173.3405
345AFKBQ-51.3162-179.4980
346DGUMQFE18.5527-29.1663
347IJYMYERY47.540990.5710
348DACKP72.951420.8340
349CNMUCG48.666264.6178
350IKRLNU-80.5270-81.3679
351MMDFEJ51.4000-105.2593
352SDPELY-17.917832.2564
353IXYNOOLR61.893365.6016
354CJMBHUONLLU-72.7930-77.1009
355NEHFFSMNBFVR-57.3920-166.1125
356RUEJLRDGKOMYR33.7487110.7956
357DCOFS51.860324.5972
358LRXIQKNF-3.4669-2.9196
359WAAJEHLLDI-84.398281.0622
360SOVYKUMWKAWMKG-12.391664.6261
361IAVGJFXAXC48.1498-37.1813
362WFAUMMUCFF-88.9181161.1803
363MUQWL-23.4584110.8606
364OUMLQLOTRNGW-13.1749-102.0312
365RSXKQNSHESR-36.48336.5230
366QTNRM22.589791.0826
367AKCEFJVXOJSXYG67.135355.8912
368WCQNEURPUMEJ-28.920653.5029
369CQBDSPDITO-66.485958.6758
370PTKTW-18.6242130.7526
371WRHRP-19.4885-37.8137
372AETOLXQMGVA8.7548-45.5033
373DAHLUKP-9.329870.5474
374UXHJIOBHRASHUJ57.8223-113.6975
375QJKQG-16.638416.5462
376ECXHNHQPNXC34.1782-55.5126
377TORJLWE-54.7595112.7149
378PUAPTML-5.98679.0573
379BWIFC-51.6322151.0404
380IDSNWRDKHD-2.303661.6415
381BUTSBPVBLFNSH14.4774-143.8672
382FNULDL84.7466-14.5609
383MLMEWFPAXM87.8369168.9467
384OCEVTCRB62.047442.1690
385XRLKNUYY31.5056-56.7329
386IWXCXYUBJBAR22.489585.8866
387QQRAJY-47.1167-86.8506
388XRGHWAOMMUC75.821556.8315
389SGJNAYDDJPQIFS-39.1564102.7421
390WCVQICJPHY-80.7341160.0165
391FTTDKKEWV80.010981.4290
392SDMMOMSDXGXBR59.8212-167.2848
393EDSFUPVGR-79.686492.6625
394TKTQYPWF-53.23463.8781
395YMEQKUL-66.50295.8720
396KJCSFCR36.3270-44.3662
397TENHDTCSCWCCU-87.7347-51.8223
398JXYXS32.8494-174.2921
399VCLUKOWREBPIN58.388214.6698
400UXIJCMDDVS-85.244122.0641
401RESEFSK-38.6139106.9083
402RWNEYFFOIO-55.3727-11.6692
403CELBW-87.5676107.6455
404SCPSEXILGUUA-63.0420-30.1458
405IHOHVJQRK-15.411891.1742
406VHBSGBRMUAOTI4.493715.5338
407HEWFIWESXPEN-4.9537143.6250
408FJOJBVKNGDE-6.7038-154.0806
409VMDYXVYF-24.6614-35.6705
410ONSKCBPLL75.5846-76.7828
411LBQKVTHYNK-72.2721-89.6699
412RRBIXGMUDRGEU-86.0071152.0138
413VDVWAR87.6821-111.5589
414OSPDWSNMYEFW14.4755-132.1650
415GSNTIVU40.075315.0445
416YXPODNKPBBQR-6.0488156.7661
417XJOWNGVYPRVSIK-67.1006-88.4274
418JWNFQRNWB87.4577-104.0308
419WMCUFRFQSLRFSX40.7874102.0666
420NDIYATVTFFFTXQ65.5463131.0896
421SVCLNPVQS3.27369.5869
422EHIXU-75.1466-136.1170
423AXQSXGUPOJC35.701337.0150
424HFDUOIYGYOLB67.4264-74.0467
425CTQRTBPNHAMO0.3772-113.7506
426IMHIISW20.6671155.0984
427FYDBXTJO-60.073933.5391
428GBYLCBCQ71.5886-103.8798
429CSUGONMCHMP-59.8397-22.3520
430YJJRODERJPIGE-49.3994175.7557
431JEWMVCTJHT-4.3615174.4669
432YBXQTO7.8816167.6075
433PSRLTDXRPPOETS48.2106-124.7564
434CXXFMEWIHXGH54.0964-70.7402
435XWLQSTTDTDQX-61.4011-11.9924
436AYMBNOL-86.6866-159.6491
437KITCWM-52.9793136.6785
438VSENJ39.4711155.1627
439XDQKVUCNVRRB19.679459.4453
440OEYOSVD80.1360-151.4991
441WLRUY-18.0762103.7637
442BJGTVVGF-25.901235.4586
443YVOEQW-33.1997-81.7509
444BGXYETDLMOSBVW63.0860155.1824
445FAOSFCT29.578181.9491
446EQNKTQY-2.3008-68.1977
447VLVLORVTTMD-58.06810.5831
448SOOMPAWR15.6217169.3939
449YJUMISSEUB-45.795241.8698
450KCVHCIWYFIMRTN-47.086017.4985
451CLOMPFHIACYDY-11.7949137.3268
452HSFURMBKR-53.6125159.4046
453EYSJLHYEVHIKF10.8156-118.5711
454FWLCSOI2.5596-66.0474
455IEKQQ31.1774-28.0243
456FGDNCOUOHNRE54.3111-24.6926
457RSYBOH36.56801.5340
458QFQKCICMSAYFDY28.105157.4597
459ENUOORJJYX42.4122-12.1315
460LQBGIUJRN-76.88827.2864
461RJIRQKPYE22.4313-92.0495
462PXQNBBPXXS21.667128.5242
463AWHLHCERK70.4172104.3307
464VQFIMMYNOYB49.5043-12.6252
465TITGKS-32.303744.0982
466JUIHLQYCGJY24.9940112.3472
467QQPCVBHMORSAY43.1424136.3866
468EEGCTRJ-82.1385152.6326
469KYVIVRCCKF-36.4950126.2308
470XHVUNU28.4340-98.0771
471UMPMJOK-47.279887.9212
472VRDOBCUSTOHODL-83.0500-179.5593
473JCUBKOHTQQKTS-83.0838-79.7670
474VVRTQFSPTSJA-18.9883-38.7446
475MQSCTJ0.5506-1.4548
476GGBTSIWMYLLS-79.5549170.3270
477CVDJJ-56.0613-121.8786
478EESIDY1.0297116.9323
479BBUHSWD-64.553215.4282
480FAXURD-67.8617-141.1167
481FTYDAFDTCJ10.7872-12.6612
482JSTSCPTNCT81.0912-73.9397
483HKVVTP68.8465-74.3544
484HINBFYWXR51.587276.3221
485AXDYBGQYFWEASS8.010962.4078
486FPDLYWKQJ53.262363.8180
487XMBYMNHNDPT20.2235107.3679
488AUEUV-58.2749-98.9297
489LQWWNYHFFA-2.1906-128.9709
490ANTWR-77.4052-130.9706
491TOWGAMNW-44.0907145.3146
492PMYOMME-16.7771137.3985
493TIUNNCGIAFBGHR-84.393261.1719
494JHLACIKLP-63.7881-140.5211
495ENBOSLIE-78.5718-160.8058
496XDIGBSEWJUQNH89.344057.8917
497HXEHIAMFVCSOQX-55.801642.1969
498IOQQOXOCV7.382060.1613
499EGTFYW-61.1800-28.1527
500IGTVNSDTKBM-47.956065.3626
501TYECUQLLF76.1557156.8860
502FADDF-29.7284-54.0727
503GRTFHQQHUH-78.364098.7678
504JWURDIIXYRCHCD-17.356525.8317
505RJSSOCFQYSD70.1897-94.6633
506UDIGS-80.508134.0356
507RTYANM57.6014171.4674
508OEBQRAM-38.3148140.0569
509VWEDUIDNUYW-58.1930-76.6879
510OTIOH-48.9467-7.8921
511SRUJTSAOMJSJF53.3331176.0855
512PATFLHUUUNUBCB34.9890-82.7337
513GGKDIJD75.633234.8685
514PNIKDPRIQGUXLG-39.2084137.9349
515GYOAHTTSDQCRKS31.3253132.9440
516NHSDUSWKOC3.8621-53.4729
517NDHAOR-57.5490-120.7303
518CHPYW27.5055178.0199
519UVXWAHDQ63.3718-72.8974
520GVVEOIHLAXPIT-11.1865157.8646
521VDKTBTJBXWYMF-37.1563-150.9796
522UXBEIILNDGUDKB67.9121-14.2738
523WNLAXTP-20.549583.9578
524XNWUTCEA-78.295250.8385
525QLVOPTRE64.4385-142.3637
526QQYTULJB87.286464.2547
527GNASEYJYPFN-45.7599102.5587
528EWUUEMLV-43.568941.9640
529VPPUY29.9802-175.6416
530GYFIV78.1760105.1655
531UMDNWMT-22.1648-163.4442
532EQBODFUTSG-34.948787.1167
533AGRLEXFHB29.2725112.5155
534AINFLNJW47.5829-55.0995
535DVBQQGTYDPMRUB0.7567126.9131
536TUVSQGJFN-63.6058136.0497
537MDMYGYRJEUFA32.0784-152.0288
538VALRCX-34.9195-174.9648
539PXAEKRBWOLF72.1868-155.2051
540DONBLEMUFR-14.798597.4920
541LOLTWCCOHHQOLW26.121068.1492
542TKCNAXJ-3.4240-31.3848
543IDRYVEIOU59.2615111.1065
544IJCWDGFIXLQ-66.49604.2047
545XROQSWPTLVCSL-5.4513-7.4869
546SFHBUNAGDO37.9519-107.4571
547JEIAWIRAN57.6829142.2459
548MFSLDERM72.3603-87.8868
549UUUSLQPVR58.0284-168.9190
550ORDHOMRSXKXXKT-6.4607-148.7791
551YRCBWAPAE-55.9594169.9813
552SYMHNWWOMD-69.620755.3501
553ELNLG80.4329-11.2582
554PWUBGOSLQPQWON-3.0457-27.6888
555QJEKAEP-31.423921.9709
556WXOBTNS72.6944171.1772
557MSXXRL4.1681-41.4636
558WAGXGKCNBCJGFI-17.0619-95.1222
559LWJKDUDBIM58.0831-141.3868
560EALYGQDLH-37.2390-62.8022
561UIFTQKAXWPOIVW87.0673104.2044
562AWJPF66.5816170.7539
563FHOYHMLC-71.326358.7525
564KPEFPKKTCIMVDA56.9248-39.6876
565PNWCULUKKLQI-87.141684.5753
566MLHTNCIWVHD60.941716.8507
567TQRBXKESATCATL-8.4067-9.6978
568LGSPFF-20.7320-100.4784
569ACWOQ88.993298.9944
570QRBQLIBXWGH71.2851-147.5151
571TSTFVVF73.0473-153.7503
572SLHIXOOJQ61.562996.7885
573SGDDXSNMTRPGN74.6632167.7996
574BJEENBTDJT-43.6729-32.2687
575CFENFGYYNBCGE18.9099-143.0202
576BUBPM-86.0839-172.0917
577MQDAXA-59.8164-64.5377
578RFCGC67.102420.8135
579KTEBRPKLY76.3370-41.7528
580SNUCOCE-19.090968.9253
581FBVBSDYLFSMH-55.9605-22.5032
582TYPVUMVDU-64.4096-26.5662
583FQLEMVFB-5.5100-140.3656
584FOVAJX81.042845.9348
585THQHM52.5190146.2639
586MRULQCFWGHPW-12.725915.2831
587SOCFMJXAPH74.617198.2118
588LNYOSUKKV-47.8779-151.1835
589BOHAIRUY-48.95097.2040
590NGHYP35.1207110.8000
591STRYDWEWO-48.460015.9077
592RTVKYVCCYR-70.1907-46.6661
593GXNJGV18.3565111.1131
594STGVIESEFY89.7467-155.1119
595RRRQNANEISI-5.7090-12.1572
596THWQMK67.7531-125.3283
597DVPVRJOXI-17.9442126.1390
598EOSBMK39.851641.0091
599JCXYSISDYSVQFU-32.6454-42.4857
600VWPAMWUXK50.590281.3889
601VWTPFCUV81.3682-38.7186
602UMKOF17.8318-54.9054
603LTMAHUMCFD-55.001439.2893
604TEVEJG22.3876-64.4917
605CQGNOPWKPAKT51.7380-177.2476
606UQOHHSYHYH43.4930-160.5057
607JHXJISJDDSH28.671618.8405
608NQHRCYLDESS48.3535-106.1797
609KDKUKXWRGLO-44.2693-93.6456
610FNVONYSOVICCQ72.3187-53.6573
611CIKDDXUN-76.5498-167.9971
612LPDHYHI65.16241.1757
613HQFMAHSHB18.2209-46.9082
614HDQCARYIUUAHK-86.0032140.3193
615CUCIRNBVUC19.9165-4.2084
616KKRMGYGVKQITHY12.8463154.0639
617CAACIUHSHD-88.6382-157.8564
618DHNPUKCDHWP67.176265.4426
619MXNAD87.506841.6643
620QPWLACPWKWGOKV54.4295-78.7067
621GVLFINCYHBFSGB-50.4337-178.2173
622QJYHMY-24.191861.0366
623CWHFJJTVLPFF-55.3445113.5667
624UBGOFOOLELSD-80.7512-19.2356
625MGLHRNSVUUHGAY-46.0967179.2092
626ANXGHYNDK-3.1440-122.7753
627DAYJDRFNGCY-39.3937-153.6960
628QIFQLPFQ-21.6637-77.7563
629YLIULFHRNM-64.6968-94.5659
630LXWDCJPPI20.6752-48.0955
631GVHBNTDYJDJXHL-32.007159.4885
632MHMMONJ-81.3468-138.7471
633HMAFVNMAS5.724991.2372
634KQVCH63.4089-147.2895
635WJMCLQSPP36.512070.0967
636BDSVQCSIQ56.748311.9657
637INFEIRAFXEWEX19.4460-174.1144
638BGPVOHE80.882956.9515
639ANQSDBCHKEUWW70.287152.1638
640JCBXHFVIEJ69.146339.9859
641OACQSO-3.4721-106.1419
642RXHMAXFCT53.379634.9109
643OBUIIAGL-6.7955-159.2272
644WHEBRWHU-78.8628-133.7630
645KKLKPAKG-48.667927.2369
646AQRNSB5.461872.0058
647KHFVLHMKNRI-62.9404-47.6863
648DBLHKHADXCU39.0575171.4852
649RDJUXQG-0.0474-46.9307
650DBKQC-10.2102-141.5845
651RMXJJAL-56.1147-129.4649
652HHEGDWTQ-8.7441-139.9457
653ITIMMWLSNAGWFL4.767091.0860
654JNFLH56.6254149.8393
655QCABUMJCIQDU30.5280-71.5826
656RYXXIDMS-44.256288.2793
657WHLORGIKYTQAU-64.3820-80.8191
658GMXGQV-69.364274.4769
659YFVHUUOK39.1836-147.2212
660KGLCDKMJ-17.3635114.4715
661PQQLC75.7126119.9782
662EJUGJGJNE72.4453-125.4908
663EUEVEFXPPX-14.9651-80.5928
664SYIWOMDEIF15.9642-103.8166
665LJJXJXUUWIG11.8315-131.7086
666UOBXOYGVGCYV27.9501-73.9858
667JLSDPW40.4415-13.1869
668RETJNL48.446440.8905
669BTYAQXQSG-28.2459-109.7948
670XXSNKPD-56.1365136.4657
671EFMMEVQTNTTO59.5536-6.8838
672TDDWWSBBL71.9613113.1312
673IYHYOEENDVK8.5049-37.9428
674GVTIDGTHGTSLW-71.7204-5.1558
675EQUTUJD-11.4156178.5189
676QAGSEGNIT-5.0781-9.7241
677PJSNADTIYSOJR37.7699-46.9492
678FNRTSQIKRTUU54.4690-154.3991
679VVNSHQLM53.720465.9689
680OMOEMMJQNRGNBU44.792180.1460
681UCGTE-61.4759121.4337
682QPYKRMFXM54.2464-147.9432
683RPTTWVUO43.7332-99.5051
684UDHQYQMP3.5408-117.5502
685XSVOIVOERFMQTX-82.0375-165.1417
686DCCIQNRMBBAGM63.4444-162.8221
687SKKWQAEEVEM-35.17331.4770
688CWEGYIS-10.5660-111.1957
689LBNLQTHXFTCB-82.8923-12.3853
690BUVGEEAYYBRHX16.153226.6928
691LKQXIDDVX27.1274-102.4344
692IXXQFNVISFLP52.9421-46.9575
693ECGOHOOCHXDEW-59.683737.6105
694KWXWCK24.4669-102.1525
695SWNHPSABBIF-44.3370-105.4520
696HVVHV-69.8465-98.0513
697KRXMKM-72.6403-19.2949
698NKGDSJT-3.8685140.3243
699KLMJU-88.7203-130.1150
700EWXNE-77.5908129.3139
701QWEUYNJGDFHAA65.5015-32.3888
702MTVVFSXJC-47.8666-53.6563
703FALUJCMKEXY-34.9870117.0394
704CBJMEL-72.3819-143.2851
705SADJDXJN-52.440433.8938
706UGDIAGGXEWW-85.0393-74.3179
707CBNPYXBQEGOVGG-55.1933-157.8701
708HARXTLYJJVPK-23.1289-11.7437
709FVQNKEQ3.2531-94.3439
710SBCLARD-24.781925.5163
711UJBLMTWFOHX-78.7505-44.3229
712TYUGILQMLAB-71.3321-8.9286
713OKEUCWHKXKE4.0295176.8388
714MLOPSCEJTXUD76.982967.6188
715RJCFIHNTQMPA-37.0441-137.9081
716YLKAQQKLJKU-28.7667132.0667
717WNNUEPOTWTDPP-58.1867-29.2348
718CUMVMFSFRGPP-89.4030-11.2802
719ODISSFSVLIHWA-67.5127171.4113
720STJOFPXUXPXSM-17.5668-162.6417
721EHVKCDXH-15.7284-102.4594
722OVVPLEV38.4106150.4999
723KPIKIEHI-76.1472-75.7183
724UPCPBOS33.2496-0.2049
725KVOBYATKYSY-76.967582.2267
726XMJTON44.0660148.9732
727LPMNPCQKAEX69.881199.6248
728LODPWFQBVX-7.851834.7150
729WBJMWWRVQTW-64.0114-157.4365
730FAQBFFDHXAOVWV-53.7780126.0038
731NJKKPLPSTE-5.020979.6728
732YEPHM-57.3099-124.5063
733ESTHQXK54.3936-30.2752
734TLHQCUQD2.7558-21.1230
735MYETRE54.4777-32.3247
736ONSOMJT-72.594230.5923
737OLIWAIQB41.6005103.1813
738MACKPBRKHQ-24.689515.5470
739TWXEDJKXRU-88.2418131.6223
740YVDCCNNCRC-19.0127-174.9251
741KRLRYY60.8506-85.4672
742HRQVSFNBDMDHAO-34.0863-47.8970
743RFFNNDO-69.4145169.1123
744UNYTROJQXXHS30.9315-66.6669
745XBCKCMSYYGIDQ-13.2989-19.5820
746ETTIYSFH-69.2815131.8441
747APHTSGJUIL-56.090436.8144
748DMQCMFCPS-81.3291124.5623
749VJUIPJ22.8827-151.4312
750QRBGYICFESHJVH-31.018479.2891
751LFRKSIHYMVFI68.4496-54.2624
752MKTXWPNMCNI42.2344-66.9778
753OIITHABMYOX-66.570823.7047
754CVFYDAPC-33.4270-155.6637
755GARHVVVYHRDQY-29.2316100.1489
756PJADTJPDUSCM-75.688290.9141
757POJUALOXJPBK20.9343-165.5408
758HSHVNQ-88.762065.9620
759NUXTEFJDOPABNT11.6285-77.4350
760OMPXLBPJUUHCOX-24.254139.1561
761GDAJTGADOUTN72.6520-54.2123
762QYTEFAIYUQHS0.2363-89.4431
763CVSCDLDK-34.8732-102.2799
764SVYSVUE5.507313.1259
765SJDPKCCWYNPU-77.4219-129.7448
766WSPPDTNDJAEV-17.7609-85.7964
767AQYHMCKJWGT60.6031152.3393
768ESXFKRNRPTMP27.5646-91.4675
769JVVJXFVOXGD-4.678412.0778
770YMRVRFTNC58.098413.1165
771ORIAT-35.0516-117.6981
772TITDSVEPMU82.4686-59.9248
773SROFYHCDVY-3.712682.0084
774ODJWKSH83.5794104.0751
775VSRDRH-30.4166-91.8867
776LDNWCFTJMMDW-51.6687150.9926
777KBXVIJGIKW14.059946.1927
778HALSKULHV32.9380-91.2720
779IGYNQEGSWG-71.0103-1.2990
780BBHWA-10.8037-92.4674
781SNAJRHWTANMBQ-25.7370-20.7823
782CIQNFDAHS-41.766669.0769
783YGHOBEE-38.4546-148.6203
784XAJUVQD-33.462279.4905
785BKSOSKRVDUCM11.5397124.3548
786XRYXVRMIXM-84.0101108.1204
787FAFKYHEPK-8.2008114.8115
788FPOILXQ67.340767.1902
789BJECMM-1.1476-164.0794
790DBYVLTYCYS-16.8710-105.8997
791GTUCFEVAUE-77.3794-158.8671
792TDBKEOR78.0197-49.1744
793WXAOPMTW-80.8343145.7020
794TUNBWAV57.737510.3893
795QSXEPVMJPKOR-56.420186.1301
796URDOBQVXI80.0333-45.8375
797GFUSFIYXOAM-27.5543-155.6874
798DTVOMRBVX13.8385120.5571
799EBVXFNAOADG-42.0579113.5014
800FAMRUWTSPM79.4914135.8514
801UQMFF52.9760166.6951
802OYJJOSJVHOQNYD37.1458-87.0566
803WPCDOWEFH49.4661146.2487
804GANHIMWGXDPMD76.5172158.4860
805AQOCWOUIXWY21.5154-37.6848
806UGFUNYMCVOQ6.089078.0232
807MJSRUPNH-34.3214148.4663
808SPHQBGKWHXGS-8.9573-42.2454
809SAYAXQ53.1878174.7638
810WPQTRF-44.1086-151.4714
811QMBCSGDXVIWOE-43.7241-34.7511
812XOUHANX-25.6035-68.1931
813JCCNT34.889032.9062
814KOELFFFLYBKCV-37.9985-31.8814
815HVCKAE-61.0301-56.1414
816MNOXKNWOWPUK-53.9006-171.1924
817EUQSVTQRCOFMAJ60.9193-151.8223
818YHMJXRIUHRAY-55.7081-29.4657
819XXFILRPTBMUH37.3709151.1220
820HEUNMP50.0937-83.4556
821YRVHIO86.0268-35.5182
822DBDHHKMIVFRQN18.179435.3215
823SLFCFAHKQPGF-23.1479-17.9157
824STJXDPWLA62.1259-49.1036
825UDAUELTI-75.647924.1896
826USETVUNQJON-66.3413-31.9608
827LQNVMUCREHDYDI-25.4383-5.4165
828MRDEBWJ17.2093-46.8740
829XFINPSLOCEI65.3008-134.0170
830LCFCVJUENXXGS-15.536021.5943
831GLMSUPFXTVJNCJ-73.628437.7987
832SMKEENLLSNS70.092958.4483
833MNMJRDMBNTU28.0105144.0604
834WVKEHJKXXNCA70.862492.1837
835FRTYRJ-36.6833-121.2285
836MOAPFSDNNWKD-43.1903160.4615
837JITTUHL40.8384-67.4545
838BSHGGXF16.8426166.0135
839DGXANI-25.261668.8132
840NMSUGPPYGMI61.2037-7.3811
841JHHCPGXEHMXDI-35.0529-120.5766
842WDVFFICGYKA72.0086102.9718
843GXNIJMTJQYGVXC-17.061894.0816
844CCYKLMR53.2349124.7563
845GVJVBDDMU-73.2195-158.3742
846CXEEDMPOCEUNYU-7.056010.9905
847SSGSGH-9.1325-136.3791
848EURHAICO-72.8593108.9427
849VPBTG-5.7273-25.6325
850BPKRXBVUM61.0426-98.7177
851MONTEWE81.1271-36.1928
852YRVNIDAQV2.7620158.6590
853PEUKHGSPKN-37.4631-7.1022
854LLRAPQDXOAUB-12.9643-151.5328
855DQSGBXQFYTUX74.3141-170.4962
856AVPQBR65.054985.2821
857MDOLWXXVRFI-17.9378119.0146
858KJKBVLY-1.0684-62.8379
859CKRBLKTPCYSYD-66.6284165.5255
860HGSUOPGA-2.070089.5995
861YMHODS23.7228-133.2791
862ODDYARNACVPIN-13.2615-121.0704
863PTXVMA-30.9466-12.5315
864ANTLGKEAJAA48.4550-15.8579
865XJAVDL62.4186-74.4162
866MWKKSKJCTOC-34.3066-34.1658
867KPEWBYWDCADEP79.2002-136.9241
868DRXTMSXXCPL73.560065.0827
869AOQSJOHTQUGFE-54.042424.1360
870NXCEKBVUO79.6916-118.7601
871PMJQP-56.172374.2529
872XNNRMDLJIPUI-45.4878159.3774
873XOVRWTVNHW4.467119.3103
874AMWIDUSATETBT-41.9874-64.3870
875OVTGTWPDIFN-11.935876.3260
876EPVRJOITC68.9233-133.1262
877UUILOXYNJARJNA13.0819-128.6594
878NOOVHDKAMM-71.1508175.4478
879BTPVOHOYGAB42.6802-60.8420
880XNGVN2.4018131.1341
881KPFAJONXPIFMV3.7526-174.7321
882QLXHA51.022699.5730
883URAHFWQXFW14.8145116.7325
884EULVQQYCRIB-67.6706-76.3197
885SUSMDNTLS15.5225-111.3837
886FHJNH-55.7282102.0444
887CNKCHRMEWGOYLN-74.6914-86.8407
888KVAOCGFS-4.2691100.1039
889TDBSBRSSGMSCA64.6555-36.2959
890QRBIGSSJKXA-6.5072160.5290
891IWMTDS-8.763267.8062
892UKLCLKHWQQMG46.0877-101.4326
893MYVOQ16.702947.6854
894QHDYLBUONC68.7454178.3464
895SFVYM-8.6464-119.9061
896NPYMBO-34.3825-8.9711
897AWNNXYRTBTYLJQ71.592244.6659
898QAIQHMP32.4191-140.8149
899UKEXADFJJ-14.9589-7.8115
900KHMYYREQVFN-51.6214165.1592
901VTKJJMYJQ-47.7832151.6928
902WSMWOWIILP-9.6967-48.2289
903LRYTWWODF29.0615-159.1738
904SNHQBMFEDJMDB49.85679.6980
905MRJESYO64.678210.0673
906UJOTNVLAEKAXDH-45.0887-168.5958
907YKEKKHIKSF-12.5237-145.8756
908OVKVFFLOYNLDO-87.5577141.7086
909JTIVQFPNDNVO23.5289171.7267
910MJNWUKEK-21.4447-31.0616
911RKEYAEYXL-19.3466-39.6074
912IGRTY42.0364-125.7958
913JLKBQQNKOSU-89.303148.2087
914AVDCNNTVDESYOM18.231099.1944
915WCXHJWN1.717773.0849
916LBTPYUFV49.801634.9700
917MTQUSLMGYTC0.8179-175.3386
918XNYKGTDYDX-3.1366-26.9899
919AANSPKF-20.90916.1218
920NWVHCOE46.7621-9.1849
921BQHFAJEW-18.7147110.3993
922PJORFLC69.8263-90.6589
923BWLRWQVYKXHFDJ26.71438.4347
924YWGOVXMLHK-25.642636.5868
925XFUQXI-74.3288170.3014
926QQNNHRU11.495028.2262
927OHMLTXUYPF82.5899-108.1161
928MTXUDDSIMDEI46.553696.8113
929UMOUGNIAXJA-53.680011.7244
930LWEEMGTHHF-48.6489-29.7590
931MEKHMUJGWOTE21.2242173.5481
932BSOVDCBDKQII-8.2726-171.2884
933HKNGONTMBDYSN29.3862108.9713
934QRDPHUDWU37.2506-169.5754
935IQGGU74.5937-144.3574
936REGEQIVNE29.183842.8948
937ODBDOFUUET7.490523.8776
938XWWCRKOXQURVFE-49.6384-74.6888
939QBIPSNQTJJG53.944362.2917
940NJSDPEADLTAAK-78.4522148.4199
941AAEJJINGKR-43.6466-161.4131
942PTMSP-79.6810153.6645
943FJLHIG69.5638-169.2355
944FBMGIIAI65.1499-8.8222
945YSCJFESCXER44.6143161.1520
946HNODCU24.357212.7462
947OJUEBBIVUDC66.299026.0430
948AUNMQKYCDGG-28.9098-77.3470
949YWXGBHPUL-8.6689-75.2493
950FRXSOLTTWW16.030147.8618
951KDQMBFRQJDCJD-23.3809-69.3811
952EMPJRQ77.2602-92.6592
953HRXBKGQV-57.169718.6982
954IBYUAQEYEQAD-34.603456.0804
955HXTHRDSIMLD74.9899-70.4879
956TMQFFWMI47.8453-145.8979
957JDDTEL42.5595-152.7507
958GBYLR9.9487-61.0134
959NAIVLSU56.5347112.1917
960KMMNETUMDMNDK24.6711-108.8302
961HFGTKXON-47.0107-175.5127
962WKYPUYDGIQ84.3177-61.1709
963YJKFCWRQXIBAG58.2367-50.6137
964BBIAVAUGFCBMTN83.351619.6532
965JMBYGHXNNXQAHK3.6050-80.8553
966ELPGFUHBTQW82.62330.1910
967JYOGFANVKBLHE-70.5808-112.7423
968CSDFQGIC43.7609-77.7562
969PKMYOIFFHCH-21.1727133.7644
970JTYRW-13.54426.1549
971GYKDP13.424061.0464
972LAYUGGAGCNUK80.9193-81.4079
973CJXJSTUTAQRC-77.1291130.5711
974FCVDNCRA-32.477265.5218
975BHWAYQ-53.3463106.0179
976RWEJPRI65.8079-81.0305
977WWVYYHV-55.6223-53.6181
978IEEERYAD-84.9570-38.8719
979GLQRGVSJMMDAF-34.838372.8480
980BJNQRSMQWPIF85.1381-62.3057
981SFCYFVBIXED-68.636176.2737
982NKGUSFHOFECHO-82.5044-67.2223
983BRQQDIJAXFA-61.4222-145.3796
984RJKOIJQ-24.9329-163.9631
985DIMNJRGH-86.2414-74.5231
986AYYUMXVFN8.266061.9132
987UXSDYNCTIAHYC-40.3308127.5482
988TWWBILSJUY-74.1009-2.7435
989YJUGGGQXDWN34.2806-94.6805
990KMKMKXSEN43.705025.0209
991KBUSAWMV-38.8700135.5028
992EPMHKYJPJ-4.803851.3309
993PAQOVSARR75.5774-88.2771
994DLEJYCXWCE69.265031.2601
995YPNYTSVPQT-71.8772113.5673
996KYRVMV-85.280040.5971
997YEQINU-11.2789114.4934
998BOKYKEFHV-86.4026-49.8642
999ABBQHTKJRSGNE-15.100129.5604
\ No newline at end of file
diff --git a/src/main/java/cluster_manager/Cluster.java b/src/main/java/cluster_manager/Cluster.java
new file mode 100644
index 0000000..c5ec775
--- /dev/null
+++ b/src/main/java/cluster_manager/Cluster.java
@@ -0,0 +1,45 @@
+package cluster_manager;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Cluster {
+ private LatLng center;
+ private List items;
+
+ Cluster(List locations) {
+ items = new ArrayList<>(locations);
+ findCenter();
+ }
+
+ public LatLng getCenter() {
+ return center;
+ }
+
+ private void findCenter() {
+ double latitude = 0;
+ double longitude = 0;
+
+ for (Location item : items) {
+ latitude += item.getLatitude();
+ longitude += item.getLongitude();
+ }
+ center = new LatLng(latitude / items.size(), longitude / items.size());
+ }
+
+ public List getLocations() {
+ return Collections.unmodifiableList(items);
+ }
+
+ public void addItem(Location item) {
+ items.add(item);
+ findCenter();
+ }
+
+ static List manageLocations(List locations, int gridSize) {
+ List clusters = new ArrayList<>();
+ //... TO DO
+ return clusters;
+ }
+}
diff --git a/src/main/java/cluster_manager/ClusterManager.java b/src/main/java/cluster_manager/ClusterManager.java
new file mode 100644
index 0000000..5774066
--- /dev/null
+++ b/src/main/java/cluster_manager/ClusterManager.java
@@ -0,0 +1,43 @@
+package cluster_manager;
+
+import cluster_manager.xml_logic.LocationGenerator;
+import cluster_manager.xml_logic.LocationParser;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class ClusterManager {
+ private List locations;
+ private List clusters;
+ private final int gridSize = 50;
+
+ ClusterManager(File locationsxml) {
+ if (locationsxml != null) {
+ locations = LocationParser.parse(locationsxml);
+ clusters = Cluster.manageLocations(locations, gridSize);
+ } else {
+ System.out.println("File doesn't exist!");
+ }
+ }
+
+ ClusterManager(int count) {
+ this(LocationGenerator.generate(count));
+ }
+
+ List getLocations() {
+ return Collections.unmodifiableList(locations);
+ }
+
+ public List getInBounds(double minLat, double minLng, double maxLat, double maxLng) {
+ List clustersInBounds = new ArrayList<>();
+
+ for (Cluster current : clusters) {
+ if (current.getCenter().inBounds(minLat, minLng, maxLat, maxLng)) {
+ clustersInBounds.add(current);
+ }
+ }
+ return clustersInBounds;
+ }
+}
diff --git a/src/main/java/cluster_manager/LatLng.java b/src/main/java/cluster_manager/LatLng.java
new file mode 100644
index 0000000..d9be3f4
--- /dev/null
+++ b/src/main/java/cluster_manager/LatLng.java
@@ -0,0 +1,23 @@
+package cluster_manager;
+
+class LatLng {
+ private final double latitude;
+ private final double longitude;
+
+ LatLng(double latitude, double longitude) {
+ this.latitude = latitude;
+ this.longitude = longitude;
+ }
+
+ double getLatitude() {
+ return latitude;
+ }
+
+ double getLongitude() {
+ return longitude;
+ }
+
+ boolean inBounds(double minLat, double minLng, double maxLat, double maxLng) {
+ return (latitude >= minLat && latitude <= maxLat) && (longitude >= minLng && longitude <= maxLng);
+ }
+}
diff --git a/src/main/java/cluster_manager/Location.java b/src/main/java/cluster_manager/Location.java
new file mode 100644
index 0000000..2925528
--- /dev/null
+++ b/src/main/java/cluster_manager/Location.java
@@ -0,0 +1,28 @@
+package cluster_manager;
+
+public class Location extends LatLng {
+ private final int id;
+ private final String name;
+
+ public Location(int id, String name, double latitude, double longitude) {
+ super(latitude, longitude);
+ this.id = id;
+ this.name = name;
+ }
+
+ int getId() {
+ return id;
+ }
+
+ String getName() {
+ return name;
+ }
+
+ LatLng getLocation() {
+ return this;
+ }
+
+ public String toString() {
+ return String.format("Location ID: %d - %s (lat: %f, lng: %f)", id, name, getLatitude(), getLongitude());
+ }
+}
diff --git a/src/main/java/cluster_manager/xml_logic/LocationGenerator.java b/src/main/java/cluster_manager/xml_logic/LocationGenerator.java
new file mode 100644
index 0000000..9e77165
--- /dev/null
+++ b/src/main/java/cluster_manager/xml_logic/LocationGenerator.java
@@ -0,0 +1,66 @@
+package cluster_manager.xml_logic;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import java.io.File;
+
+public class LocationGenerator {
+
+ public static File generate(int count) {
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ try {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document locations = builder.newDocument();
+
+ Element rootElement = locations.createElement("root");
+ locations.appendChild(rootElement);
+
+ for (int i = 0; i < count; i++) {
+ Element row = locations.createElement("row");
+ rootElement.appendChild(row);
+
+ Element uniqueId = locations.createElement("UniqueID");
+ uniqueId.appendChild(locations.createTextNode(String.format("%d", i)));
+ row.appendChild(uniqueId);
+
+ Element name = locations.createElement("Name");
+ name.appendChild(locations.createTextNode(Randomizer.getRandomName()));
+ row.appendChild(name);
+
+ Element latitude = locations.createElement("Latitude");
+ latitude.appendChild(locations.createTextNode(Randomizer.getRandomLatitude()));
+ row.appendChild(latitude);
+
+ Element longitude = locations.createElement("Longitude");
+ longitude.appendChild(locations.createTextNode(Randomizer.getRandomLongitude()));
+ row.appendChild(longitude);
+ }
+
+ File randomizedLocations = new File("randomized_locations.xml");
+
+ TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ Transformer transformer = transformerFactory.newTransformer();
+ DOMSource source = new DOMSource(locations);
+ StreamResult result = new StreamResult(randomizedLocations);
+
+ transformer.transform(source, result);
+
+ return randomizedLocations;
+ } catch (ParserConfigurationException | TransformerException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+
+}
diff --git a/src/main/java/cluster_manager/xml_logic/LocationParser.java b/src/main/java/cluster_manager/xml_logic/LocationParser.java
new file mode 100644
index 0000000..e607ddc
--- /dev/null
+++ b/src/main/java/cluster_manager/xml_logic/LocationParser.java
@@ -0,0 +1,66 @@
+package cluster_manager.xml_logic;
+
+import cluster_manager.Location;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+public class LocationParser {
+
+ public static List parse(File locationsXML) {
+ List items = new ArrayList<>();
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ try {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ Document document = builder.parse(locationsXML);
+
+ NodeList locationList = document.getElementsByTagName("row");
+
+ for (int i = 0; i < locationList.getLength(); i++) {
+ Node location = locationList.item(i);
+ if (location.getNodeType() == Node.ELEMENT_NODE) {
+ NodeList parameters = location.getChildNodes();
+ int id = 0;
+ String name = null;
+ double latitude = 0;
+ double longitude = 0;
+
+ for (int j = 0; j < parameters.getLength(); j++) {
+ Node parameter = parameters.item(j);
+ if (parameter.getNodeType() == Node.ELEMENT_NODE) {
+ if (parameter.getNodeName().equals("UniqueID")) {
+ id = Integer.parseInt(parameter.getTextContent());
+ continue;
+ }
+ if (parameter.getNodeName().equals("Name")) {
+ name = parameter.getTextContent();
+ continue;
+ }
+ if (parameter.getNodeName().equals("Latitude")) {
+ latitude = Double.parseDouble(parameter.getTextContent());
+ continue;
+ }
+ if (parameter.getNodeName().equals("Longitude")) {
+ longitude = Double.parseDouble(parameter.getTextContent());
+ }
+ }
+ }
+ items.add(new Location(id, name, latitude, longitude));
+ }
+ }
+ } catch (ParserConfigurationException | SAXException | IOException ex) {
+ ex.printStackTrace();
+ }
+ return items;
+ }
+}
diff --git a/src/main/java/cluster_manager/xml_logic/Randomizer.java b/src/main/java/cluster_manager/xml_logic/Randomizer.java
new file mode 100644
index 0000000..20b04f4
--- /dev/null
+++ b/src/main/java/cluster_manager/xml_logic/Randomizer.java
@@ -0,0 +1,34 @@
+package cluster_manager.xml_logic;
+
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+
+class Randomizer {
+
+ static String getRandomName(int minLength, int maxLength) {
+ Random random = new Random();
+ int length = random.nextInt(maxLength - minLength) + minLength;
+ StringBuilder result = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ //[65 - 90] - latin alphabet in unicode(uppercase)
+ int code = random.nextInt(90 - 65) + 65;
+ char current = (char) code;
+ result.append(current);
+ }
+ return result.toString();
+ }
+
+ static String getRandomName() {
+ return getRandomName(5, 15);
+ }
+
+ static String getRandomLatitude() {
+ double random = ThreadLocalRandom.current().nextDouble(-90, 90);
+ return String.format("%.4f", random);
+ }
+
+ static String getRandomLongitude() {
+ double random = ThreadLocalRandom.current().nextDouble(-180, 180);
+ return String.format("%.4f", random);
+ }
+}
diff --git a/src/main/java/products/Category.java b/src/main/java/products/Category.java
new file mode 100644
index 0000000..459636b
--- /dev/null
+++ b/src/main/java/products/Category.java
@@ -0,0 +1,27 @@
+package products;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Category {
+ private final CategoryType category;
+ private final List products = new ArrayList<>();
+
+ public CategoryType getCategoryType() {
+ return category;
+ }
+
+ public List getProducts() {
+ return Collections.unmodifiableList(products);
+ }
+
+ Category(CategoryType category) {
+ this.category = category;
+ }
+
+ void addProductToCategory(Product product) {
+ products.add(product);
+ }
+}
+
diff --git a/src/main/java/products/CategoryType.java b/src/main/java/products/CategoryType.java
new file mode 100644
index 0000000..24193c6
--- /dev/null
+++ b/src/main/java/products/CategoryType.java
@@ -0,0 +1,5 @@
+package products;
+
+enum CategoryType {
+ Healthy, Sweet, Natural, Fruit, Meat, Children, Chocolate
+}
\ No newline at end of file
diff --git a/src/main/java/products/Product.java b/src/main/java/products/Product.java
new file mode 100644
index 0000000..8488d1c
--- /dev/null
+++ b/src/main/java/products/Product.java
@@ -0,0 +1,38 @@
+package products;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Product {
+
+ private final List categoryList;
+
+ private final String name;
+
+ private int count;
+ private int prise;
+
+ public List getCategories() {
+ return Collections.unmodifiableList(categoryList);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public int getPrise() {
+ return prise;
+ }
+
+ Product(List productCategories, String name, int count, int prise) {
+ this.categoryList = new ArrayList<>(productCategories);
+ this.name = name;
+ this.count = count;
+ this.prise = prise;
+ }
+}
diff --git a/src/main/java/products/Stock.java b/src/main/java/products/Stock.java
new file mode 100644
index 0000000..2eee1f9
--- /dev/null
+++ b/src/main/java/products/Stock.java
@@ -0,0 +1,45 @@
+package products;
+
+import java.util.*;
+
+public class Stock {
+
+ private final Map categories = new HashMap<>();
+ private final List products = new ArrayList<>();
+
+ private List makeCategoryList(CategoryType... categoryTypes) {
+ List categoriesOfProduct = new ArrayList<>();
+ for (CategoryType current : categoryTypes) {
+ Category category = categories.get(current);
+ if (category == null) {
+ category = new Category(current);
+ categories.put(current, category);
+ }
+ categoriesOfProduct.add(category);
+ }
+ return categoriesOfProduct;
+ }
+
+ public void addProduct(String name, int count, int price, CategoryType... category) {
+
+ List productCategories = makeCategoryList(category);
+ Product product = new Product(productCategories, name, count, price);
+ products.add(product);
+
+ for (Category current : productCategories) {
+ current.addProductToCategory(product);
+ }
+ }
+
+ public List findAllProducts() {
+ return Collections.unmodifiableList(products);
+ }
+
+ public List findProductsByCategory(CategoryType category) {
+ Category current = categories.get(category);
+ if (current == null) {
+ return Collections.emptyList();
+ }
+ return categories.get(category).getProducts();
+ }
+}
diff --git a/src/main/java/tree/Comparable.java b/src/main/java/tree/Comparable.java
new file mode 100644
index 0000000..64cedab
--- /dev/null
+++ b/src/main/java/tree/Comparable.java
@@ -0,0 +1,5 @@
+package tree;
+
+interface Comparable {
+ CompareResult compare(T other);
+}
diff --git a/src/main/java/tree/CompareResult.java b/src/main/java/tree/CompareResult.java
new file mode 100644
index 0000000..7856397
--- /dev/null
+++ b/src/main/java/tree/CompareResult.java
@@ -0,0 +1,5 @@
+package tree;
+
+enum CompareResult{
+ GREATER_THEN, EQUALS, LESS_THEN
+}
diff --git a/src/main/java/tree/Tree.java b/src/main/java/tree/Tree.java
index 54d07f5..c595846 100644
--- a/src/main/java/tree/Tree.java
+++ b/src/main/java/tree/Tree.java
@@ -1,9 +1,82 @@
package tree;
-public class Tree {
+import java.util.ArrayList;
+import java.util.List;
-}
+public class Tree> {
+ private Node head = null;
+
+ public void add(T item){
+ Node current = new Node<>(item);
+ if (isEmpty()) {
+ head = current;
+ } else {
+ head.addNode(current);
+ }
+ }
+
+ public boolean isEmpty(){
+ return head == null;
+ }
+
+ public boolean contains(T item) {
+ return !isEmpty() && head.findNode(item);
+ }
+
+ public List getElements(){
+ List elements = new ArrayList<>();
+ head.getNodes(elements);
+ return elements;
+ }
+
+ private static class Node> {
+ private T value;
+ private Node left;
+ private Node right;
-class Node {
-
+ Node(T value) {
+ this.value = value;
+ left = null;
+ right = null;
+ }
+
+ T getValue() {
+ return value;
+ }
+
+ void addNode(Node current) {
+ switch (current.value.compare(this.value)) {
+ case LESS_THEN:
+ if (left != null) {
+ left.addNode(current);
+ } else left = current;
+ break;
+ case GREATER_THEN:
+ if (right != null) {
+ right.addNode(current);
+ } else right = current;
+ break;
+ default:
+ throw new IllegalArgumentException("The item is already exists");
+ }
+ }
+
+ boolean findNode(T current) {
+ switch (current.compare(this.value)) {
+ case LESS_THEN:
+ return left != null && left.findNode(current);
+ case GREATER_THEN:
+ return right != null && right.findNode(current);
+ default:
+ return true;
+ }
+ }
+
+ void getNodes(List nodes) {
+ if (this.left != null) this.left.getNodes(nodes);
+ nodes.add(this.value);
+ if (this.right != null) this.right.getNodes(nodes);
+ }
+ }
}
+
diff --git a/src/main/java/tree/User.java b/src/main/java/tree/User.java
new file mode 100644
index 0000000..038c8fb
--- /dev/null
+++ b/src/main/java/tree/User.java
@@ -0,0 +1,19 @@
+package tree;
+
+public class User implements Comparable{
+ private final int height;
+
+ public User(int height) {
+ this.height = height;
+ }
+ public int getHeight() {
+ return height;
+ }
+
+ @Override
+ public CompareResult compare(User other) {
+ if (height > other.height) return CompareResult.GREATER_THEN;
+ if (height < other.height) return CompareResult.LESS_THEN;
+ return CompareResult.EQUALS;
+ }
+}
diff --git a/src/main/java/words/Counter.java b/src/main/java/words/Counter.java
new file mode 100644
index 0000000..e19815d
--- /dev/null
+++ b/src/main/java/words/Counter.java
@@ -0,0 +1,33 @@
+package words;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Counter {
+ private Map words = new HashMap<>();
+
+ private String[] convertToArray(String input) {
+ return input.trim().split(" ");
+ }
+
+ public boolean count(String string) {
+ if (string == null || convertToArray(string)[0].equals("")) {
+ return false;
+ } else {
+ for (String word : convertToArray(string)) {
+ int count = words.getOrDefault(word, 0);
+ words.put(word, count + 1);
+ }
+ return true;
+ }
+ }
+
+ public int getCount(String word) {
+ return words.getOrDefault(word, 0);
+ }
+
+ public Map getFrequency() {
+ return Collections.unmodifiableMap(words);
+ }
+}
diff --git a/src/test/java/cluster_manager/ClusterManagerTest.java b/src/test/java/cluster_manager/ClusterManagerTest.java
new file mode 100644
index 0000000..b7097ac
--- /dev/null
+++ b/src/test/java/cluster_manager/ClusterManagerTest.java
@@ -0,0 +1,38 @@
+package cluster_manager;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ClusterManagerTest {
+ private ClusterManager manager;
+
+ @Test
+ public void parsing_locations_from_xml() {
+ File location = new File("locations.xml");
+ manager = new ClusterManager(location);
+ List current = manager.getLocations();
+
+ List expected = new ArrayList<>();
+
+ expected.add(new Location(12, "CHURCH VIEW BP", 51.14, 0.2617));
+ expected.add(new Location(14, "CLARENDON BP", 51.6581, 0.2511));
+
+ for (int i = 0; i < expected.size(); i++) {
+ Assert.assertEquals(expected.get(i).toString(), current.get(i).toString());
+ }
+ }
+
+ @Test
+ public void generating_locations_to_xml() {
+ int count = 1000;
+ manager = new ClusterManager(count);
+ List current = manager.getLocations();
+
+ Assert.assertFalse(current.isEmpty());
+ Assert.assertEquals(count, current.size());
+ }
+}
diff --git a/src/test/java/products/StockTest.java b/src/test/java/products/StockTest.java
new file mode 100644
index 0000000..2679ad5
--- /dev/null
+++ b/src/test/java/products/StockTest.java
@@ -0,0 +1,53 @@
+package products;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+public class StockTest {
+ private Stock stock;
+
+ @Before
+ public void set_up() {
+ stock = new Stock();
+ }
+
+ @Test
+ public void add_products() {
+ stock.addProduct("Snickers", 10, 15, CategoryType.Chocolate);
+ Assert.assertEquals(stock.findAllProducts().get(0).getName(), "Snickers");
+
+ stock.addProduct("Milk", 1, 20, CategoryType.Healthy, CategoryType.Children, CategoryType.Natural);
+ Assert.assertEquals(stock.findAllProducts().get(1).getCount(), 1);
+
+ stock.addProduct("Hum", 10, 80, CategoryType.Healthy, CategoryType.Meat);
+ Assert.assertEquals(stock.findAllProducts().get(2).getPrise(), 80);
+ Assert.assertEquals(stock.findAllProducts().get(2).getName(), "Hum");
+ }
+
+ @Test
+ public void get_products_in_category() {
+ stock.addProduct("Milk", 1, 20, CategoryType.Healthy, CategoryType.Children, CategoryType.Natural);
+ stock.addProduct("Hum", 10, 80, CategoryType.Healthy, CategoryType.Meat);
+
+ List products = stock.findProductsByCategory(CategoryType.Healthy);
+
+ Assert.assertEquals(products.get(0).getName(), "Milk");
+ Assert.assertEquals(products.get(1).getName(), "Hum");
+ }
+
+ @Test
+ public void get_categories_of_product() {
+ stock.addProduct("Milk", 1, 20, CategoryType.Healthy, CategoryType.Children, CategoryType.Natural);
+
+ List categories = stock.findAllProducts().get(0).getCategories();
+
+ Assert.assertEquals(categories.size(), 3);
+ Assert.assertEquals(categories.get(0).getCategoryType(), CategoryType.Healthy);
+ Assert.assertEquals(categories.get(1).getCategoryType(), CategoryType.Children);
+ Assert.assertEquals(categories.get(2).getCategoryType(), CategoryType.Natural);
+ }
+}
+
diff --git a/src/test/java/tree/TreeTest.java b/src/test/java/tree/TreeTest.java
index cd2bd68..35f9295 100644
--- a/src/test/java/tree/TreeTest.java
+++ b/src/test/java/tree/TreeTest.java
@@ -1,7 +1,69 @@
package tree;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
import static org.junit.Assert.*;
public class TreeTest {
+ private Tree tree;
+ private final User rostik = new User(170);
+ private final User vitalik = new User(182);
+ private final User rusik = new User(180);
+ private final User andrii = new User(160);
+ private final User misha = new User(175);
+
+ @Before
+ public void set_up() throws Exception {
+ tree = new Tree<>();
+ }
+
+ @Test
+ public void is_empty() {
+ assertTrue(tree.isEmpty());
+
+ tree.add(vitalik);
+ assertFalse(tree.isEmpty());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void add_one_node_multiple_times() {
+ tree.add(vitalik);
+ tree.add(vitalik);
+ tree.add(vitalik);
+ tree.add(vitalik);
+
+ }
+
+ @Test
+ public void add_and_contains() {
+ assertFalse("do not contain vitalik", tree.contains(vitalik));
+ tree.add(vitalik);
+ assertTrue("contain vitalik", tree.contains(vitalik));
+
+ assertFalse("do not contain rostik", tree.contains(rostik));
+ assertFalse("do not contain rusik", tree.contains(rusik));
+
+ tree.add(rostik);
+ tree.add(rusik);
+
+ assertTrue("contain rostik", tree.contains(rostik));
+ assertTrue("contain rusik", tree.contains(rusik));
+ }
+
+ @Test
+ public void get_elements() {
+ User[] arr = new User[]{vitalik, rostik, rusik, andrii, misha};
+ for (int i = 0; i < arr.length; i++) {
+ tree.add(arr[i]);
+ }
+ User[] arrSorted = new User[]{andrii, rostik, misha, rusik, vitalik};
+ List nodes = tree.getElements();
+ for (int i = 0; i < arrSorted.length; i++) {
+ assertEquals(nodes.get(i), arrSorted[i]);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/test/java/words/CounterTest.java b/src/test/java/words/CounterTest.java
new file mode 100644
index 0000000..9f9c22c
--- /dev/null
+++ b/src/test/java/words/CounterTest.java
@@ -0,0 +1,68 @@
+package words;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CounterTest {
+ private Counter counter;
+
+ @Before
+ public void set_up(){
+ counter = new Counter();
+ }
+
+ @Test
+ public void count_word(){
+ Assert.assertTrue(counter.count("Hello"));
+ Assert.assertFalse(counter.count(null));
+ Assert.assertFalse(counter.count(""));
+ Assert.assertFalse(counter.count(" "));
+ Assert.assertFalse(counter.count(" "));
+ }
+
+ @Test
+ public void frequency(){
+
+ Assert.assertTrue(counter.getFrequency().isEmpty());
+ counter.count(" ");
+ counter.count(null);
+ Assert.assertTrue(counter.getFrequency().isEmpty());
+ counter.count("Hello Rostik");
+ counter.count("Hello Rostik bro");
+ counter.count("Rostik and Vitalik");
+ Assert.assertFalse(counter.getFrequency().isEmpty());
+
+ Map expected = new HashMap<>();
+ expected.put("Hello", 2);
+ expected.put("Rostik", 3);
+ expected.put("bro", 1);
+ expected.put("and", 1);
+ expected.put("Vitalik", 1);
+
+ Assert.assertEquals(expected, counter.getFrequency());
+ }
+
+ @Test
+ public void count_multiple_words_in_string(){
+ counter.count(" Hello o .");
+
+ Assert.assertEquals(counter.getCount("Hello"), 1);
+ Assert.assertEquals(counter.getCount("o"), 1);
+ Assert.assertEquals(counter.getCount("."), 1);
+
+ Assert.assertEquals(counter.getCount(" "), 0);
+
+ Assert.assertEquals(counter.getCount("hello"), 0);
+
+ counter.count("o o o Vitalik");
+
+ Assert.assertEquals(counter.getCount("o"), 4);
+ Assert.assertEquals(counter.getCount("Vitalik"), 1);
+ }
+
+
+}