-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcustomLOS.html
More file actions
851 lines (823 loc) · 80.7 KB
/
customLOS.html
File metadata and controls
851 lines (823 loc) · 80.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
<html><head><title>Line of sight tool</title>
<script>
const HTML_LOSCANVAS_ID = "loscanvas";
const HTML_NPCSIZE_ID = "npcsize";
const HTML_PLAYERRANGE_ID = "playerrange";
const wave1to9 = [16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097156,2097154,2097154,2097154,2097154,2228480,2228480,2228480,2228480,2097154,2097154,2097154,2097154,2097153,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2097156,2097408,96,2097440,2097440,32,0,0,0,0,131360,131360,131360,131376,2097408,2097153,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,131328,131328,131328,2228480,2097156,2097154,2097154,2097408,64,0,2097408,2097408,0,0,0,0,0,0,0,0,0,16,2097408,2097154,2097154,2097154,2097154,2097154,2097154,2097154,2097154,2097154,2097153,2228480,2228480,2228480,2228480,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,131328,2228480,2097156,2097154,2097154,2097408,352,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,131362,131386,2228608,131328,0,0,2228480,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,131328,131328,2097156,2097408,96,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,32,0,0,0,0,0,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2228480,131328,131328,2097160,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131328,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2228480,131328,2097156,2097408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,131328,2097156,2097408,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,131328,131328,0,0,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2228480,2228480,2097160,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131360,131368,2097538,0,131328,0,0,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2228480,2228480,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131328,131368,2097280,0,131328,131328,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2228480,2097156,2097408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131336,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,131328,2097156,2097408,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2097160,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,131328,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,131328,2097160,128,0,0,0,0,0,4104,65664,0,4104,65664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4104,65664,0,4104,65664,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,131328,2097160,129,0,0,0,0,0,5130,65664,0,4104,66690,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5130,65664,0,4104,66690,0,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,2097168,2097408,0,0,0,0,4104,2310560,0,0,0,2249000,65664,0,0,0,0,0,0,0,0,0,0,0,0,4104,2310560,0,0,0,2249000,65664,0,0,0,0,8,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2228480,2228480,2097160,128,0,0,0,4104,65664,0,0,0,4104,65664,0,0,0,0,0,0,0,0,0,0,0,0,4104,65664,0,0,0,4104,65664,0,0,0,0,12,2097280,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2228480,2097156,2097408,0,0,0,0,4104,65664,0,262144,131328,4104,65664,0,0,0,0,0,0,0,0,0,0,0,0,4104,65664,0,262144,131328,4104,65664,0,0,0,4,2097408,2097216,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2097156,2097408,64,0,0,0,0,4104,2295170,1026,1026,1026,2233610,65664,0,0,0,0,0,0,0,0,0,0,0,0,4104,2295170,1026,1026,1026,2233610,65664,0,0,0,2097408,2097216,2228480,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2097160,192,0,0,0,0,0,0,16416,16416,16416,16416,16416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16416,16416,16416,16416,16416,0,0,0,8,2097280,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2097160,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2097168,2097408,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097408,2097153,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2228480,2097168,2097408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,2097280,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2228480,2228480,2228480,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,2097280,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2228480,131328,2097160,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2097408,2097216,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2228480,2097160,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097408,2097216,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2228480,2097168,2097408,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,2097280,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2228480,2228480,2097168,2097408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,2097280,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2097160,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2097408,2097216,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097168,2097408,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,4,2097408,2097216,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097168,2228480,2228480,2228480,2097184,2097184,2097408,1,0,0,2,2,0,0,0,0,0,2,2,0,0,4,2097408,2097184,2097184,2228480,2228480,2228480,2097216,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097168,2228480,2228480,2228480,2097184,2097184,2097408,3,2,6,2097408,2097184,2097184,2228480,2228480,2228480,2097216,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097168,2097184,2097184,2097184,2097216,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216,16777216];
const wave10 = ((new Array(2015).fill(0)).concat([0])).concat(new Array(2080).fill(0));
const inferno = [2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097408,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2228480,2228480,2228482,2228482,2228482,2228482,2228480,2228480,2097408,2097408,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228488,2097312,2097184,2097184,2097192,2228608,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2233610,2162816,2097152,2097152,2101256,2295170,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097312,2097184,2097184,2097184,2228512,2228512,2097184,2113568,2228480,2228480,2097152,2097152,2113568,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2228512,2228512,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2097184,2228512,2228512,2097184,2097184,2097184,2097192,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228482,2233610,2162816,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2101256,2295170,2228482,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097312,2113568,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2113568,2097192,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097282,2098178,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2098178,2097162,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228512,2249000,2162816,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2232584,2310560,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228488,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2101256,2295170,2228482,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2228480,2228480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2113568,2097192,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228482,2233610,2162816,2097152,2097152,2097152,2097152,2097152,2228480,2228480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097312,2113568,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2098178,2097162,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2101256,2310560,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,131328,131328,131328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,131328,131328,131328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,131328,131328,131328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2101256,2295170,2228482,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2113568,2097192,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097282,2098178,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228512,2249000,2162816,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2098178,2097162,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2232584,2310560,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228488,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,131328,131328,131328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228482,2233610,2162816,2097152,2228480,2228480,2097152,2097152,2097152,2097152,131328,131328,131328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2101256,2295170,2228482,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097312,2113568,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,131328,131328,131328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131328,131328,131328,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2113568,2097192,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131328,131328,131328,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131328,131328,131328,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2098178,2097162,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2101256,2310560,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228488,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097282,2098178,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228488,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228512,2249000,2162816,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2101256,2295170,2228482,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2113568,2097192,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2228608,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097408,2097408,2097408,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2097152,2097152,2097408,2097408,2097408,2097152,2097152,2228480,2097152,2097152,2228480,2228480,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2097160,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2228480,2228480,2098178,2098178,2228480,2097152,2097152,2097408,2097408,2097408,2097152,2097152,2228480,2098178,2097154,2228482,2229506,2228480,2228480,2098178,2097154,2097154,2098178,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097160,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2097152,2097152,2097152,2097152,2097152,2101256,2310560,2249000,2294144,2097152,2097152,2097408,2097408,2097408,2097152,2097152,2232584,2310560,2228512,2097184,2117672,2162816,2101256,2310560,2228512,2228512,2249000,2162816,2097152,2097152,2097152,2097152,2097152,2228480,2228480,2098178,2097162,2228608,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2097152,2098178,2097154,2097154,2097154,2228482,2228482,2097154,2097154,2097154,2097154,2097154,2097162,2228608,2228488,2228608,2097152,2097152,2097408,2097408,2097408,2097152,2097152,2228488,2228608,2228480,2097152,2097160,2097282,2097162,2228608,2228480,2228480,2228488,2097280,2097152,2228480,2228480,2097152,2097152,2097152,2101256,2310560,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097280,2097152,2097152,2101256,2310560,2228512,2228512,2228512,2228512,2228512,2228512,2228512,2228512,2228512,2228512,2228512,2228480,2228488,2228608,2097152,2097152,2097408,2097408,2097408,2097152,2097152,2228488,2228608,2228480,2228480,2228480,2228512,2228512,2228480,2228480,2228480,2228488,2097282,2098178,2228480,2228480,2097152,2097152,2098178,2097162,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228488,2097282,2097154,2097154,2097162,2228608,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228488,2228608,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228488,2228608,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228512,2249000,2162816,2097152,2097152,2101256,2310560,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228512,2228512,2228512,2228512,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097416,2228608,2097152,2097152,2097152,2097152,2097152,2097152,2097152,2228488,2097536,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228488,2097282,2097154,2097154,2097162,2228608,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097416,2228610,2228482,2228482,2228482,2228482,2228482,2228482,2228482,2228490,2097536,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228512,2228512,2228512,2228512,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097440,2097440,2097440,2097440,2097440,2097440,2097440,2097440,2097440,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2228480,2228480,2228480,2228480,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408,2097408];
const LOS_FULL_MASK = 0x20000;
const LOS_EAST_MASK = 0x1000;
const LOS_WEST_MASK = 0x10000;
const LOS_NORTH_MASK = 0x400;
const LOS_SOUTH_MASK = 0x4000;
const MOVE_FULL_MASK = 0x100 | 0x200000 | 0x40000 | 0x1000000; // 0x100 for objects, 0x200000 for unwalkable tiles such as water etc, 0x40000 is very rare but BA cannon has it. 0x1000000 is not confirmed to block move but outside ba arena 1-9
const MOVE_EAST_MASK = 0x8;
const MOVE_WEST_MASK = 0x80;
const MOVE_NORTH_MASK = 0x2;
const MOVE_SOUTH_MASK = 0x20;
const UNKNOWN_1 = 0x40;
const CHECK_LOS_RUNNER = 0;
const CHECK_LOS_PLAYER = 1;
const CHECK_LOS_NPC_TO_PLAYER = 2;
var currentMap;
var action;
var mechanics;
var losCheckType;
var selectedTileX;
var selectedTileY;
var prevSelectedTileX;
var prevSelectedTileY;
function start() {
let canvas = document.getElementById(HTML_LOSCANVAS_ID)
canvas.onmousedown = onMouseDown;
action=1
currentMap = wave10;
mechanics=0;
losCheckType = CHECK_LOS_PLAYER;
selectedTileX = -1;
prevSelectedTileX = -1;
rInit(canvas, 64*12, 64*12);
rrInit(12);
drawAll();
}
function setWave1To9() {
currentMap = wave1to9;
drawAll();
}
function setWave10() {
currentMap = wave10;
drawAll();
}
function setInferno() {
currentMap = inferno;
drawAll();
}
function onNpcSizeChanged() {
if (losCheckType === CHECK_LOS_NPC_TO_PLAYER) {
drawAll();
}
}
function setLOSCheckType(type) {
if (losCheckType === type) {
selectedTileX = -1;
} else {
losCheckType = type;
}
drawAll();
}
function increaseSize() {
setTileSize(rrTileSize + 1);
}
function decreaseSize() {
if (rrTileSize > 1) {
setTileSize(rrTileSize - 1);
}
}
function setTileSize(size) {
rResizeCanvas(size*64, size*64);
rrSetTileSize(size);
drawAll();
}
function onPlayerRangeChanged() {
if (losCheckType === CHECK_LOS_PLAYER) {
drawAll();
}
}
function onMouseDown(e) {
var canvasRect = rCanvas.getBoundingClientRect();
switch(action) {
case 1:
prevSelectedTileX = selectedTileX;
prevSelectedTileY = selectedTileY;
selectedTileX = Math.trunc((e.clientX - canvasRect.left) / rrTileSize);
selectedTileY = Math.trunc((canvasRect.bottom - 1 - e.clientY) / rrTileSize);
break;
case 0:
currentMap[Math.trunc((e.clientX - canvasRect.left) / rrTileSize) + Math.trunc((canvasRect.bottom - 1 - e.clientY) / rrTileSize) * 64] = 0;
case action:
currentMap[Math.trunc((e.clientX - canvasRect.left) / rrTileSize) + Math.trunc((canvasRect.bottom - 1 - e.clientY) / rrTileSize) * 64] = currentMap[Math.trunc((e.clientX - canvasRect.left) / rrTileSize) + Math.trunc((canvasRect.bottom - 1 - e.clientY) / rrTileSize) * 64] | action;
break;
default:
prevSelectedTileX = selectedTileX;
prevSelectedTileY = selectedTileY;
selectedTileX = Math.trunc((e.clientX - canvasRect.left) / rrTileSize);
selectedTileY = Math.trunc((canvasRect.bottom - 1 - e.clientY) / rrTileSize);
break;
}
drawAll();
}
function getTileFlag(x, y) {
return currentMap[x + y * 64];
}
function setAction(x) {
action=x;
}
function setMechanics(x) {
mechanics=x;
drawAll();
}
function drawAll() {
drawMap();
drawDetails();
drawLOS();
drawGrid();
drawOverlays();
rPresent();
}
function drawLOS() {
if (selectedTileX === -1) {
return;
}
rSetDrawColor(0, 240, 0, 92);
if (losCheckType === CHECK_LOS_NPC_TO_PLAYER) {
var npcSize = Number(document.getElementById(HTML_NPCSIZE_ID).value);
if (npcSize < 1) {
npcSize = 1;
}
for (var x = Math.max(selectedTileX - 15, 0); x <= Math.min(selectedTileX + npcSize + 14, 63); ++x) {
for (var y = Math.max(selectedTileY - 15, 0); y <= Math.min(selectedTileY + npcSize + 14, 63); ++y) {
var destX;
var destY;
if (x < selectedTileX) {
destX = selectedTileX;
} else if (x >= selectedTileX + npcSize) {
destX = selectedTileX + npcSize - 1;
} else {
destX = x;
}
if (y < selectedTileY) {
destY = selectedTileY;
} else if (y >= selectedTileY + npcSize) {
destY = selectedTileY + npcSize - 1;
} else {
if (destX === x) {
continue;
}
destY = y;
}
if (hasLineOfSight(x, y, destX, destY) && (getTileFlag(x, y) & LOS_FULL_MASK) === 0) {
rrFill(x, y);
}
}
}
} else if (losCheckType === CHECK_LOS_RUNNER) {
var xOffset = selectedTileX % 8;
var yOffset = selectedTileY % 8;
for (var x = Math.max(selectedTileX - 8 - xOffset, 0); x <= Math.min(selectedTileX + 15 - xOffset, 63); ++x) {
for (var y = Math.max(selectedTileY - 8 - yOffset, 0); y <= Math.min(selectedTileY + 15 - yOffset, 63); ++y) {
if (hasLineOfSight(selectedTileX, selectedTileY, x, y) && (getTileFlag(x, y) & LOS_FULL_MASK) === 0) {
rrFill(x, y);
}
}
}
} else {
var range = Number(document.getElementById(HTML_PLAYERRANGE_ID).value);
for (var x = Math.max(selectedTileX - range, 0); x <= Math.min(selectedTileX + range, 63); ++x) {
for (var y = Math.max(selectedTileY - range, 0); y <= Math.min(selectedTileY + range, 63); ++y) {
if (hasLineOfSight(selectedTileX, selectedTileY, x, y) && (getTileFlag(x, y) & LOS_FULL_MASK) === 0) {
rrFill(x, y);
}
}
}
}
rSetDrawColor(0, 255, 255, 255);
rrFill(selectedTileX, selectedTileY);
if (losCheckType === CHECK_LOS_NPC_TO_PLAYER && npcSize > 1) {
rrOutlineBig(selectedTileX, selectedTileY, npcSize, npcSize);
}
}
function drawDetails() {
if (currentMap !== wave1to9 ) {
return;
}
rSetDrawColor(160, 82, 45, 255);
rrCone(40, 40);
rrCone(40, 39);
rrCone(41, 40);
rrCone(41, 39);
rrCone(43, 39);
rrCone(36, 42);
rrCone(36, 43);
rrCone(37, 42);
rrCone(37, 43);
rrCone(39, 44);
rrCone(43, 30);
rrCone(43, 31);
rrCone(44, 30);
rrCone(44, 31);
rrCone(45, 32);
if (currentMap === wave1to9) {
rrFillItem(29, 46);
rrFillItem(28, 47);
} else {
rrFillItem(30, 46);
rrFillItem(29, 47);
}
rSetDrawColor(160, 82, 45, 220);
rrOutline(45, 34);
rrOutline(15, 33);
if (currentMap === wave10) {
rrOutlineBig(27, 28, 8, 8);
}
rSetDrawColor(127, 127, 127, 255);
rrFillItem(32, 42);
}
function drawOverlays() {
if (currentMap === inferno) {
rSetDrawColor(240, 20, 20, 255);
rrOutlineBig(18, 18, 2, 2);
rrOutlineBig(18, 18, 3, 3);
rrOutlineBig(18, 18, 4, 4);
rrOutlineBig(22, 23, 2, 2);
rrOutlineBig(22, 23, 3, 3);
rrOutlineBig(22, 23, 4, 4);
rrOutlineBig(32, 18, 2, 2);
rrOutlineBig(32, 18, 3, 3);
rrOutlineBig(32, 18, 4, 4);
rrOutlineBig(40, 21, 2, 2);
rrOutlineBig(40, 21, 3, 3);
rrOutlineBig(40, 21, 4, 4);
rrOutlineBig(33, 29, 2, 2);
rrOutlineBig(33, 29, 3, 3);
rrOutlineBig(33, 29, 4, 4);
rrOutlineBig(40, 34, 2, 2);
rrOutlineBig(40, 34, 3, 3);
rrOutlineBig(40, 34, 4, 4);
rrOutlineBig(39, 41, 2, 2);
rrOutlineBig(39, 41, 3, 3);
rrOutlineBig(39, 41, 4, 4);
rrOutlineBig(18, 41, 2, 2);
rrOutlineBig(18, 41, 3, 3);
rrOutlineBig(18, 41, 4, 4);
rrOutlineBig(20, 35, 2, 2);
rrOutlineBig(20, 35, 3, 3);
rrOutlineBig(20, 35, 4, 4);
//zuk
rrOutlineBig(28, 52, 7, 7);
//nibblers
rSetDrawColor(0, 0, 255, 255);
rrOutlineBig(25, 33, 3, 3);
return;
}
if (currentMap !== wave1to9 ) {
return;
}
// Spawns and stuff
rSetDrawColor(240, 10, 10, 220);
if (currentMap === wave1to9) {
rrOutline(18, 45);
} else {
rrOutline(18, 46);
}
rrOutline(24, 47);
rrFill(33, 14);
rSetDrawColor(10, 10, 240, 220);
if (currentMap === wave1to9) {
rrOutline(36, 47);
} else {
rrOutline(42, 46);
}
rrFill(34, 14);
rSetDrawColor(10, 240, 10, 220);
if (currentMap === wave1to9) {
rrOutline(42, 45);
} else {
rrOutline(36, 47);
}
rrFill(35, 14);
rSetDrawColor(240, 240, 10, 220);
rrFill(36, 14);
}
function drawGrid() {
for (var xTile = 0; xTile < 64; ++xTile) {
if (xTile % 8 == 7) {
rSetDrawColor(0, 0, 0, 72);
} else {
rSetDrawColor(0, 0, 0, 48);
}
rrEastLineBig(xTile, 0, 64);
}
for (var yTile = 0; yTile < 64; ++yTile) {
if (yTile % 8 == 7) {
rSetDrawColor(0, 0, 0, 72);
} else {
rSetDrawColor(0, 0, 0, 48);
}
rrNorthLineBig(0, yTile, 64);
}
}
function drawMap() {
rSetDrawColor(206, 183, 117, 255);
rClear();
for (let y = 0; y < 64; ++y) {
for (let x = 0; x < 64; ++x) {
let tileFlag = getTileFlag(x, y);
if ((tileFlag & LOS_FULL_MASK) !== 0) {
rSetDrawColor(0, 0, 0, 255);
rrFillOpaque(x, y);
} else {
if ((tileFlag & MOVE_FULL_MASK) !== 0) {
rSetDrawColor(127, 127, 127, 255);
rrFillOpaque(x, y);
}
if ((tileFlag & LOS_EAST_MASK) !== 0) {
rSetDrawColor(0, 0, 0, 255);
rrEastLine(x, y);
} else if ((tileFlag & MOVE_EAST_MASK) !== 0) {
rSetDrawColor(127, 127, 127, 255);
rrEastLine(x, y);
}
if ((tileFlag & LOS_WEST_MASK) !== 0) {
rSetDrawColor(0, 0, 0, 255);
rrWestLine(x, y);
} else if ((tileFlag & MOVE_WEST_MASK) !== 0) {
rSetDrawColor(127, 127, 127, 255);
rrWestLine(x, y);
}
if ((tileFlag & LOS_NORTH_MASK) !== 0) {
rSetDrawColor(0, 0, 0, 255);
rrNorthLine(x, y);
} else if ((tileFlag & MOVE_NORTH_MASK) !== 0) {
rSetDrawColor(127, 127, 127, 255);
rrNorthLine(x, y);
}
if ((tileFlag & LOS_SOUTH_MASK) !== 0) {
rSetDrawColor(0, 0, 0, 255);
rrSouthLine(x, y);
} else if ((tileFlag & MOVE_SOUTH_MASK) !== 0) {
rSetDrawColor(127, 127, 127, 255);
rrSouthLine(x, y);
}
}
}
}
}
function hasLineOfSight(x1, y1, x2, y2) {
if (mechanics == 0) {
var dx = x2 - x1;
var dxAbs = Math.abs(dx);
var dy = y2 - y1;
var dyAbs = Math.abs(dy);
if (dxAbs > dyAbs) {
var xTile = x1;
var y = y1 << 16;
var slope = Math.trunc((dy << 16) / dxAbs); // Integer division
var xInc;
var xMask;
if (dx > 0) {
xInc = 1;
xMask = LOS_WEST_MASK | LOS_FULL_MASK;
} else {
xInc = -1;
xMask = LOS_EAST_MASK | LOS_FULL_MASK;
}
var yMask;
y += 0x8000;
if (dy < 0) {
y -= 1; // For correct rounding
yMask = LOS_NORTH_MASK | LOS_FULL_MASK;
} else {
yMask = LOS_SOUTH_MASK | LOS_FULL_MASK;
}
while (xTile !== x2) {
xTile += xInc;
var yTile = y >>> 16;
if ((getTileFlag(xTile, yTile) & xMask) !== 0) {
return false;
}
y += slope;
var newYTile = y >>> 16;
if (newYTile !== yTile && (getTileFlag(xTile, newYTile) & yMask) !== 0) {
return false;
}
}
} else {
var yTile = y1;
var x = x1 << 16;
var slope = Math.trunc((dx << 16) / dyAbs); // Integer division
var yInc;
var yMask;
if (dy > 0) {
yInc = 1;
yMask = LOS_SOUTH_MASK | LOS_FULL_MASK;
} else {
yInc = -1;
yMask = LOS_NORTH_MASK | LOS_FULL_MASK;
}
var xMask;
x += 0x8000;
if (dx < 0) {
x -= 1; // For correct rounding
xMask = LOS_EAST_MASK | LOS_FULL_MASK;
} else {
xMask = LOS_WEST_MASK | LOS_FULL_MASK;
}
while (yTile !== y2) {
yTile += yInc;
var xTile = x >>> 16;
if ((getTileFlag(xTile, yTile) & yMask) !== 0) {
return false;
}
x += slope;
var newXTile = x >>> 16;
if (newXTile !== xTile && (getTileFlag(newXTile, yTile) & xMask) !== 0) {
return false;
}
}
}
return true;
}
else if (mechanics == 1) {
var dx = x2 - x1;
var dxAbs = Math.abs(dx);
var dy = y2 - y1;
var dyAbs = Math.abs(dy);
xTile = x1;
yTile = y1;
if (dy > 0) {
yMask = LOS_SOUTH_MASK | LOS_FULL_MASK;
} else {
yMask = LOS_NORTH_MASK | LOS_FULL_MASK;
}
if (dx < 0) {
xMask = LOS_EAST_MASK | LOS_FULL_MASK;
} else {
xMask = LOS_WEST_MASK | LOS_FULL_MASK;
}
while ((yTile !== y2) || (xTile !== x2)) {
var xTileNew=xTile+Math.sign(dx);
var yTileNew=yTile+Math.sign(dy);
reldist=distancetoslope(x1,y1,x2,y2,xTile,yTileNew)-distancetoslope(x1,y1,x2,y2,xTileNew,yTile);
if (Math.abs(reldist)==0) {
/*if (xTileNew === xTile) {
if ((getTileFlag(xTileNew, yTile) & xMask) !== 0) {
return false;
}
} else if (yTileNew === yTile) {
if ((getTileFlag(xTile, yTileNew) & yMask) !== 0) {
return false;
}
} else {
if (((getTileFlag(xTileNew, yTileNew) & xMask) !== 0)||((getTileFlag(xTileNew, yTileNew) & yMask) !== 0)) {
return false;
}
}*/
if (((((getTileFlag(xTile, yTileNew) & yMask) !== 0)||((getTileFlag(xTileNew, yTile) & xMask) !== 0))||((getTileFlag(xTileNew, yTileNew) & xMask) !== 0))||((getTileFlag(xTileNew, yTileNew) & yMask) !== 0)) {
return false;
}
yTile=yTileNew
xTile=xTileNew
} else if (reldist<0) {
if ((getTileFlag(xTile, yTileNew) & yMask) !== 0) {
return false;
}
yTile=yTileNew;
} else {
if ((getTileFlag(xTileNew, yTile) & xMask) !== 0) {
return false;
}
xTile=xTileNew;
}
}
return true;
}
else {
if (x1 > x2) {
let tempX2 = x2, tempY2 = y2;
x2 = x1;
y2 = y1;
x1 = tempX2;
y1 = tempY2;
}
var dx = x2 - x1;
var dxAbs = Math.abs(dx);
var dy = y2 - y1;
var dyAbs = Math.abs(dy);
if (dxAbs > dyAbs) {
var xTile = x1;
var y = y1 << 16;
var slope = Math.trunc((dy << 16) / dxAbs); // Integer division
var xInc;
var xMask;
if (dx > 0) {
xInc = 1;
xMask = LOS_WEST_MASK | LOS_FULL_MASK;
} else {
xInc = -1;
xMask = LOS_EAST_MASK | LOS_FULL_MASK;
}
var yMask;
y += 0x8000;
if (dy < 0) {
y -= 1; // For correct rounding
yMask = LOS_NORTH_MASK | LOS_FULL_MASK;
} else {
yMask = LOS_SOUTH_MASK | LOS_FULL_MASK;
}
while (xTile !== x2) {
xTile += xInc;
var yTile = y >>> 16;
if ((getTileFlag(xTile, yTile) & xMask) !== 0) {
return false;
}
y += slope;
var newYTile = y >>> 16;
if (newYTile !== yTile && (getTileFlag(xTile, newYTile) & yMask) !== 0) {
return false;
}
}
} else if (dxAbs < dyAbs) {
var yTile = y1;
var x = x1 << 16;
var slope = Math.trunc((dx << 16) / dyAbs); // Integer division
var yInc;
var yMask;
if (dy > 0) {
yInc = 1;
yMask = LOS_SOUTH_MASK | LOS_FULL_MASK;
} else {
yInc = -1;
yMask = LOS_NORTH_MASK | LOS_FULL_MASK;
}
var xMask;
x += 0x8000;
if (dx < 0) {
x -= 1; // For correct rounding
xMask = LOS_EAST_MASK | LOS_FULL_MASK;
} else {
xMask = LOS_WEST_MASK | LOS_FULL_MASK;
}
while (yTile !== y2) {
yTile += yInc;
var xTile = x >>> 16;
if ((getTileFlag(xTile, yTile) & yMask) !== 0) {
return false;
}
x += slope;
var newXTile = x >>> 16;
if (newXTile !== xTile && (getTileFlag(newXTile, yTile) & xMask) !== 0) {
return false;
}
}
} else {
var yTile = y1;
var xTile = x1
var slope = Math.trunc((dx << 16) / dyAbs); // Integer division
var yInc;
var yMask;
if (dy > 0) {
yInc = 1;
yMask = LOS_SOUTH_MASK | LOS_FULL_MASK;
} else {
yInc = -1;
yMask = LOS_NORTH_MASK | LOS_FULL_MASK;
}
var xMask;
var xInc;
if (dx < 0) {
xInc = -1;
xMask = LOS_EAST_MASK | LOS_FULL_MASK;
} else {
xInc = 1;
xMask = LOS_WEST_MASK | LOS_FULL_MASK;
}
while (yTile !== y2) {
if ((((getTileFlag(xTile, yTile+yInc) & yMask) !== 0)||((getTileFlag(xTile+xInc, yTile+yInc) & xMask) !== 0))&&(((getTileFlag(xTile+xInc, yTile) & xMask) !== 0)||((getTileFlag(xTile+xInc, yTile+yInc) & yMask) !== 0))) {
return false;
}
xTile += xInc;
yTile += yInc;
if (newXTile !== xTile && (getTileFlag(newXTile, yTile) & xMask) !== 0) {
return false;
}
}
}
return true;
}
}
function distancetoslope(x1,y1,x2,y2,xTile,yTile) {
var dx=x2-x1;
var dy=y2-y1;
return Math.abs(dy*xTile-dx*yTile+x2*y1-y2*x1)/Math.sqrt(dy*dy+dx*dx);
}
//old:function distancetoslope(x1,y1,x2,y2,xTile,yTile) {
// var dx=x2-x1;
// var dy=y2-y1;
// var dxAbs = Math.abs(dx);
// var dyAbs = Math.abs(dy);
// if (dxAbs>dyAbs) {
// slope=Math.trunc((dy << 16) / dx); // Integer division
// return Math.abs(((yTile-y1)<<16)-slope*(xTile-x1));
// } else {
// slope=Math.trunc((dx << 16) / dy); // Integer division
// return Math.abs(((xTile-x1)<<16)-slope*(yTile-y1));
// }
//}
//{ RsRenderer - rr
function rrInit(tileSize) {
rrTileSize = tileSize;
}
function rrSetTileSize(size) {
rrTileSize = size;
}
function rrSetSize(widthTiles, heightTiles) {
rrWidthTiles = widthTiles;
rrHeightTiles = heightTiles;
rResizeCanvas(rrTileSize*rrWidthTiles, rrTileSize*rrHeightTiles);
}
function rrFillOpaque(x, y) {
rSetFilledRect(x*rrTileSize, y*rrTileSize, rrTileSize, rrTileSize);
}
function rrFill(x, y) {
rDrawFilledRect(x*rrTileSize, y*rrTileSize, rrTileSize, rrTileSize);
}
function rrFillBig(x, y, width, height) {
rDrawFilledRect(x*rrTileSize, y*rrTileSize, width*rrTileSize, height*rrTileSize);
}
function rrOutline(x, y) {
rDrawOutlinedRect(x*rrTileSize, y*rrTileSize, rrTileSize, rrTileSize);
}
function rrOutlineBig(x, y, width, height) {
rDrawOutlinedRect(x*rrTileSize, y*rrTileSize, rrTileSize*width, rrTileSize*height);
}
function rrWestLine(x, y) {
rDrawVerticalLine(x*rrTileSize, y*rrTileSize, rrTileSize);
}
function rrWestLineBig(x, y, length) {
rDrawHorizontalLine(x*rrTileSize, y*rrTileSize, rrTileSize*length)
}
function rrEastLine(x, y) {
rDrawVerticalLine((x + 1)*rrTileSize - 1, y*rrTileSize, rrTileSize);
}
function rrEastLineBig(x, y, length) {
rDrawVerticalLine((x + 1)*rrTileSize - 1, y*rrTileSize, rrTileSize*length);
}
function rrSouthLine(x, y) {
rDrawHorizontalLine(x*rrTileSize, y*rrTileSize, rrTileSize);
}
function rrSouthLineBig(x, y, length) {
rDrawHorizontalLine(x*rrTileSize, y*rrTileSize, rrTileSize*length);
}
function rrNorthLine(x, y) {
rDrawHorizontalLine(x*rrTileSize, (y + 1)*rrTileSize - 1, rrTileSize);
}
function rrNorthLineBig(x, y, length) {
rDrawHorizontalLine(x*rrTileSize, (y + 1)*rrTileSize - 1, rrTileSize*length);
}
function rrCone(x, y) {
rDrawCone(x*rrTileSize, y*rrTileSize, rrTileSize);
}
function rrFillItem(x, y) {
let padding = rrTileSize >>> 2;
let size = rrTileSize - 2*padding;
rDrawFilledRect(x*rrTileSize + padding, y*rrTileSize + padding, size, size);
}
var rrTileSize;
//}
//{ Renderer - r
const rPIXEL_ALPHA = 255 << 24;
function rInit(canvas, width, height) {
rCanvas = canvas;
rContext = canvas.getContext("2d");
rResizeCanvas(width, height);
rSetDrawColor(255, 255, 255, 255);
}
function rResizeCanvas(width, height) {
rCanvas.width = width;
rCanvas.height = height;
rCanvasWidth = width;
rCanvasHeight = height;
rCanvasYFixOffset = (rCanvasHeight - 1)*rCanvasWidth;
rImageData = rContext.createImageData(width, height);
rPixels = new ArrayBuffer(rImageData.data.length);
rPixels8 = new Uint8ClampedArray(rPixels);
rPixels32 = new Uint32Array(rPixels);
}
function rSetDrawColor(r, g, b, a) {
rDrawColorRB = r | (b << 16);
rDrawColorG = rPIXEL_ALPHA | (g << 8);
rDrawColor = rDrawColorRB | rDrawColorG;
rDrawColorA = a + 1;
}
function rClear() {
let endI = rPixels32.length;
for (let i = 0; i < endI; ++i) {
rPixels32[i] = rDrawColor;
}
}
function rPresent() {
rImageData.data.set(rPixels8);
rContext.putImageData(rImageData, 0, 0);
}
function rDrawPixel(i) {
let color = rPixels32[i];
let oldRB = color & 0xFF00FF;
let oldAG = color & 0xFF00FF00;
let rb = oldRB + (rDrawColorA*(rDrawColorRB - oldRB) >> 8) & 0xFF00FF;
let g = oldAG + (rDrawColorA*(rDrawColorG - oldAG) >> 8) & 0xFF00FF00;
rPixels32[i] = rb | g;
}
function rDrawHorizontalLine(x, y, length) {
let i = rXYToI(x, y)
let endI = i + length;
for (; i < endI; ++i) {
rDrawPixel(i);
}
}
function rDrawVerticalLine(x, y, length) {
let i = rXYToI(x, y);
let endI = i - length*rCanvasWidth;
for (; i > endI; i -= rCanvasWidth) {
rDrawPixel(i);
}
}
function rSetFilledRect(x, y, width, height) {
let i = rXYToI(x, y);
let rowDelta = width + rCanvasWidth;
let endYI = i - height*rCanvasWidth;
while (i > endYI) {
let endXI = i + width;
for (; i < endXI; ++i) {
rPixels32[i] = rDrawColor;
}
i -= rowDelta;
}
}
function rDrawFilledRect(x, y, width, height) {
let i = rXYToI(x, y);
let rowDelta = width + rCanvasWidth;
let endYI = i - height*rCanvasWidth;
while (i > endYI) {
let endXI = i + width;
for (; i < endXI; ++i) {
rDrawPixel(i);
}
i -= rowDelta;
}
}
function rDrawOutlinedRect(x, y, width, height) {
rDrawHorizontalLine(x, y, width);
rDrawHorizontalLine(x, y + height - 1, width);
rDrawVerticalLine(x, y + 1, height - 2);
rDrawVerticalLine(x + width - 1, y + 1, height - 2);
}
function rDrawCone(x, y, width) { // Not optimised to use i yet
let lastX = x + width - 1;
let endI = (width >>> 1) + (width & 1);
for (let i = 0; i < endI; ++i) {
rDrawPixel(rXYToI(x + i, y));
rDrawPixel(rXYToI(lastX - i, y));
++y;
}
}
function rXYToI(x, y) {
return rCanvasYFixOffset + x - y*rCanvasWidth;
}
var rCanvas;
var rCanvasWidth;
var rCanvasHeight;
var rCanvasYFixOffset;
var rContext;
var rImageData;
var rPixels;
var rPixels8;
var rPixels32;
var rDrawColor;
var rDrawColorRB;
var rDrawColorG;
var rDrawColorA;
//}
</script>
</head><body onload="start()">
<center>
<button onclick="increaseSize()">Increase size</button>
<button onclick="decreaseSize()">Decrease size</button><br>
<br>
<label><input type="radio" name="map" onclick="setWave10()" checked="">Empty</label>
<label><input type="radio" name="map" onclick="setInferno()">Inferno</label><br>
<br>
<label><input type="radio" name="mechanics" onclick="setMechanics(0)" checked="">Current mechanics</label>
<label><input type="radio" name="mechanics" onclick="setMechanics(2)">New mechanics</label>
<label><input type="radio" name="mechanics" onclick="setMechanics(1)">GeChallengeM's mechanics</label>
<br><br>
<label><input type="radio" name="action" onclick="setAction(1)" checked="">Place player/NPC</label>
<label><input type="radio" name="action" onclick="setAction(0)">Place empty tile</label>
<label><input type="radio" name="action" onclick="setAction(0x20000)">Place full blocking</label>
<label><input type="radio" name="action" onclick="setAction(0x1000)">Place east wall</label>
<label><input type="radio" name="action" onclick="setAction(0x10000)">Place west wall</label>
<label><input type="radio" name="action" onclick="setAction(0x400)">Place north wall</label>
<label><input type="radio" name="action" onclick="setAction(0x4000)">Place south wall</label>
<br><br>
<!--
<label><input type="radio" name="lostype" onclick="setLOSCheckType(0)">Check LOS for Runner</label><br>
-->
<label><input type="radio" name="lostype" onclick="setLOSCheckType(1)" checked="">Check LOS for Player with range </label>
<input type="number" id="playerrange" min="0" max="64" value="10" oninput="onPlayerRangeChanged()"><br>
<label><input type="radio" name="lostype" onclick="setLOSCheckType(2)">Check LOS for NPC with size </label>
<input type="number" id="npcsize" min="1" max="64" value="1" oninput="onNpcSizeChanged()"><br>
<canvas id="loscanvas" width="832" height="832"></canvas>
<br>
<a href="https://henke96.github.io/Lineofsight/">Edited tool; original tool was made by henke96.</a>
</center>
</body></html>